!433 多段线倒角半径为0

pull/433/MERGE
ChenX 5 years ago
parent 7e2177b294
commit 8460b66973

@ -290,3 +290,60 @@ test('自交多段线', () =>
} }
}); });
//R0
test('多段线双圆R0', () =>
{
let f = [1, "Polyline", 5, 2, 105, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1571.0622009569374, 642.1282296650719, 0, 1], 0, 0, 2, 3, [-454.206027432087, 320.6147368421051], -2.9766539744084812, [-431.6922770664303, -350.340837980916], -2.8993396583254722, [-518.3394309084008, 201.0501410134426], 0, false]
let pl = LoadEntityFromFileData(f)[0] as Polyline;
let fillet = new FilletUtils();
fillet.FilletRadius = 0;
let pts = [new Vector3(909.9440085668164, 933.3077477050381, 0), new Vector3(1280.5718361808256, 1116.166490576796, 0)];
for (let i = 0; i + 1 < pts.length; i = i + 2)
{
let p1 = pts[i];
let p2 = pts[i + 1];
let e1 = new PromptEntityResult(pl, p1);
let e2 = new PromptEntityResult(pl, p2);
let fres = fillet.Fillet(e1, e2);
excepeRes(fres);
}
});
test('自交多段线R0', () =>
{
let f = [1, "Polyline", 5, 2, 106, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 2, 7, [4276.596835215311, 1149.2698457416268], 0, [4814.832566507177, -666.4651513875599], 0, [6251.870712226028, 1084.2122721667558], -0.5612019988173412, [6572.455012671152, 1039.2528815304759], 0, [7078.0165450717695, -128.2294200956936], 0, [9088.294577607654, 1700.475112727273], 0, [5906.768985493756, 210.08998230825014], 0, false]
let pl = LoadEntityFromFileData(f)[0] as Polyline;
let fillet = new FilletUtils();
fillet.FilletRadius = 10;
let pts = [new Vector3(4759.472137764609, -479.7070785210667, 0), new Vector3(6024.774672494344, 265.369726606551, 0), new Vector3(5976.082363634626, 748.2320220970707, 0), new Vector3(6672.691303327904, 807.7793855808623, 0), new Vector3(6683.501141538695, 782.8164602281072, 0), new Vector3(6586.348726590796, 528.4389981312158, 0), new Vector3(6696.36087689051, 753.119751786805, 0), new Vector3(7099.123174513582, 768.6481023223804, 0), new Vector3(6658.806811968616, 562.3819760828667, 0), new Vector3(6851.152936781651, 395.661799048499, 0), new Vector3(6890.235750785234, 305.4087027928025, 0), new Vector3(7047.556803344554, 744.4918443904984, 0)];
for (let i = 0; i + 1 < pts.length; i = i + 2)
{
let p1 = pts[i];
let p2 = pts[i + 1];
let e1 = new PromptEntityResult(pl, p1);
let e2 = new PromptEntityResult(pl, p2);
let fres = fillet.Fillet(e1, e2);
excepeRes(fres);
}
});

@ -4,6 +4,8 @@ exports[`只有closemark 1`] = `"4641.27612"`;
exports[`圆弧跨越分割线 1`] = `"1420.95209"`; exports[`圆弧跨越分割线 1`] = `"1420.95209"`;
exports[`多段线双圆R0 1`] = `"5151.46930"`;
exports[`自交多段线 1`] = `"7791.00495"`; exports[`自交多段线 1`] = `"7791.00495"`;
exports[`自交多段线 2`] = `"9003.48566"`; exports[`自交多段线 2`] = `"9003.48566"`;
@ -12,6 +14,18 @@ exports[`自交多段线 3`] = `"0.00000"`;
exports[`自交多段线 4`] = `"0.00000"`; exports[`自交多段线 4`] = `"0.00000"`;
exports[`自交多段线R0 1`] = `"11798.05277"`;
exports[`自交多段线R0 2`] = `"12270.99652"`;
exports[`自交多段线R0 3`] = `"5952.10633"`;
exports[`自交多段线R0 4`] = `"0.00000"`;
exports[`自交多段线R0 5`] = `"0.00000"`;
exports[`自交多段线R0 6`] = `"6089.71523"`;
exports[`跨越首尾且首尾重叠 1`] = `"4587.13386"`; exports[`跨越首尾且首尾重叠 1`] = `"4587.13386"`;
exports[`跨越首尾且首尾重叠 2`] = `"4587.13386"`; exports[`跨越首尾且首尾重叠 2`] = `"4587.13386"`;

