mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-09 09:52:34 +01:00
dimensions for arcs
This commit is contained in:
parent
1c4135578d
commit
9f21aff7be
2 changed files with 76 additions and 16 deletions
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue