diff --git a/__test__/EdgeSealing/__snapshots__/EdgeSealing.test.ts.snap b/__test__/EdgeSealing/__snapshots__/EdgeSealing.test.ts.snap index 9f632c851..548275281 100644 --- a/__test__/EdgeSealing/__snapshots__/EdgeSealing.test.ts.snap +++ b/__test__/EdgeSealing/__snapshots__/EdgeSealing.test.ts.snap @@ -8,11 +8,11 @@ exports[`切割残留一个封边厚度的凸角的板件封边 1`] = `30420`; exports[`切割残留一个封边厚度的凸角的板件封边 2`] = `30420`; -exports[`封边错误板件 1`] = `130118.4094685434`; +exports[`封边错误板件 1`] = `130118.40946854133`; exports[`封边错误板件2 1`] = `779770.9650700318`; -exports[`封边错误板件3 1`] = `359947.9512754363`; +exports[`封边错误板件3 1`] = `359947.9362569036`; exports[`封边错误板件4 1`] = `30748.998596293524`; @@ -42,4 +42,4 @@ exports[`异型板件,非相切圆弧 1`] = `635612.2751433642`; exports[`异型板件,非相切圆弧 2`] = `626242.2196800549`; -exports[`椭圆弧封边 1`] = `23816.280001572693`; +exports[`椭圆弧封边 1`] = `23816.280001593965`; diff --git a/src/DatabaseServices/Entity/Polyline.ts b/src/DatabaseServices/Entity/Polyline.ts index b838c898a..4cc2ffa68 100644 --- a/src/DatabaseServices/Entity/Polyline.ts +++ b/src/DatabaseServices/Entity/Polyline.ts @@ -1019,6 +1019,47 @@ export class Polyline extends Curve return pl; } + /**首尾相连的曲线直接连接 */ + static FastCombine(curves: Curve[], tolerance = 1e-5): Polyline | undefined + { + if (!curves || curves.length === 0) return; + + let pl = new Polyline; + pl.OCS = ComputerCurvesNormalOCS(curves); + + let ocsInv = pl.OCSInv; + + let lineData: PolylineProps[] = []; + for (let i = 0; i < curves.length; i++) + { + let cu = curves[i]; + let bul = 0; + if (cu instanceof Arc) + bul = cu.Bul; + + lineData.push({ + pt: AsVector2(cu.StartPoint.applyMatrix4(ocsInv)), + bul + }); + + if (i === curves.length - 1) + { + lineData.push({ + pt: AsVector2(cu.EndPoint.applyMatrix4(ocsInv)), + bul: 0 + }); + } + } + + if (lineData.length > 1) + { + let ld = arrayLast(lineData).pt; + if (equalv2(lineData[0].pt, ld, tolerance)) + ld.copy(lineData[0].pt); + } + pl.LineData = lineData; + return pl; + } PtOnCurve(pt: Vector3): boolean { diff --git a/src/GraphicsSystem/CalcEdgeSealing.ts b/src/GraphicsSystem/CalcEdgeSealing.ts index e1311fdf2..785d35ac8 100644 --- a/src/GraphicsSystem/CalcEdgeSealing.ts +++ b/src/GraphicsSystem/CalcEdgeSealing.ts @@ -333,7 +333,7 @@ export function GetSealedBoardContour(br: Board, hasSealing: boolean): Polyline return offsetCus[0] as Circle; if (!CalcEdgeSealing(offsetCus)) return; - let pl = Polyline.Combine(offsetCus, LINK_FUZZ); + let pl = Polyline.FastCombine(offsetCus, LINK_FUZZ); if (dir < 0) pl.Reverse(); return pl; diff --git a/src/Production/Product.ts b/src/Production/Product.ts index a43e38eea..751c2c573 100644 --- a/src/Production/Product.ts +++ b/src/Production/Product.ts @@ -513,7 +513,7 @@ export namespace Production } let cus = con.Explode(); MergeCurvelist(cus); - let pl = Polyline.Combine(cus, LINK_FUZZ); + let pl = Polyline.FastCombine(cus, LINK_FUZZ); if (isSplite && pl.Area2 < 0) pl.Reverse(); return pl;