diff --git a/web/app/sketcher/shapes/origin.js b/web/app/sketcher/shapes/origin.js deleted file mode 100644 index f055d399..00000000 --- a/web/app/sketcher/shapes/origin.js +++ /dev/null @@ -1,82 +0,0 @@ -/** @constructor */ -export function ReferencePointTool(viewer) { - this.viewer = viewer; -} - -ReferencePointTool.prototype.keydown = function(e) {}; -ReferencePointTool.prototype.keypress = function(e) {}; -ReferencePointTool.prototype.keyup = function(e) {}; - -ReferencePointTool.prototype.restart = function(e) { - this.sendMessage('specify point'); -}; - -ReferencePointTool.prototype.sendMessage = function(text) { - this.viewer.bus.notify('tool-message', text); -}; - -ReferencePointTool.prototype.cleanup = function(e) { - this.viewer.cleanSnap(); -}; - -ReferencePointTool.prototype.mousemove = function(e) { - var p = this.viewer.screenToModel(e); - this.viewer.snap(p.x, p.y, []); - this.viewer.refresh(); -}; - -ReferencePointTool.prototype.mouseup = function(e) { -}; - -ReferencePointTool.prototype.mousedown = function(e) { - const needSnap = this.viewer.snapped.length != 0; - let p = needSnap ? this.viewer.snapped.pop() : this.viewer.screenToModel(e); - this.viewer.referencePoint.x = p.x; - this.viewer.referencePoint.y = p.y; - this.sendMessage(p.x + ', ' + p.y); - this.viewer.refresh(); - this.viewer.toolManager.releaseControl(); -}; - -ReferencePointTool.prototype.mousewheel = function(e) { -}; - -ReferencePointTool.prototype.processCommand = function(command) { - var referencePoint = this.viewer.referencePoint; - let result = ParseVector(referencePoint, command); - if(typeof result === 'string') { - return result; - } - referencePoint.x += result.x; - referencePoint.y += result.y; - this.viewer.refresh(); - this.viewer.toolManager.releaseControl(); - -}; - -const VECTOR_PATTERNS = /^(@)?(.+)(,|<)(.+)$/; - -function ParseVector(referencePoint, command) { - command = command.replace(/\s+/g, ''); - - const match = command.match(VECTOR_PATTERNS); - if (match) { - const ref = !match[1]; - let x = parseFloat(eval(match[2])); - if (isNaN(x)) return "wrong input for number: " + match[2]; - const polar = match[3] == '<'; - let y = parseFloat(eval(match[4])); - if (isNaN(y)) return "wrong input for number: " + match[4]; - if (polar) { - y = y * Math.sin(x); - x = x * Math.cos(x); - } - if (ref) { - x += referencePoint.x; - y += referencePoint.y; - } - return {x, y}; - } - - return "wrong input, point is expected: x,y | @x,y | r { var tool = this.viewer.toolManager.tool; this.terminalHandler = tool.processCommand; - }); + $('.tool-info').text('tool: ' + tool.name); + })(); this.viewer.bus.subscribe('tool-message', (message) => { this.terminal.print(message); + $('.tool-message').text(': ' + message); }); }; diff --git a/web/app/sketcher/tools/origin.js b/web/app/sketcher/tools/origin.js new file mode 100644 index 00000000..a7825532 --- /dev/null +++ b/web/app/sketcher/tools/origin.js @@ -0,0 +1,46 @@ +import {Tool} from './tool' + +export class ReferencePointTool extends Tool { + + constructor(viewer) { + super('origin', viewer); + } + + restart() { + this.sendMessage('specify point', false); + }; + + cleanup(e) { + this.viewer.cleanSnap(); + }; + + mousemove(e) { + var p = this.viewer.screenToModel(e); + this.viewer.snap(p.x, p.y, []); + this.viewer.refresh(); + }; + + mousedown(e) { + const needSnap = this.viewer.snapped.length != 0; + let p = needSnap ? this.viewer.snapped.pop() : this.viewer.screenToModel(e); + this.viewer.referencePoint.x = p.x; + this.viewer.referencePoint.y = p.y; + this.sendMessage(p.x + ', ' + p.y); + this.viewer.refresh(); + this.viewer.toolManager.releaseControl(); + }; + + processCommand(command) { + var referencePoint = this.viewer.referencePoint; + let result = Tool.ParseVector(referencePoint, command); + if(typeof result === 'string') { + return result; + } + referencePoint.x += result.x; + referencePoint.y += result.y; + this.viewer.refresh(); + this.viewer.toolManager.releaseControl(); + }; +} + + diff --git a/web/app/sketcher/tools/point.js b/web/app/sketcher/tools/point.js new file mode 100644 index 00000000..b0413cc1 --- /dev/null +++ b/web/app/sketcher/tools/point.js @@ -0,0 +1,19 @@ +import {EndPoint} from '../viewer2d' +import {Tool} from './tool' + +export class AddPointTool extends Tool{ + + constructor(viewer) { + super('point', viewer); + } + + mouseup(e) { + this.viewer.historyManager.checkpoint(); + var a = this.viewer.screenToModel(e); + var p = new EndPoint(a.x, a.y); + var layer = this.viewer.activeLayer; + layer.objects.push(p); + p.layer = layer; + this.viewer.refresh(); + }; +} diff --git a/web/app/sketcher/tools/segment.js b/web/app/sketcher/tools/segment.js new file mode 100644 index 00000000..106685c6 --- /dev/null +++ b/web/app/sketcher/tools/segment.js @@ -0,0 +1,87 @@ +import {Tool} from './tool' + +export class AddSegmentTool extends Tool { + + constructor(viewer, multi) { + super(multi ? "multi line" : "line", viewer); + this.line = null; + this.multi = multi; + } + + restart(e) { + this.sendMessage('specify the first point') + } + + cleanup() { + this.viewer.cleanSnap(); + this.line = null; + } + + + mousemove(e) { + var p = this.viewer.screenToModel(e); + if (this.line != null) { + this.viewer.snap(p.x, p.y, [this.line.a, this.line.b]); + this.line.b.x = p.x; + this.line.b.y = p.y; + this.viewer.refresh(); + } else { + this.viewer.snap(p.x, p.y, []); + this.viewer.refresh(); + } + } + + mouseup(e) { + if (this.line == null) { + const b = this.viewer.screenToModel(e); + var a = b; + var needSnap = false; + if (this.viewer.snapped.length != 0) { + a = this.viewer.snapped.pop(); + this.viewer.cleanSnap(); + needSnap = true; + } + this.line = this.viewer.addSegment(a.x, a.y, b.x, b.y, this.viewer.activeLayer); + if (needSnap) { + this.viewer.parametricManager.linkObjects([this.line.a, a]); + } + this.sendMessage('specify ' + (this.multi ? 'next' : 'end') +' point'); + this.viewer.refresh(); + } else { + if (this.viewer.snapped.length != 0) { + var p = this.viewer.snapped.pop(); + this.viewer.cleanSnap(); + this.line.b.x = p.x; + this.line.b.y = p.y; + this.viewer.parametricManager.linkObjects([this.line.b, p]); + this.viewer.refresh(); + } + if (this.multi) { + const b = this.line.b; + this.line = this.viewer.addSegment(b.x, b.y, b.x, b.y, this.viewer.activeLayer); + this.viewer.parametricManager.linkObjects([this.line.a, b]); + } else { + this.line = null; + } + } + } + + dblclick(e) { + this.cancelSegment(); + } + + keydown(e) { + if (e.keyCode == 27) { + this.cancelSegment(); + } + } + + cancelSegment() { + if (this.multi && this.line != null) { + this.viewer.remove(this.line); + this.viewer.refresh(); + this.cleanup(null); + } + } +} + diff --git a/web/app/sketcher/tools/tool.js b/web/app/sketcher/tools/tool.js new file mode 100644 index 00000000..b094e9da --- /dev/null +++ b/web/app/sketcher/tools/tool.js @@ -0,0 +1,61 @@ + +export class Tool { + + constructor(name, viewer) { + this.name = name; + this.viewer = viewer; + } + + restart() {}; + + cleanup() {}; + + mousemove(e) {}; + + mousedown(e) {}; + + mouseup(e) {}; + + dblclick(e) {}; + + mousewheel(e) {}; + + keydown(e) {}; + + keypress(e) {}; + + keyup(e) {}; + + sendMessage(text) { + this.viewer.bus.notify('tool-message', text); + }; +} + +const VECTOR_PATTERNS = /^(@)?(.+)(,|<)(.+)$/; + +Tool.ParseVector = function(referencePoint, command) { + command = command.replace(/\s+/g, ''); + + const match = command.match(VECTOR_PATTERNS); + if (match) { + const ref = match[1] !== undefined; + let x = parseFloat(eval(match[2])); + if (isNaN(x)) return "wrong input for number: " + match[2]; + const polar = match[3] == '<'; + let y = parseFloat(eval(match[4])); + if (isNaN(y)) return "wrong input for number: " + match[4]; + if (polar) { + y = y * Math.sin(x); + x = x * Math.cos(x); + } + if (ref) { + x += referencePoint.x; + y += referencePoint.y; + } + return {x, y}; + } + + return "wrong input, point is expected: x,y | @x,y | r -
+
+
@@ -69,7 +70,8 @@
-
+
0.000:0.000
+