diff --git a/web/app/sketcher/shapes/arc.js b/web/app/sketcher/shapes/arc.js index 189c15ce..b8c342df 100644 --- a/web/app/sketcher/shapes/arc.js +++ b/web/app/sketcher/shapes/arc.js @@ -81,12 +81,11 @@ TCAD.TWO.Arc.prototype.drawImpl = function(ctx, scale) { } }; -TCAD.TWO.Arc.prototype.normalDistance = function(aim) { - +TCAD.TWO.Arc.prototype.isPointInsideSector = function(x, y) { var ca = new TCAD.Vector(this.a.x - this.c.x, this.a.y - this.c.y); var cb = new TCAD.Vector(this.b.x - this.c.x, this.b.y - this.c.y); - var ct = new TCAD.Vector(aim.x - this.c.x, aim.y - this.c.y); - + var ct = new TCAD.Vector(x - this.c.x, y - this.c.y); + ca._normalize(); cb._normalize(); ct._normalize(); @@ -96,15 +95,20 @@ TCAD.TWO.Arc.prototype.normalDistance = function(aim) { var isInside = cosAT >= cosAB; var abInverse = ca.cross(cb).z < 0; var atInverse = ca.cross(ct).z < 0; - + var result; if (abInverse) { result = !atInverse || !isInside; } else { - result = !atInverse && isInside; + result = !atInverse && isInside; } - - if (result) { + return result; +}; + +TCAD.TWO.Arc.prototype.normalDistance = function(aim) { + + var isInsideSector = this.isPointInsideSector(aim.x, aim.y); + if (isInsideSector) { return Math.abs(TCAD.math.distance(aim.x, aim.y, this.c.x, this.c.y) - this.radiusForDrawing()); } else { return Math.min( diff --git a/web/app/sketcher/shapes/dim.js b/web/app/sketcher/shapes/dim.js index 42f0719a..c6adb534 100644 --- a/web/app/sketcher/shapes/dim.js +++ b/web/app/sketcher/shapes/dim.js @@ -173,14 +173,22 @@ TCAD.TWO.DiameterDimension.prototype.translateImpl = function(dx, dy) { TCAD.TWO.DiameterDimension.prototype.drawImpl = function(ctx, scale, viewer) { if (this.obj == null) return; + if (this.obj._class === 'TCAD.TWO.Circle') { + this.drawForCircle(ctx, scale, viewer); + } else if (this.obj._class === 'TCAD.TWO.Arc') { + this.drawForArc(ctx, scale, viewer); + } +}; + +TCAD.TWO.DiameterDimension.prototype.drawForCircle = function(ctx, scale, viewer) { var c = new TCAD.Vector().setV(this.obj.c); - var r = this.obj.r.value; + var r = this.obj.r.get(); var angled = new TCAD.Vector(r * Math.cos(this.angle), r * Math.sin(this.angle), 0); var a = c.minus(angled); var b = c.plus(angled); var textOff = TCAD.TWO.LinearDimension.getTextOff(viewer.dimScale); - var d = TCAD.math.distanceAB(a, b); + var d = 2 * r; ctx.beginPath(); ctx.moveTo(a.x, a.y); @@ -231,11 +239,59 @@ TCAD.TWO.DiameterDimension.prototype.drawImpl = function(ctx, scale, viewer) { } }; +TCAD.TWO.DiameterDimension.prototype.drawForArc = function(ctx, scale, viewer) { + + var r = this.obj.distanceA(); + + var hxn = Math.cos(this.angle); + var hyn = Math.sin(this.angle); + + var vxn = - hyn; + var vyn = hxn; + + //fix angle if needed + if (!this.obj.isPointInsideSector(this.obj.c.x + hxn, this.obj.c.y + hyn)) { + var cosA = hxn * (this.obj.a.x - this.obj.c.x) + hyn * (this.obj.a.y - this.obj.c.y); + var cosB = hxn * (this.obj.b.x - this.obj.c.x) + hyn * (this.obj.b.y - this.obj.c.y); + if (cosA - hxn > cosB - hxn) { + this.angle = this.obj.getStartAngle(); + } else { + this.angle = this.obj.getEndAngle(); + } + } + + var vertOff = TCAD.TWO.LinearDimension.getTextOff(viewer.dimScale); + var horOff = 5 * viewer.dimScale; + + var fontSize = 12 * viewer.dimScale; + ctx.font = (fontSize) + "px Arial"; + var txt = 'R ' + r.toFixed(2); + var textWidth = ctx.measureText(txt).width; + + var startX = this.obj.c.x + hxn * r; + var startY = this.obj.c.y + hyn * r; + var lineLength = textWidth + horOff * 2; + + ctx.beginPath(); + ctx.moveTo(startX, startY); + ctx.lineTo(startX + hxn * lineLength, startY + hyn * lineLength); + ctx.closePath(); + ctx.stroke(); + + var tx = startX + vxn * vertOff + hxn * horOff; + var ty = startY + vyn * vertOff + hyn * horOff; + ctx.save(); + ctx.translate(tx, ty); + ctx.rotate(-Math.atan2(vxn, vyn)); + ctx.scale(1, -1); + ctx.fillText(txt, 0, 0); + ctx.restore(); +}; + TCAD.TWO.DiameterDimension.prototype.normalDistance = function(aim) { return -1; }; - /** @constructor */ TCAD.TWO.AddDimTool = function(viewer, layer, dimCreation) { this.viewer = viewer; @@ -308,11 +364,12 @@ TCAD.TWO.AddCircleDimTool.prototype.cleanup = function(e) {}; TCAD.TWO.AddCircleDimTool.prototype.mousemove = function(e) { var p = this.viewer.screenToModel(e); - var objects = this.viewer.search(p.x, p.y, 20 / this.viewer.scale, true, false, []); - var circles = objects.filter(function(o) {return o._class === 'TCAD.TWO.Circle'}); + var objects = this.viewer.search(p.x, p.y, 20 / this.viewer.scale, true, false, []).filter(function(o) { + return o._class === 'TCAD.TWO.Circle' || o._class === 'TCAD.TWO.Arc'; + }); - if (circles.length != 0) { - this.dim.obj = circles[0]; + if (objects.length != 0) { + this.dim.obj = objects[0]; } else { this.dim.obj = null; } @@ -336,4 +393,3 @@ TCAD.TWO.AddCircleDimTool.prototype.mousedown = function(e) { TCAD.TWO.AddCircleDimTool.prototype.mousewheel = function(e) { }; -