From 939b93410eec778e8902ccdaa1447919dbab6bc2 Mon Sep 17 00:00:00 2001 From: Val Erastov Date: Wed, 30 Nov 2016 22:50:37 -0800 Subject: [PATCH] fix snapping for ellipse / alternate default tool for a shape --- web/app/sketcher/shapes/ellipse.js | 12 ++++++++++ web/app/sketcher/shapes/sketch-object.js | 9 ++++++++ web/app/sketcher/tools/arc.js | 9 -------- web/app/sketcher/tools/drag.js | 4 ++-- web/app/sketcher/tools/ellipse.js | 28 ++++++++++++++---------- web/app/sketcher/tools/pan.js | 2 +- web/app/sketcher/tools/tool.js | 9 ++++++++ 7 files changed, 49 insertions(+), 24 deletions(-) diff --git a/web/app/sketcher/shapes/ellipse.js b/web/app/sketcher/shapes/ellipse.js index 0579f52e..6ba895fd 100644 --- a/web/app/sketcher/shapes/ellipse.js +++ b/web/app/sketcher/shapes/ellipse.js @@ -1,5 +1,6 @@ import {Ref} from './ref' import {SketchObject} from './sketch-object' +import {EllipseTool, STATE_RADIUS} from '../tools/ellipse' import * as math from '../../math/math'; @@ -61,6 +62,17 @@ export class Ellipse extends SketchObject { static findMinorRadius(majorRadius, pntRadius, pntAngle) { return Math.abs( Math.sin(pntAngle) / Math.sqrt(1 / sq(pntRadius) - sq(Math.cos(pntAngle) / majorRadius)) ); } + + getDefaultTool(viewer, alternative) { + if (alternative) { + return super.getDefaultTool(viewer, alternative); + } else { + const editTool = new EllipseTool(viewer); + editTool.ellipse = this; + editTool.state = STATE_RADIUS; + return editTool; + } + } } Ellipse.prototype._class = 'TCAD.TWO.Ellipse'; diff --git a/web/app/sketcher/shapes/sketch-object.js b/web/app/sketcher/shapes/sketch-object.js index 28937aca..ec6ffbbd 100644 --- a/web/app/sketcher/shapes/sketch-object.js +++ b/web/app/sketcher/shapes/sketch-object.js @@ -73,6 +73,15 @@ export class SketchObject { } this._translate(dx, dy, {}); } + + translateImpl(dx, dy) { + this.accept(function (obj) { + if (obj._class === 'TCAD.TWO.EndPoint') { + obj.translate(dx, dy); + } + return true; + }); + } draw(ctx, scale, viewer) { if (!this.visible) return; diff --git a/web/app/sketcher/tools/arc.js b/web/app/sketcher/tools/arc.js index c7950c03..6a267288 100644 --- a/web/app/sketcher/tools/arc.js +++ b/web/app/sketcher/tools/arc.js @@ -84,15 +84,6 @@ export class AddArcTool extends Tool { this.viewer.toolManager.releaseControl(); } - snapIfNeed(p) { - if (this.viewer.snapped != null) { - var snapWith = this.viewer.snapped; - this.viewer.cleanSnap(); - this.viewer.parametricManager.linkObjects([p, snapWith]); - this.viewer.parametricManager.refresh(); - } - } - demoSecondPoint() { const r = this.radiusOfFirstPoint(); let ang = Math.atan2(this.arc.a.y - this.arc.c.y, this.arc.a.x - this.arc.c.x) + (2 * Math.PI - 0.3); diff --git a/web/app/sketcher/tools/drag.js b/web/app/sketcher/tools/drag.js index c6d67a14..ce6dc10c 100644 --- a/web/app/sketcher/tools/drag.js +++ b/web/app/sketcher/tools/drag.js @@ -2,7 +2,7 @@ import {Tool} from './tool' import {optim} from '../../math/optim' import * as math from '../../math/math' -export class DragTool extends Tool{ +export class DragTool extends Tool { constructor(obj, viewer) { super('drag', viewer); @@ -23,7 +23,7 @@ export class DragTool extends Tool{ this.lockedValues[i + 1] = this._point.y - this.lockedShifts[i + 1]; } this.solver.updateLock(this.lockedValues); - if (!e.altKey && !e.ctrlKey) { + if (!e.ctrlKey) { this.solveRequest(true); } else { this.obj.translate(dx, dy); diff --git a/web/app/sketcher/tools/ellipse.js b/web/app/sketcher/tools/ellipse.js index 50c780e8..2a7578f4 100644 --- a/web/app/sketcher/tools/ellipse.js +++ b/web/app/sketcher/tools/ellipse.js @@ -3,12 +3,12 @@ import {EndPoint} from '../shapes/point' import {Ellipse} from '../shapes/ellipse' import Vector from '../../math/vector' -const STATE_POINT1 = 0; -const STATE_POINT2 = 1; -const RADIUS = 2; +export const STATE_POINT1 = 0; +export const STATE_POINT2 = 1; +export const STATE_RADIUS = 2; export class EllipseTool extends Tool { - + constructor(viewer) { super('ellipse', viewer); this.ellipse = null; @@ -21,6 +21,10 @@ export class EllipseTool extends Tool { this.sendHint('specify first major axis point') } + cleanup(e) { + this.viewer.cleanSnap(); + } + point(e) { return this.viewer.snapped ? this.viewer.snapped : this.viewer.screenToModel(e); } @@ -30,21 +34,23 @@ export class EllipseTool extends Tool { case STATE_POINT1: { const p = this.point(e); this.ellipse = new Ellipse(new EndPoint(p.x, p.y), new EndPoint(p.x, p.y)); + this.snapIfNeed(this.ellipse.ep1); this.viewer.activeLayer.objects.push(this.ellipse); this.viewer.refresh(); this.state = STATE_POINT2; - this.sendHint('specify second major axis point') + this.sendHint('specify second major axis point'); break; } case STATE_POINT2: { const p = this.point(e); this.ellipse.ep2.setFromPoint(p); + this.snapIfNeed(this.ellipse.ep2); this.viewer.refresh(); - this.state = RADIUS; - this.sendHint('specify minor axis radius') + this.state = STATE_RADIUS; + this.sendHint('specify minor axis radius'); break; } - case RADIUS: + case STATE_RADIUS: this.viewer.toolManager.releaseControl(); } } @@ -58,9 +64,9 @@ export class EllipseTool extends Tool { case STATE_POINT2: this.ellipse.ep2.setFromPoint(this.viewer.screenToModel(e)); this.ellipse.r.value = this.ellipse.radiusX * 0.5; - this.viewer.snap(p.x, p.y, [this.ellipse.ep1]); + this.viewer.snap(p.x, p.y, [this.ellipse.ep1, this.ellipse.ep2]); break; - case RADIUS: + case STATE_RADIUS: const polarPoint = this.ellipse.toEllipseCoordinateSystem(p); let minorRadius = Ellipse.findMinorRadius(this.ellipse.radiusX, polarPoint.radius, polarPoint.angle); if (isNaN(minorRadius)) { @@ -74,6 +80,4 @@ export class EllipseTool extends Tool { } this.viewer.refresh(); } - - } \ No newline at end of file diff --git a/web/app/sketcher/tools/pan.js b/web/app/sketcher/tools/pan.js index 20d5b996..4628465e 100644 --- a/web/app/sketcher/tools/pan.js +++ b/web/app/sketcher/tools/pan.js @@ -57,7 +57,7 @@ export class PanTool extends Tool { } this.viewer.select([toSelect], true); if (!toSelect.isAuxOrLinkedTo()) { - var tool = toSelect.getDefaultTool(this.viewer); + var tool = toSelect.getDefaultTool(this.viewer, e.altKey); tool.mousedown(e); this.viewer.toolManager.switchTool(tool); } diff --git a/web/app/sketcher/tools/tool.js b/web/app/sketcher/tools/tool.js index 51e988d3..3d90088b 100644 --- a/web/app/sketcher/tools/tool.js +++ b/web/app/sketcher/tools/tool.js @@ -41,6 +41,15 @@ export class Tool { this.viewer.referencePoint.x = x; this.viewer.referencePoint.y = y; }; + + snapIfNeed(p) { + if (this.viewer.snapped != null) { + var snapWith = this.viewer.snapped; + this.viewer.cleanSnap(); + this.viewer.parametricManager.linkObjects([p, snapWith]); + this.viewer.parametricManager.refresh(); + } + } } Tool.ParseNumber = function(str) {