function Path () { Module.call(this, 'path', 'Trace lines and draw shapes.') this.settings = { cap: 'square' } this.methods.stroke = new Method('stroke', 'x,y&', '', function (q) { ronin.preview.clear() var path = ronin.path.create_path(q) var ctx = ronin.cursor.target.context() ctx.beginPath() ctx.lineCap = ronin.path.settings.cap ctx.lineWidth = ronin.cursor.size ctx.strokeStyle = ronin.cursor.color ctx.stroke(new Path2D(path)) ctx.closePath() }) this.methods.fill = new Method('fill', 'x,y&', '', function (q) { ronin.preview.clear() var path = ronin.path.create_path(q) var ctx = ronin.cursor.target.context() ctx.beginPath() ctx.lineCap = ronin.path.settings.cap ctx.lineWidth = ronin.cursor.size ctx.fillStyle = ronin.cursor.color ctx.fill(new Path2D(path)) ctx.closePath() }) this.methods.svg = new Method('svg', 'M0,0 L100,100', '', function (q) { var path = ronin.commander.query().raw.replace('svg:', '').trim() var ctx = ronin.cursor.target.context() ctx.beginPath() ctx.lineCap = ronin.path.settings.cap ctx.lineWidth = ronin.cursor.size ctx.strokeStyle = ronin.cursor.color ctx.stroke(new Path2D(path)) ctx.closePath() }) this.preview = function (q) { if (!q.methods.stroke) { return } ronin.preview.clear() var path = ronin.path.create_path(q.methods.stroke) var ctx = ronin.preview.context() ctx.beginPath() ctx.lineCap = ronin.path.settings.cap ctx.lineWidth = ronin.cursor.size ctx.strokeStyle = ronin.cursor.color ctx.stroke(new Path2D(path)) ctx.closePath() } this.create_path = function (q_array) { var svg_path = '' var prev = { x: 0, y: 0 } for (q_id in q_array) { var coord = q_array[q_id] if (!coord.x || !coord.y) { continue } coord.x *= 2; coord.y *= 2 if (svg_path == '') { var origin = { x: coord.x, y: coord.y } svg_path += 'M' + (coord.x) + ',' + (coord.y) + ' ' } else if (coord.clockwise == true) { var offset = make_offset(coord, prev) svg_path += 'a' + (offset.x) + ',' + (offset.y) + ' 0 0,1 ' + (offset.x) + ',' + (offset.y) } else if (coord.clockwise == false) { var offset = make_offset(coord, prev) svg_path += 'a' + (offset.x) + ',' + (offset.y) + ' 0 0,0 ' + (offset.x) + ',' + (offset.y) } else { var offset = make_offset(coord, prev) svg_path += 'l' + (offset.x) + ',' + (offset.y) + ' ' } prev = coord } return svg_path } function make_offset (a, b) { return { x: a.x - b.x, y: a.y - b.y } } }