diff --git a/web/app/canvas.js b/web/app/canvas.js index 954dc22b..6285d6f5 100644 --- a/web/app/canvas.js +++ b/web/app/canvas.js @@ -25,6 +25,12 @@ TCAD.TWO.Styles = { lineWidth : 2, strokeStyle : "#00FF00", fillStyle : "#00FF00" + }, + + DIM : { + lineWidth : 1, + strokeStyle : "#bcffc1", + fillStyle : "#00FF00" } }; @@ -81,6 +87,9 @@ TCAD.TWO.Viewer = function(canvas) { this.snapped = []; this._setupServiceLayer(); + this.dimLayer = new TCAD.TWO.Layer("_dim", TCAD.TWO.Styles.DIM); + this.layers.push(this.dimLayer); + this.refresh(); }; @@ -115,7 +124,7 @@ TCAD.TWO.Viewer.prototype.remove = function(obj) { } }; -TCAD.TWO.Viewer.prototype.search = function(x, y, buffer, deep, onlyPoints) { +TCAD.TWO.Viewer.prototype.search = function(x, y, buffer, deep, onlyPoints, filter) { buffer *= 0.5; @@ -126,25 +135,33 @@ TCAD.TWO.Viewer.prototype.search = function(x, y, buffer, deep, onlyPoints) { var unreachable = buffer * 2; var heroLength = unreachable; // unreachable + function isFiltered(o) { + for (var i = 0; i < filter.length; ++i) { + if (filter[i] === o) return true; + } + return false; + } + for (var i = 0; i < this.layers.length; i++) { var objs = this.layers[i].objects; for (var j = 0; j < objs.length; j++) { var l = unreachable + 1; - var hit = !objs[j].acceptV(true, function(o) { + var before = pickResult.length; + objs[j].acceptV(true, function(o) { if (onlyPoints && o._class !== 'TCAD.TWO.EndPoint') { return false; } l = o.normalDistance(aim); - if (l >= 0 && l <= buffer) { + if (l >= 0 && l <= buffer && !isFiltered(o)) { pickResult.push(o); return false; } return true; }); - + var hit = before - pickResult.length != 0; if (hit) { if (!deep && pickResult.length != 0) return pickResult; - if (l < heroLength) { + if (l >= 0 && l < heroLength) { heroLength = l; heroIdx = pickResult.length - 1; } @@ -168,7 +185,6 @@ TCAD.TWO.Viewer.prototype._setupServiceLayer = function() { layer = new TCAD.TWO.Layer("_selection", TCAD.TWO.Styles.DEFAULT); layer.objects = this.selected; this._serviceLayers.push(layer); - }; TCAD.TWO.Viewer.prototype.refresh = function() { @@ -209,14 +225,9 @@ TCAD.TWO.Viewer.prototype.repaint = function() { TCAD.TWO.Viewer.prototype.snap = function(x, y, excl) { this.cleanSnap(); - var snapTo = this.search(x, y, 20 / this.scale, false, true); + var snapTo = this.search(x, y, 20 / this.scale, true, true, excl); if (snapTo.length > 0) { snapTo = snapTo[0]; - for (var i = 0; i < excl.length; i++) { - if (excl[i] === snapTo) { - return; - } - } this.mark(snapTo, TCAD.TWO.Styles.SNAP); this.snapped.push(snapTo); return snapTo; @@ -271,7 +282,7 @@ TCAD.TWO.Viewer.prototype.select = function(objs, exclusive) { TCAD.TWO.Viewer.prototype.pick = function(e) { var m = this.screenToModel(e); - return this.search(m.x, m.y, 20 / this.scale, true, false); + return this.search(m.x, m.y, 20 / this.scale, true, false, []); }; TCAD.TWO.Viewer.prototype.mark = function(obj, style) { diff --git a/web/app/main2d.js b/web/app/main2d.js index 6b57c5fe..a68a90d6 100644 --- a/web/app/main2d.js +++ b/web/app/main2d.js @@ -59,6 +59,10 @@ TCAD.App2D = function() { app.viewer.toolManager.releaseControl(); }); + this.registerAction('addDim', "Add Dimension", function () { + app.viewer.toolManager.takeControl(new TCAD.TWO.AddDimTool(app.viewer, app.viewer.dimLayer)); + }); + this.registerAction('save', "Save", function () { var sketch = {}; //sketch.boundary = boundary; diff --git a/web/app/sketch/dim.js b/web/app/sketch/dim.js new file mode 100644 index 00000000..61152669 --- /dev/null +++ b/web/app/sketch/dim.js @@ -0,0 +1,150 @@ + +TCAD.TWO.Dimension = function(a, b) { + TCAD.TWO.SketchObject.call(this); + this.a = a; + this.b = b; + this.flip = false; +}; + +TCAD.TWO.utils.extend(TCAD.TWO.Dimension, TCAD.TWO.SketchObject); + +TCAD.TWO.Dimension.prototype._class = 'TCAD.TWO.Dimension'; + +TCAD.TWO.Dimension.prototype.collectParams = function(params) { +}; + +TCAD.TWO.Dimension.prototype.getReferencePoint = function() { + return this.a; +}; + +TCAD.TWO.Dimension.prototype.translateImpl = function(dx, dy) { +}; + +TCAD.TWO.Dimension.prototype.drawImpl = function(ctx, scale) { + + var off = 30; + + var a = this.flip ? this.b : this.a; + var b = this.flip ? this.a : this.b; + + var d = TCAD.math.distanceAB(a, b); + + var _vx = - (b.y - a.y); + var _vy = b.x - a.x; + + //normalize + var _vxn = _vx / d; + var _vyn = _vy / d; + + _vx = _vxn * off; + _vy = _vyn * off; + + ctx.beginPath(); + + var _ax = a.x + _vx; + var _ay = a.y + _vy; + var _bx = b.x + _vx; + var _by = b.y + _vy; + + ctx.moveTo(_ax, _ay); + ctx.lineTo(_bx, _by); + + + function drawRef(a) { + ctx.moveTo(a.x, a.y); + var off2 = 1.2; + ctx.lineTo(a.x + _vx * off2, a.y + _vy * off2); + } + + drawRef(a); + drawRef(b); + + ctx.closePath(); + ctx.stroke(); + + function drawArrow(x, y) { + var s1 = 50; + var s2 = 20; + ctx.lineCap = 'round'; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x - s1, y - s2); + ctx.stroke(); + } + +// drawArrow(_ax, _ay); +// drawArrow(_bx, _by); + + ctx.font="12px Arial"; + var txt = d.toFixed(2); + var h = d / 2 - ctx.measureText(txt).width / 2; + + if (h > 0) { + var tx = _ax - (- _vyn) * h; + var ty = _ay - ( _vxn) * h; + ctx.save(); + ctx.translate(tx, ty); + ctx.fillText(txt ,0, 0); + ctx.restore(); + } + +}; + +TCAD.TWO.Dimension.prototype.normalDistance = function(aim) { + return -1; +}; + +TCAD.TWO.AddDimTool = function(viewer, layer) { + this.viewer = viewer; + this.layer = layer; + this.dim = null; + this._v = new TCAD.Vector(0, 0, 0); +}; + +TCAD.TWO.AddDimTool.prototype.keydown = function(e) {}; +TCAD.TWO.AddDimTool.prototype.keypress = function(e) {}; +TCAD.TWO.AddDimTool.prototype.keyup = function(e) {}; +TCAD.TWO.AddDimTool.prototype.cleanup = function(e) {}; + +TCAD.TWO.AddDimTool.prototype.mousemove = function(e) { + var p = this.viewer.screenToModel(e); + this.viewer.snap(p.x, p.y, []); + if (this.dim != null) { + this.dim.b.x = p.x; + this.dim.b.y = p.y; + } + this.viewer.refresh(); +}; + +TCAD.TWO.AddDimTool.prototype.mouseup = function(e) { + + if (e.button > 0 && this.dim != null) { + this.dim.flip = !this.dim.flip; + this.viewer.refresh(); + return; + } + + if (this.viewer.snapped.length == 0) { + return; + } + + var p = this.viewer.snapped.pop(); + this.viewer.cleanSnap(); + + if (this.dim == null) { + this.dim = new TCAD.TWO.Dimension(p, new TCAD.TWO.EndPoint(p.x, p.y)); + this.layer.objects.push(this.dim); + this.viewer.refresh(); + } else { + this.dim.b = p; + this.viewer.toolManager.releaseControl(); + this.viewer.refresh(); + } +}; + +TCAD.TWO.AddDimTool.prototype.mousedown = function(e) { +}; + +TCAD.TWO.AddDimTool.prototype.mousewheel = function(e) { +}; + diff --git a/web/sketcher.html b/web/sketcher.html index 784371bd..20257c1c 100644 --- a/web/sketcher.html +++ b/web/sketcher.html @@ -188,6 +188,8 @@ + + @@ -257,7 +259,7 @@ -->