|
|
|
@ -74,17 +74,30 @@ export class Command_TestOffset implements Command
|
|
|
|
|
{
|
|
|
|
|
if (lastpls) lastpls.forEach(cu => cu.Erase());
|
|
|
|
|
|
|
|
|
|
let ptClose = cu.GetClosestPointTo(p, false);
|
|
|
|
|
let toPtVec = p.clone().sub(ptClose); //点击处向量
|
|
|
|
|
let d = cu.GetFistDeriv(cu.GetParamAtPoint(ptClose));//切线。
|
|
|
|
|
let c = toPtVec.cross(d);
|
|
|
|
|
let dist = p.distanceTo(cu.GetClosestPointTo(p, !cu.IsClose));
|
|
|
|
|
|
|
|
|
|
if (cu instanceof Polyline && cu.EndParam > 1 && cu.Area > 0)
|
|
|
|
|
{
|
|
|
|
|
c.z = (IsPointInPolyLine(cu, p) ? -1 : 1) * Math.sign(cu.Area2);
|
|
|
|
|
let pls1 = cu.GetOffsetCurves(dist);
|
|
|
|
|
let pls2 = cu.GetOffsetCurves(-dist);
|
|
|
|
|
|
|
|
|
|
let dis1 = Math.min.apply(undefined, pls1.map(c => p.distanceTo(c.GetClosestPointTo(p, false))));
|
|
|
|
|
let dis2 = Math.min.apply(undefined, pls2.map(c => p.distanceTo(c.GetClosestPointTo(p, false))));
|
|
|
|
|
|
|
|
|
|
if (dis1 < dis2)
|
|
|
|
|
lastpls = pls1;
|
|
|
|
|
else
|
|
|
|
|
lastpls = pls2;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
let ptClose = cu.GetClosestPointTo(p, false);
|
|
|
|
|
let toPtVec = p.clone().sub(ptClose); //点击处向量
|
|
|
|
|
let d = cu.GetFistDeriv(cu.GetParamAtPoint(ptClose));//切线。
|
|
|
|
|
let c = toPtVec.cross(d);
|
|
|
|
|
lastpls = cu.GetOffsetCurves(p.distanceTo(cu.GetClosestPointTo(p, !cu.IsClose)) * Math.sign(c.z));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lastpls = cu.GetOffsetCurves(p.distanceTo(cu.GetClosestPointTo(p, !cu.IsClose)) * Math.sign(c.z));
|
|
|
|
|
lastpls.forEach((offCur) =>
|
|
|
|
|
{
|
|
|
|
|
app.m_Database.ModelSpace.Append(offCur);
|
|
|
|
|