brepjs 18.119.2 → 18.119.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/2d/blueprints/blueprints.d.ts +3 -0
- package/dist/2d/blueprints/compoundBlueprint.d.ts +3 -0
- package/dist/2d/blueprints/lib.d.ts +6 -0
- package/dist/2d/lib/curve2D.d.ts +6 -1
- package/dist/2d/lib/curve2dFns.d.ts +6 -1
- package/dist/2d.cjs +7 -7
- package/dist/2d.js +7 -7
- package/dist/{adjacencyFns-BdM5p58J.js → adjacencyFns-DLityMyV.js} +2 -2
- package/dist/{adjacencyFns-Brrc7jlS.cjs → adjacencyFns-DSxuQYnb.cjs} +2 -2
- package/dist/{blueprint-DJJo8WkI.js → blueprint-DEMSX-hc.js} +37 -10
- package/dist/{blueprint-DTNT4qYJ.cjs → blueprint-DUnNPwQL.cjs} +43 -10
- package/dist/{blueprintFns-CcpboZ80.js → blueprintFns-DSj4RTjU.js} +9 -4
- package/dist/{blueprintFns-2XDZfCxX.cjs → blueprintFns-Dg8V99O9.cjs} +9 -4
- package/dist/{blueprintSketcher-DDPyypmC.js → blueprintSketcher-gMuUUPb-.js} +185 -54
- package/dist/{blueprintSketcher-C0EXFVb2.cjs → blueprintSketcher-gXVPrPlj.cjs} +192 -61
- package/dist/{boolean2D-Ddfo_dd0.cjs → boolean2D-BpmxQ1AH.cjs} +5 -5
- package/dist/{boolean2D-C_PVz8xT.js → boolean2D-DKT0BgZs.js} +5 -5
- package/dist/brepjs.cjs +105 -92
- package/dist/brepjs.js +39 -27
- package/dist/{cameraFns-Czr5vABD.cjs → cameraFns-2-haLzLi.cjs} +4 -4
- package/dist/{cameraFns-D9tdBYLM.js → cameraFns-CG_J66Hl.js} +4 -4
- package/dist/core.cjs +12 -11
- package/dist/core.js +4 -3
- package/dist/{cornerFinder-Cqg-Dz74.js → cornerFinder-CPFM7bA0.js} +1 -1
- package/dist/{cornerFinder-DETRDOMz.cjs → cornerFinder-mfsUMi5g.cjs} +1 -1
- package/dist/{curveFns-RENXKp64.js → curveFns-DX13KRh2.js} +2 -2
- package/dist/{curveFns-D7utcbnf.cjs → curveFns-GmFnqNo3.cjs} +2 -2
- package/dist/{drawFns-D9Rf4foW.cjs → drawFns-CI6CpqO8.cjs} +35 -16
- package/dist/{drawFns-B9HbtAoc.js → drawFns-CrfBz_wj.js} +35 -16
- package/dist/{errors-B3CDG537.js → errors-MHLiNE-C.js} +1 -92
- package/dist/{errors-CJU8CHng.cjs → errors-RHkKO5bZ.cjs} +0 -103
- package/dist/{faceFns-CPswi9Cm.cjs → faceFns-BK4r7Dxk.cjs} +3 -3
- package/dist/{faceFns-CB6uzvOg.js → faceFns-DJj9Nb6T.js} +3 -3
- package/dist/{healingFns-BFTYLiAm.js → healingFns-DxcRyVCG.js} +5 -6
- package/dist/{healingFns-bhMxTTqw.cjs → healingFns-Hx4oTlq8.cjs} +27 -28
- package/dist/{helpers-Cu4ag5bh.cjs → helpers-BfkBvokP.cjs} +8 -24
- package/dist/{helpers-BiN4qQZP.js → helpers-Du_OdHuy.js} +9 -25
- package/dist/{importFns-X8vBhZI2.js → importFns-DqxAZFb-.js} +3 -3
- package/dist/{importFns-DS4J1xLv.cjs → importFns-pr-r5qiV.cjs} +3 -3
- package/dist/io.cjs +2 -2
- package/dist/io.js +2 -2
- package/dist/{loftFns-ChHjzUK-.cjs → loftFns-BdpZ8FMN.cjs} +2 -125
- package/dist/{loftFns-BF5X7ltI.js → loftFns-BeGJ6dxx.js} +4 -109
- package/dist/{measureFns-B5Zzg1qM.cjs → measureFns-CJGrmhHT.cjs} +4 -4
- package/dist/{measureFns-CC7HhAH3.js → measureFns-CMnbcUZC.js} +4 -4
- package/dist/measurement.cjs +1 -1
- package/dist/measurement.js +1 -1
- package/dist/{meshFns-D57Fyqyf.js → meshFns-Cs5EBsf7.js} +4 -4
- package/dist/{meshFns-CaXmWmhe.cjs → meshFns-Dqf5QBhQ.cjs} +5 -5
- package/dist/operations.cjs +2 -2
- package/dist/operations.js +2 -2
- package/dist/originTrackingFns-DZmdiQ-O.js +203 -0
- package/dist/originTrackingFns-fpEgTIwV.cjs +226 -0
- package/dist/{planeOps-Cp6GQ23-.js → planeOps-CQahLrCx.js} +1 -1
- package/dist/{planeOps-Cr25KWWA.cjs → planeOps-VlFxtvzY.cjs} +1 -1
- package/dist/primitiveFns-B_rflH83.cjs +773 -0
- package/dist/primitiveFns-Cxo3xDKY.js +558 -0
- package/dist/projection.cjs +1 -1
- package/dist/projection.js +1 -1
- package/dist/query.cjs +2 -2
- package/dist/query.js +2 -2
- package/dist/{refResolveFns-3bw9-U-e.js → refResolveFns-BbRLD8LA.js} +6 -6
- package/dist/{refResolveFns-BxmgIhQM.cjs → refResolveFns-CVDLwh12.cjs} +6 -6
- package/dist/result.cjs +1 -1
- package/dist/result.js +1 -1
- package/dist/rolldown-runtime-DakpK96I.cjs +43 -0
- package/dist/shapeFns-BTFx-os7.js +43 -0
- package/dist/shapeFns-D_5TgiUi.cjs +84 -0
- package/dist/shapeRef.cjs +1 -1
- package/dist/shapeRef.js +1 -1
- package/dist/{shapeTypes-Bpsu5KJO.cjs → shapeTypes-CkcIL7zv.cjs} +1 -222
- package/dist/{shapeTypes-CnKFSfDT.js → shapeTypes-t49f64Dx.js} +2 -139
- package/dist/sketching/drawing.d.ts +9 -1
- package/dist/sketching.cjs +3 -3
- package/dist/sketching.js +3 -3
- package/dist/{solidBuilders-I8_V8qqU.js → solidBuilders-DTgqQC3W.js} +310 -8
- package/dist/{solidBuilders-Bp7lQW62.cjs → solidBuilders-IiIzjKAr.cjs} +401 -15
- package/dist/{surfaceBuilders-D8_08oOR.cjs → surfaceBuilders-Biqx51el.cjs} +6 -5
- package/dist/{surfaceBuilders-BNR7yMQO.js → surfaceBuilders-BryY-i0F.js} +4 -3
- package/dist/text.cjs +2 -2
- package/dist/text.js +2 -2
- package/dist/{textBlueprints-B5zcLGvJ.cjs → textBlueprints-BY0FEg59.cjs} +138 -51
- package/dist/{textBlueprints-igbNvKcd.js → textBlueprints-ZzYg3XTS.js} +116 -11
- package/dist/{textMetrics-CJvtpbc3.js → textMetrics-Diakbtem.js} +2 -2
- package/dist/{textMetrics-08fF0QNf.cjs → textMetrics-f5yXR4OG.cjs} +2 -2
- package/dist/{threadFns-CqSMNyTZ.js → threadFns-BOtXTHZ9.js} +8 -8
- package/dist/{threadFns-Co6vWEWx.cjs → threadFns-DRrk9Qod.cjs} +8 -8
- package/dist/topology.cjs +9 -9
- package/dist/topology.js +9 -9
- package/dist/{topologyQueryFns-C3fhJndG.cjs → topologyQueryFns-Bia7o8l_.cjs} +97 -6
- package/dist/{topologyQueryFns-DNqT88yx.js → topologyQueryFns-BkQ6Q7gN.js} +93 -2
- package/dist/validityTypes-DiTgeCD9.js +129 -0
- package/dist/validityTypes-ZGMVlv7b.cjs +200 -0
- package/dist/vectors.cjs +1 -1
- package/dist/vectors.js +1 -1
- package/package.json +8 -8
- package/dist/primitiveFns-CRy_CUVg.cjs +0 -492
- package/dist/primitiveFns-DCIH-SBm.js +0 -331
- package/dist/shapeFns-BrHFNLMA.js +0 -771
- package/dist/shapeFns-qm9VRo4i.cjs +0 -962
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
const require_shapeTypes = require("./shapeTypes-
|
|
1
|
+
const require_shapeTypes = require("./shapeTypes-CkcIL7zv.cjs");
|
|
2
2
|
const require_bug = require("./bug-O02CsAmt.cjs");
|
|
3
|
-
const require_errors = require("./errors-
|
|
3
|
+
const require_errors = require("./errors-RHkKO5bZ.cjs");
|
|
4
4
|
const require_constants = require("./constants-BOVyEYGH.cjs");
|
|
5
5
|
const require_arrayAccess = require("./arrayAccess-e4H9cBfh.cjs");
|
|
6
|
-
const require_helpers = require("./helpers-
|
|
7
|
-
const require_blueprint = require("./blueprint-
|
|
6
|
+
const require_helpers = require("./helpers-BfkBvokP.cjs");
|
|
7
|
+
const require_blueprint = require("./blueprint-DUnNPwQL.cjs");
|
|
8
8
|
//#region node_modules/flatqueue/index.js
|
|
9
9
|
/**
|
|
10
10
|
* @typedef {Float64ArrayConstructor | Float32ArrayConstructor |
|
|
@@ -587,7 +587,7 @@ var selfIntersections = (curve, precision = 1e-9) => {
|
|
|
587
587
|
//#endregion
|
|
588
588
|
//#region src/2d/lib/offset.ts
|
|
589
589
|
var offsetEndPoints = (firstPoint, lastPoint, offset) => {
|
|
590
|
-
const tangent =
|
|
590
|
+
const tangent = require_blueprint.normalize2d(require_helpers.subtract2d(lastPoint, firstPoint));
|
|
591
591
|
const normal = [tangent[1], -tangent[0]];
|
|
592
592
|
const offsetVec = [require_bug.wasmIndex(normal, 0) * offset, require_bug.wasmIndex(normal, 1) * offset];
|
|
593
593
|
return {
|
|
@@ -629,7 +629,7 @@ var make2dOffset = (curve, offset) => {
|
|
|
629
629
|
if (newRadius < 1e-10) {
|
|
630
630
|
const center = [cx, cy];
|
|
631
631
|
const offsetViaCenter = (point) => {
|
|
632
|
-
const [x, y] =
|
|
632
|
+
const [x, y] = require_blueprint.normalize2d(require_helpers.subtract2d(point, center));
|
|
633
633
|
return require_helpers.add2d(point, [orientedOffset * x, orientedOffset * y]);
|
|
634
634
|
};
|
|
635
635
|
return {
|
|
@@ -668,32 +668,99 @@ var make2dOffset = (curve, offset) => {
|
|
|
668
668
|
};
|
|
669
669
|
//#endregion
|
|
670
670
|
//#region src/2d/lib/customCorners.ts
|
|
671
|
+
/** Unwrap an intersection, discarding the common-segment curves the caller does not use. */
|
|
672
|
+
function intersectionPoints(first, second) {
|
|
673
|
+
const result = require_errors.unwrap(intersectCurves(first, second));
|
|
674
|
+
result.commonSegments.forEach((c) => {
|
|
675
|
+
c.delete();
|
|
676
|
+
});
|
|
677
|
+
return result.intersections;
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* Delete the split pieces the caller is discarding. `splitAt` returns the curve
|
|
681
|
+
* itself when there is nothing to split, so the source is never deleted here.
|
|
682
|
+
*/
|
|
683
|
+
function disposeSplitPieces(pieces, source, kept) {
|
|
684
|
+
pieces.forEach((piece) => {
|
|
685
|
+
if (piece !== source && piece !== kept) piece.delete();
|
|
686
|
+
});
|
|
687
|
+
}
|
|
688
|
+
/**
|
|
689
|
+
* Run `split` and, if it throws, dispose the pieces an earlier split already
|
|
690
|
+
* produced. Splitting the second curve of a corner can fail (its parameter may
|
|
691
|
+
* not project onto the offset), stranding the first curve's pieces.
|
|
692
|
+
*/
|
|
693
|
+
function splitOrDiscard(split, earlier) {
|
|
694
|
+
try {
|
|
695
|
+
return split();
|
|
696
|
+
} catch (e) {
|
|
697
|
+
disposeSplitPieces(earlier.pieces, earlier.source);
|
|
698
|
+
throw e;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
/**
|
|
702
|
+
* Build the corner result, disposing the trimmed halves if the connecting curve
|
|
703
|
+
* cannot be built. They are unreachable once the error propagates.
|
|
704
|
+
*/
|
|
705
|
+
function discardTrimsOnError(firstCurve, secondCurve, first, second, build) {
|
|
706
|
+
try {
|
|
707
|
+
return build();
|
|
708
|
+
} catch (e) {
|
|
709
|
+
if (first !== firstCurve) first.delete();
|
|
710
|
+
if (second !== secondCurve) second.delete();
|
|
711
|
+
throw e;
|
|
712
|
+
}
|
|
713
|
+
}
|
|
671
714
|
function removeCorner(firstCurve, secondCurve, radius) {
|
|
672
715
|
const sinAngle = require_helpers.crossProduct2d(firstCurve.tangentAt(1), secondCurve.tangentAt(0));
|
|
673
716
|
if (Math.abs(sinAngle) < 1e-10) return null;
|
|
674
717
|
const offset = Math.abs(radius) * (sinAngle > 0 ? -1 : 1);
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
718
|
+
let firstOffset = null;
|
|
719
|
+
let secondOffset = null;
|
|
720
|
+
try {
|
|
721
|
+
firstOffset = make2dOffset(firstCurve, offset);
|
|
722
|
+
secondOffset = make2dOffset(secondCurve, offset);
|
|
723
|
+
if (!(firstOffset instanceof require_blueprint.Curve2D) || !(secondOffset instanceof require_blueprint.Curve2D)) return null;
|
|
724
|
+
const firstOffsetCurve = firstOffset;
|
|
725
|
+
const secondOffsetCurve = secondOffset;
|
|
726
|
+
const intersectionResult = intersectCurves(firstOffsetCurve, secondOffsetCurve, 1e-9);
|
|
727
|
+
if (!require_errors.isOk(intersectionResult)) return null;
|
|
728
|
+
intersectionResult.value.commonSegments.forEach((c) => {
|
|
729
|
+
c.delete();
|
|
730
|
+
});
|
|
731
|
+
const potentialCenter = intersectionResult.value.intersections.at(-1);
|
|
732
|
+
if (!require_blueprint.isPoint2D(potentialCenter)) return null;
|
|
733
|
+
const center = potentialCenter;
|
|
734
|
+
const splitForFillet = (curve, offsetCurve) => {
|
|
735
|
+
const [x, y] = offsetCurve.tangentAt(center);
|
|
736
|
+
const normal = require_blueprint.normalize2d([-y, x]);
|
|
737
|
+
const splitPoint = require_helpers.add2d(center, require_helpers.scalarMultiply2d(normal, offset));
|
|
738
|
+
const splitParam = require_errors.unwrap(curve.parameter(splitPoint, 1e-6));
|
|
739
|
+
return curve.splitAt([splitParam]);
|
|
740
|
+
};
|
|
741
|
+
const firstSplit = splitForFillet(firstCurve, firstOffsetCurve);
|
|
742
|
+
const secondSplit = splitOrDiscard(() => splitForFillet(secondCurve, secondOffsetCurve), {
|
|
743
|
+
pieces: firstSplit,
|
|
744
|
+
source: firstCurve
|
|
745
|
+
});
|
|
746
|
+
const first = firstSplit[0];
|
|
747
|
+
const second = secondSplit[1];
|
|
748
|
+
if (!first || !second) {
|
|
749
|
+
disposeSplitPieces(firstSplit, firstCurve);
|
|
750
|
+
disposeSplitPieces(secondSplit, secondCurve);
|
|
751
|
+
return null;
|
|
752
|
+
}
|
|
753
|
+
disposeSplitPieces(firstSplit, firstCurve, first);
|
|
754
|
+
disposeSplitPieces(secondSplit, secondCurve, second);
|
|
755
|
+
return {
|
|
756
|
+
first,
|
|
757
|
+
second,
|
|
758
|
+
center
|
|
759
|
+
};
|
|
760
|
+
} finally {
|
|
761
|
+
if (firstOffset instanceof require_blueprint.Curve2D) firstOffset.delete();
|
|
762
|
+
if (secondOffset instanceof require_blueprint.Curve2D) secondOffset.delete();
|
|
763
|
+
}
|
|
697
764
|
}
|
|
698
765
|
/**
|
|
699
766
|
* Insert a circular fillet arc at the corner between two curves.
|
|
@@ -711,11 +778,11 @@ function filletCurves(firstCurve, secondCurve, radius) {
|
|
|
711
778
|
const cornerRemoved = removeCorner(firstCurve, secondCurve, radius);
|
|
712
779
|
if (!cornerRemoved) return [firstCurve, secondCurve];
|
|
713
780
|
const { first, second, center } = cornerRemoved;
|
|
714
|
-
return [
|
|
781
|
+
return discardTrimsOnError(firstCurve, secondCurve, first, second, () => [
|
|
715
782
|
first,
|
|
716
783
|
require_blueprint.make2dArcFromCenter(first.lastPoint, second.firstPoint, center),
|
|
717
784
|
second
|
|
718
|
-
];
|
|
785
|
+
]);
|
|
719
786
|
}
|
|
720
787
|
/**
|
|
721
788
|
* Insert a straight chamfer segment at the corner between two curves.
|
|
@@ -727,11 +794,11 @@ function chamferCurves(firstCurve, secondCurve, radius) {
|
|
|
727
794
|
const cornerRemoved = removeCorner(firstCurve, secondCurve, radius);
|
|
728
795
|
if (!cornerRemoved) return [firstCurve, secondCurve];
|
|
729
796
|
const { first, second } = cornerRemoved;
|
|
730
|
-
return [
|
|
797
|
+
return discardTrimsOnError(firstCurve, secondCurve, first, second, () => [
|
|
731
798
|
first,
|
|
732
799
|
require_blueprint.make2dSegmentCurve(first.lastPoint, second.firstPoint),
|
|
733
800
|
second
|
|
734
|
-
];
|
|
801
|
+
]);
|
|
735
802
|
}
|
|
736
803
|
/**
|
|
737
804
|
* Insert a dogbone fillet at an inner corner for CNC milling clearance.
|
|
@@ -740,34 +807,58 @@ function chamferCurves(firstCurve, secondCurve, radius) {
|
|
|
740
807
|
* round end-mill of the given radius can fully reach the corner.
|
|
741
808
|
*/
|
|
742
809
|
function dogboneFilletCurves(firstCurve, secondCurve, radius) {
|
|
743
|
-
const sinAngle = require_helpers.crossProduct2d(
|
|
810
|
+
const sinAngle = require_helpers.crossProduct2d(require_blueprint.normalize2d(firstCurve.tangentAt(1)), require_blueprint.normalize2d(secondCurve.tangentAt(0)));
|
|
744
811
|
const a = Math.asin(sinAngle);
|
|
745
812
|
if (Math.abs(sinAngle) < 1e-10) return [firstCurve, secondCurve];
|
|
746
813
|
const orientationCorrection = sinAngle > 0 ? -1 : 1;
|
|
747
814
|
const offset = Math.abs(radius) * Math.sin(a / 2) * orientationCorrection;
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
const intersectionResult2 = intersectCurves(firstOffset, secondOffset, 1e-9);
|
|
752
|
-
if (!require_errors.isOk(intersectionResult2)) return [firstCurve, secondCurve];
|
|
753
|
-
const potentialCenter = intersectionResult2.value.intersections.at(-1);
|
|
754
|
-
if (!require_blueprint.isPoint2D(potentialCenter)) return [firstCurve, secondCurve];
|
|
755
|
-
const circle = require_blueprint.make2dCircle(radius, potentialCenter);
|
|
756
|
-
const firstInt = require_errors.unwrap(intersectCurves(firstCurve, circle)).intersections[0];
|
|
757
|
-
const secondInt = require_errors.unwrap(intersectCurves(secondCurve, circle)).intersections.at(-1);
|
|
758
|
-
if (!firstInt || !secondInt) return [firstCurve, secondCurve];
|
|
759
|
-
const firstSplit = firstCurve.splitAt([firstInt]);
|
|
760
|
-
const secondSplit = secondCurve.splitAt([secondInt]);
|
|
761
|
-
const firstPart = require_bug.wasmIndex(firstSplit, 0);
|
|
762
|
-
const secondPart = require_bug.wasmIndex(secondSplit, secondSplit.length - 1);
|
|
815
|
+
let firstOffset = null;
|
|
816
|
+
let secondOffset = null;
|
|
817
|
+
let circle = null;
|
|
763
818
|
try {
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
];
|
|
769
|
-
|
|
770
|
-
|
|
819
|
+
firstOffset = make2dOffset(firstCurve, offset);
|
|
820
|
+
secondOffset = make2dOffset(secondCurve, offset);
|
|
821
|
+
if (!(firstOffset instanceof require_blueprint.Curve2D) || !(secondOffset instanceof require_blueprint.Curve2D)) return [firstCurve, secondCurve];
|
|
822
|
+
const intersectionResult2 = intersectCurves(firstOffset, secondOffset, 1e-9);
|
|
823
|
+
if (!require_errors.isOk(intersectionResult2)) return [firstCurve, secondCurve];
|
|
824
|
+
intersectionResult2.value.commonSegments.forEach((c) => {
|
|
825
|
+
c.delete();
|
|
826
|
+
});
|
|
827
|
+
const potentialCenter = intersectionResult2.value.intersections.at(-1);
|
|
828
|
+
if (!require_blueprint.isPoint2D(potentialCenter)) return [firstCurve, secondCurve];
|
|
829
|
+
circle = require_blueprint.make2dCircle(radius, potentialCenter);
|
|
830
|
+
const firstInt = intersectionPoints(firstCurve, circle)[0];
|
|
831
|
+
const secondInt = intersectionPoints(secondCurve, circle).at(-1);
|
|
832
|
+
if (!firstInt || !secondInt) return [firstCurve, secondCurve];
|
|
833
|
+
const firstSplit = firstCurve.splitAt([firstInt]);
|
|
834
|
+
const secondSplit = splitOrDiscard(() => secondCurve.splitAt([secondInt]), {
|
|
835
|
+
pieces: firstSplit,
|
|
836
|
+
source: firstCurve
|
|
837
|
+
});
|
|
838
|
+
const firstPart = firstSplit[0];
|
|
839
|
+
const secondPart = secondSplit[secondSplit.length - 1];
|
|
840
|
+
if (!firstPart || !secondPart) {
|
|
841
|
+
disposeSplitPieces(firstSplit, firstCurve);
|
|
842
|
+
disposeSplitPieces(secondSplit, secondCurve);
|
|
843
|
+
return [firstCurve, secondCurve];
|
|
844
|
+
}
|
|
845
|
+
disposeSplitPieces(firstSplit, firstCurve, firstPart);
|
|
846
|
+
disposeSplitPieces(secondSplit, secondCurve, secondPart);
|
|
847
|
+
try {
|
|
848
|
+
return [
|
|
849
|
+
firstPart,
|
|
850
|
+
require_blueprint.make2dThreePointArc(firstPart.lastPoint, firstCurve.lastPoint, secondPart.firstPoint),
|
|
851
|
+
secondPart
|
|
852
|
+
];
|
|
853
|
+
} catch {
|
|
854
|
+
if (firstPart !== firstCurve) firstPart.delete();
|
|
855
|
+
if (secondPart !== secondCurve) secondPart.delete();
|
|
856
|
+
return [firstCurve, secondCurve];
|
|
857
|
+
}
|
|
858
|
+
} finally {
|
|
859
|
+
if (firstOffset instanceof require_blueprint.Curve2D) firstOffset.delete();
|
|
860
|
+
if (secondOffset instanceof require_blueprint.Curve2D) secondOffset.delete();
|
|
861
|
+
circle?.delete();
|
|
771
862
|
}
|
|
772
863
|
}
|
|
773
864
|
//#endregion
|
|
@@ -791,6 +882,19 @@ var Blueprints = class Blueprints {
|
|
|
791
882
|
this.blueprints = blueprints;
|
|
792
883
|
this._boundingBox = null;
|
|
793
884
|
}
|
|
885
|
+
/** Release the resources held by every child blueprint and the cached bounding box. */
|
|
886
|
+
delete() {
|
|
887
|
+
this.blueprints.forEach((bp) => {
|
|
888
|
+
bp.delete();
|
|
889
|
+
});
|
|
890
|
+
if (this._boundingBox) {
|
|
891
|
+
this._boundingBox.delete();
|
|
892
|
+
this._boundingBox = null;
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
[Symbol.dispose]() {
|
|
896
|
+
this.delete();
|
|
897
|
+
}
|
|
794
898
|
/** Return a multi-line debug representation of every child blueprint. */
|
|
795
899
|
get repr() {
|
|
796
900
|
return ["Blueprints", ...this.blueprints.map((b) => b.repr)].join("\n");
|
|
@@ -898,6 +1002,19 @@ var CompoundBlueprint = class CompoundBlueprint {
|
|
|
898
1002
|
this.blueprints = blueprints;
|
|
899
1003
|
this._boundingBox = null;
|
|
900
1004
|
}
|
|
1005
|
+
/** Release the resources held by every child blueprint and the cached bounding box. */
|
|
1006
|
+
delete() {
|
|
1007
|
+
this.blueprints.forEach((bp) => {
|
|
1008
|
+
bp.delete();
|
|
1009
|
+
});
|
|
1010
|
+
if (this._boundingBox) {
|
|
1011
|
+
this._boundingBox.delete();
|
|
1012
|
+
this._boundingBox = null;
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
[Symbol.dispose]() {
|
|
1016
|
+
this.delete();
|
|
1017
|
+
}
|
|
901
1018
|
/** Return a deep copy of this compound blueprint and all its children. */
|
|
902
1019
|
clone() {
|
|
903
1020
|
return new CompoundBlueprint(this.blueprints.map((bp) => bp.clone()));
|
|
@@ -1121,7 +1238,7 @@ function makeEllipseArcFromSvgParams(startUV, endUV, majorRadius, minorRadius, r
|
|
|
1121
1238
|
const convertAxis = (ax) => require_helpers.distance2d(convertToUV(ax));
|
|
1122
1239
|
const r1 = convertAxis(require_helpers.polarToCartesian(majorRadius, radRotationAngle));
|
|
1123
1240
|
const r2 = convertAxis(require_helpers.polarToCartesian(minorRadius, radRotationAngle + Math.PI / 2));
|
|
1124
|
-
const xDir =
|
|
1241
|
+
const xDir = require_blueprint.normalize2d(convertToUV(require_helpers.rotate2d([1, 0], radRotationAngle)));
|
|
1125
1242
|
const [, newRotationAngle] = require_helpers.cartesianToPolar(xDir);
|
|
1126
1243
|
const { cx, cy, startAngle, endAngle, clockwise, rx, ry } = convertSvgEllipseParams(startUV, endUV, r1, r2, newRotationAngle, longAxis, sweep);
|
|
1127
1244
|
const arc = require_blueprint.make2dEllipseArc(rx, ry, clockwise ? startAngle : endAngle, clockwise ? endAngle : startAngle, [cx, cy], xDir);
|
|
@@ -1213,6 +1330,16 @@ var cornerModeFns = {
|
|
|
1213
1330
|
dogbone: dogboneFilletCurves,
|
|
1214
1331
|
fillet: filletCurves
|
|
1215
1332
|
};
|
|
1333
|
+
/**
|
|
1334
|
+
* Delete the curves a corner function consumed. Corner functions return their
|
|
1335
|
+
* inputs untouched when they bail (collinear curves, failed offset), so only
|
|
1336
|
+
* the ones absent from the result are ours to free.
|
|
1337
|
+
*/
|
|
1338
|
+
function disposeConsumedCurves(consumed, produced) {
|
|
1339
|
+
consumed.forEach((curve) => {
|
|
1340
|
+
if (!produced.includes(curve)) curve.delete();
|
|
1341
|
+
});
|
|
1342
|
+
}
|
|
1216
1343
|
function buildCornerFunction(radius, mode) {
|
|
1217
1344
|
if (typeof radius === "function") return radius;
|
|
1218
1345
|
const makeFn = cornerModeFns[mode];
|
|
@@ -1295,7 +1422,9 @@ var BaseSketcher2d = class {
|
|
|
1295
1422
|
}
|
|
1296
1423
|
const previousCurve = this.pendingCurves.pop();
|
|
1297
1424
|
if (!previousCurve) require_bug.bug("Sketcher2d.saveCurve", "No previous curve available for custom corner");
|
|
1298
|
-
this.
|
|
1425
|
+
const cornered = this._nextCorner(previousCurve, curve);
|
|
1426
|
+
disposeConsumedCurves([previousCurve, curve], cornered);
|
|
1427
|
+
this.pendingCurves.push(...cornered);
|
|
1299
1428
|
this._nextCorner = null;
|
|
1300
1429
|
}
|
|
1301
1430
|
/** Draw a straight line to an absolute 2D point. */
|
|
@@ -1335,7 +1464,7 @@ var BaseSketcher2d = class {
|
|
|
1335
1464
|
/** Draw a line tangent to the previous curve, extending by the given distance. */
|
|
1336
1465
|
tangentLine(distance) {
|
|
1337
1466
|
const previousCurve = this._requireLastCurve("Sketcher2d.tangentLine", "sketch a tangent line");
|
|
1338
|
-
const direction =
|
|
1467
|
+
const direction = require_blueprint.normalize2d(this._convertFromUV(previousCurve.tangentAt(1)));
|
|
1339
1468
|
return this.line(direction[0] * distance, direction[1] * distance);
|
|
1340
1469
|
}
|
|
1341
1470
|
/** Draw a circular arc passing through a mid-point to an absolute end point. */
|
|
@@ -1445,12 +1574,12 @@ var BaseSketcher2d = class {
|
|
|
1445
1574
|
if (startTangent) startPoleDirection = startTangent;
|
|
1446
1575
|
else if (!previousCurve) startPoleDirection = [1, 0];
|
|
1447
1576
|
else startPoleDirection = this._convertFromUV(previousCurve.tangentAt(1));
|
|
1448
|
-
startPoleDirection =
|
|
1577
|
+
startPoleDirection = require_blueprint.normalize2d(startPoleDirection);
|
|
1449
1578
|
const startControl = [this.pointer[0] + startPoleDirection[0] * startFactor * defaultDistance, this.pointer[1] + startPoleDirection[1] * startFactor * defaultDistance];
|
|
1450
1579
|
let endPoleDirection;
|
|
1451
1580
|
if (endTangent === "symmetric") endPoleDirection = [-startPoleDirection[0], -startPoleDirection[1]];
|
|
1452
1581
|
else endPoleDirection = endTangent;
|
|
1453
|
-
endPoleDirection =
|
|
1582
|
+
endPoleDirection = require_blueprint.normalize2d(endPoleDirection);
|
|
1454
1583
|
const endControl = [end[0] - endPoleDirection[0] * endFactor * defaultDistance, end[1] - endPoleDirection[1] * endFactor * defaultDistance];
|
|
1455
1584
|
return this.cubicBezierCurveTo(end, startControl, endControl);
|
|
1456
1585
|
}
|
|
@@ -1469,7 +1598,9 @@ var BaseSketcher2d = class {
|
|
|
1469
1598
|
const previousCurve = this.pendingCurves.pop();
|
|
1470
1599
|
const curve = this.pendingCurves.shift();
|
|
1471
1600
|
if (!previousCurve || !curve) require_bug.bug("Sketcher2d._customCornerLastWithFirst", "Not enough curves to close and fillet");
|
|
1472
|
-
|
|
1601
|
+
const cornered = buildCornerFunction(radius, mode)(previousCurve, curve);
|
|
1602
|
+
disposeConsumedCurves([previousCurve, curve], cornered);
|
|
1603
|
+
this.pendingCurves.push(...cornered);
|
|
1473
1604
|
}
|
|
1474
1605
|
_closeSketch() {
|
|
1475
1606
|
if (!require_helpers.samePoint(this.pointer, this.firstPoint)) this.lineTo(this.firstPoint);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const require_bug = require("./bug-O02CsAmt.cjs");
|
|
2
|
-
const require_errors = require("./errors-
|
|
2
|
+
const require_errors = require("./errors-RHkKO5bZ.cjs");
|
|
3
3
|
const require_arrayAccess = require("./arrayAccess-e4H9cBfh.cjs");
|
|
4
|
-
const require_surfaceBuilders = require("./surfaceBuilders-
|
|
5
|
-
const require_blueprintSketcher = require("./blueprintSketcher-
|
|
6
|
-
const require_helpers = require("./helpers-
|
|
7
|
-
const require_blueprint = require("./blueprint-
|
|
4
|
+
const require_surfaceBuilders = require("./surfaceBuilders-Biqx51el.cjs");
|
|
5
|
+
const require_blueprintSketcher = require("./blueprintSketcher-gXVPrPlj.cjs");
|
|
6
|
+
const require_helpers = require("./helpers-BfkBvokP.cjs");
|
|
7
|
+
const require_blueprint = require("./blueprint-DUnNPwQL.cjs");
|
|
8
8
|
//#region src/2d/blueprints/cannedBlueprints.ts
|
|
9
9
|
/**
|
|
10
10
|
* Create a regular polygon blueprint inscribed in a circle of the given radius.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { i as wasmIndex, n as bug } from "./bug-BdOHwn_e.js";
|
|
2
|
-
import {
|
|
2
|
+
import { P as unwrap, s as safeIndex } from "./errors-MHLiNE-C.js";
|
|
3
3
|
import { r as lastOrThrow } from "./arrayAccess-DrUGPADn.js";
|
|
4
|
-
import { v as zip } from "./surfaceBuilders-
|
|
5
|
-
import { a as Blueprints, i as CompoundBlueprint, l as intersectCurves, r as organiseBlueprints, t as BlueprintSketcher, u as Flatbush } from "./blueprintSketcher-
|
|
6
|
-
import { _ as samePoint$1, b as subtract2d,
|
|
7
|
-
import {
|
|
4
|
+
import { v as zip } from "./surfaceBuilders-BryY-i0F.js";
|
|
5
|
+
import { a as Blueprints, i as CompoundBlueprint, l as intersectCurves, r as organiseBlueprints, t as BlueprintSketcher, u as Flatbush } from "./blueprintSketcher-gMuUUPb-.js";
|
|
6
|
+
import { _ as samePoint$1, b as subtract2d, d as crossProduct2d, o as PRECISION_INTERSECTION } from "./helpers-Du_OdHuy.js";
|
|
7
|
+
import { f as make2dSegmentCurve, t as Blueprint, x as removeDuplicatePoints } from "./blueprint-DEMSX-hc.js";
|
|
8
8
|
//#region src/2d/blueprints/cannedBlueprints.ts
|
|
9
9
|
/**
|
|
10
10
|
* Create a regular polygon blueprint inscribed in a circle of the given radius.
|