@ -8,6 +8,7 @@ import { Ellipse } from "../DatabaseServices/Entity/Ellipse";
import { Line } from "../DatabaseServices/Entity/Line"; import { Line } from "../DatabaseServices/Entity/Line";
import { Polyline } from "../DatabaseServices/Entity/Polyline"; import { Polyline } from "../DatabaseServices/Entity/Polyline";
import { Spline } from "../DatabaseServices/Spline"; import { Spline } from "../DatabaseServices/Spline";
import { JigUtils } from "../Editor/JigUtils";
import { PromptEntityResult, PromptPointResult } from "../Editor/PromptResult"; import { PromptEntityResult, PromptPointResult } from "../Editor/PromptResult";
import { angle, AsVector2, equalv3, isParallelTo, midPoint } from "../Geometry/GeUtils"; import { angle, AsVector2, equalv3, isParallelTo, midPoint } from "../Geometry/GeUtils";
import { IntersectOption } from "../GraphicsSystem/IntersectWith"; import { IntersectOption } from "../GraphicsSystem/IntersectWith";
@ -201,7 +202,11 @@ export class FilletUtils
let param1 = pl.GetParamAtPoint(pl.GetClosestPointTo(enRes1.Point, false)); let param1 = pl.GetParamAtPoint(pl.GetClosestPointTo(enRes1.Point, false));
let param2 = pl.GetParamAtPoint(pl.GetClosestPointTo(enRes2.Point, false)); let param2 = pl.GetParamAtPoint(pl.GetClosestPointTo(enRes2.Point, false));
if (param1 > param2) [param1, param2] = [param2, param1]; if (param1 > param2)
{
[param1, param2] = [param2, param1];
[enRes1, enRes2] = [enRes2, enRes1];
}
let parF1 = Math.floor(param1); let parF1 = Math.floor(param1);
let parF2 = Math.floor(param2); let parF2 = Math.floor(param2);
@ -225,29 +230,52 @@ export class FilletUtils
es2.Point = enRes2.Point; es2.Point = enRes2.Point;
let fres = this.Fillet(es1, es2); let fres = this.Fillet(es1, es2);
if (!fres || !fres.arc) if (!fres)
return; return;
let pln = pl.Clone(); let pln = pl.Clone();
let notCycle = equalv3(pl.GetPointAtParam(parF1), fres.cu1.StartPoint);
let c1Derv = c1.GetFistDeriv(fres.arc.StartPoint).normalize();
let c2Derv = c2.GetFistDeriv(fres.arc.EndPoint).normalize();
let asDerv = fres.arc.GetFistDeriv(0).normalize();
let aeDerv = fres.arc.GetFistDeriv(1).normalize();
//自交多段线时
if (equalv3(c1Derv, asDerv) !== equalv3(c2Derv, aeDerv))
return;
if (fres.cu1 instanceof Arc) if (fres.cu1 instanceof Arc)
pln.SetBulgeAt(parF1, fres.cu1.Bul); pln.SetBulgeAt(parF1, fres.cu1.Bul);
if (fres.cu2 instanceof Arc) if (fres.cu2 instanceof Arc)
pln.SetBulgeAt(parF2, fres.cu2.Bul); pln.SetBulgeAt(parF2, fres.cu2.Bul);
if (notCycle)//没有经过起点 let splitType1 = equalv3(c1.StartPoint, fres.cu1.StartPoint);
let splitType2 = equalv3(c2.StartPoint, fres.cu2.StartPoint);
if (splitType1 === splitType2)
return;
if (!fres.arc)
{
if (splitType1)
{
let ep = AsVector2(fres.cu1.EndPoint.applyMatrix4(pln.OCSInv));
pln.SetPointAt(parF1 + 1, ep);
let sp = AsVector2(fres.cu2.StartPoint.applyMatrix4(pln.OCSInv));
pln.SetPointAt(parF2, sp);
//移除多余的点
pln.LineData.splice(parF1 + 1, parF2 - parF1 - 1);
pln.Update();
return { cu1: pln };
}
else
{
let ep = AsVector2(fres.cu1.StartPoint.applyMatrix4(pln.OCSInv));
pln.SetPointAt(parF1, ep);
let sp = AsVector2(fres.cu2.EndPoint.applyMatrix4(pln.OCSInv));
pln.SetPointAt(parF2 + 1, sp);
pln.LineData.splice(parF2 + 2);
pln.LineData.splice(0, parF1);
pln.Update();
return { cu1: pln };
}
}
if (splitType1)//没有经过起点
{ {
let sp = AsVector2(fres.cu1.EndPoint.applyMatrix4(pln.OCSInv)); let sp = AsVector2(fres.cu1.EndPoint.applyMatrix4(pln.OCSInv));
if (parF2 - parF1 === 1) if (parF2 - parF1 === 1)

@ -124,6 +124,7 @@ import { ShowTemplate } from '../Add-on/Template/ShowTemplate';
import { ReverseDrillFace } from '../Add-on/DrawDrilling/ReverseDrillFace'; import { ReverseDrillFace } from '../Add-on/DrawDrilling/ReverseDrillFace';
import { DeleteDim } from '../Add-on/DrawDim/DeleteDim'; import { DeleteDim } from '../Add-on/DrawDim/DeleteDim';
import { Command_FastDimBrs } from '../Add-on/DrawDim/FastDim'; import { Command_FastDimBrs } from '../Add-on/DrawDim/FastDim';
import { TestFillet } from '../Add-on/testEntity/TestFilletCode';
export function registerCommand() export function registerCommand()
@ -215,6 +216,7 @@ export function registerCommand()
commandMachine.RegisterCommand("ss", new Command_Ssget()); commandMachine.RegisterCommand("ss", new Command_Ssget());
commandMachine.RegisterCommand("f", new CommandFillet()); commandMachine.RegisterCommand("f", new CommandFillet());
commandMachine.RegisterCommand("testFilletCode", new TestFillet());
commandMachine.RegisterCommand("O", new Command_Offset()); commandMachine.RegisterCommand("O", new Command_Offset());
commandMachine.RegisterCommand("Length", new Command_Length()); commandMachine.RegisterCommand("Length", new Command_Length());

Loading…
Cancel
Save