@tscircuit/rectdiff 0.0.33 → 0.0.35
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/components/SolverDebugger3d.tsx +64 -10
- package/lib/RectDiffPipeline.ts +23 -0
- package/lib/fixtures/twoNodeExpansionFixture.ts +1 -1
- package/lib/solvers/GapFillSolver/ExpandEdgesToEmptySpaceSolver.ts +2 -2
- package/lib/solvers/GapFillSolver/FindSegmentsWithAdjacentEmptySpaceSolver.ts +1 -1
- package/lib/solvers/GapFillSolver/GapFillSolverPipeline.ts +2 -2
- package/lib/solvers/OuterLayerContainmentMergeSolver/OuterLayerContainmentMergeSolver.ts +311 -0
- package/lib/solvers/RectDiffExpansionSolver/RectDiffExpansionSolver.ts +5 -2
- package/lib/solvers/RectDiffGridSolverPipeline/RectDiffGridSolverPipeline.ts +8 -5
- package/lib/solvers/RectDiffGridSolverPipeline/buildObstacleIndexes.ts +6 -6
- package/lib/solvers/RectDiffSeedingSolver/RectDiffSeedingSolver.ts +4 -4
- package/lib/solvers/RectDiffSeedingSolver/computeCandidates3D.ts +1 -1
- package/lib/solvers/RectDiffSeedingSolver/computeEdgeCandidates3D.ts +1 -1
- package/lib/solvers/RectDiffSeedingSolver/longestFreeSpanAroundZ.ts +1 -1
- package/lib/types/capacity-mesh-types.ts +1 -1
- package/lib/types/srj-types.ts +1 -0
- package/lib/utils/expandRectFromSeed.ts +1 -1
- package/lib/utils/finalizeRects.ts +1 -1
- package/lib/utils/isFullyOccupiedAtPoint.ts +1 -1
- package/lib/utils/isSelfRect.ts +1 -1
- package/lib/utils/rectToTree.ts +2 -2
- package/lib/utils/renderObstacleClearance.ts +1 -1
- package/lib/utils/resizeSoftOverlaps.ts +1 -1
- package/lib/utils/sameTreeRect.ts +1 -1
- package/lib/utils/searchStrip.ts +1 -1
- package/lib/utils/z-filter.ts +43 -0
- package/package.json +6 -2
- package/tests/solver/arduino-uno-inner2-ground-bottom-power/__snapshots__/arduino-uno-inner2-ground-bottom-power.snap.svg +1 -1
- package/tests/solver/arduino-uno-inner2-ground-inner1-power/__snapshots__/arduino-uno-inner2-ground-inner1-power.snap.svg +3 -3
- package/tests/solver/bugreport08-e3ec95/__snapshots__/bugreport08-e3ec95.snap.svg +1 -1
- package/tests/solver/bugreport22-2a75ce/__snapshots__/bugreport22-2a75ce.snap.svg +1 -1
- package/tests/solver/bugreport24-05597c/__snapshots__/bugreport24-05597c.snap.svg +1 -1
- package/tests/solver/repros/merge-single-layer-node/__snapshots__/merge-single-layer-node.snap.svg +44 -0
- package/tests/z-filter.test.ts +33 -0
- package/dist/index.d.ts +0 -381
- package/dist/index.js +0 -2764
package/tests/solver/repros/merge-single-layer-node/__snapshots__/merge-single-layer-node.snap.svg
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<svg width="640" height="1794" viewBox="0 0 640 1794" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="white"/><g><polyline data-points="-10,-5 10,-5 10,5 -10,5 -10,-5" data-type="line" data-label="bounds" points="40,442.8983333333334 600,442.8983333333334 600,162.89833333333343 40,162.89833333333343 40,442.8983333333334" fill="none" stroke="#111827" stroke-width="2.8000000000000003"/></g><g><polyline data-points="-10,-18.959583333333335 10,-18.959583333333335 10,-8.959583333333335 -10,-8.959583333333335 -10,-18.959583333333335" data-type="line" data-label="bounds" points="40,833.7666666666668 600,833.7666666666668 600,553.7666666666668 40,553.7666666666668 40,833.7666666666668" fill="none" stroke="#111827" stroke-width="2.8000000000000003"/></g><g><polyline data-points="-10,-34.034166666666664 10,-34.034166666666664 10,-24.034166666666664 -10,-24.034166666666664 -10,-34.034166666666664" data-type="line" data-label="bounds" points="40,1255.855 600,1255.855 600,975.855 40,975.855 40,1255.855" fill="none" stroke="#111827" stroke-width="2.8000000000000003"/></g><g><polyline data-points="-10,-49.24249999999999 10,-49.24249999999999 10,-39.24249999999999 -10,-39.24249999999999 -10,-49.24249999999999" data-type="line" data-label="bounds" points="40,1681.688333333333 600,1681.688333333333 600,1401.688333333333 40,1401.688333333333 40,1681.688333333333" fill="none" stroke="#111827" stroke-width="2.8000000000000003"/></g><g><rect data-type="rect" data-label="node" data-x="-2.15" data-y="2.54" x="245.8" y="223.37833333333344" width="28" height="16.799999999999983" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-2.15" data-y="1.27" x="245.8" y="258.93833333333345" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-2.15" data-y="0" x="245.8" y="294.49833333333345" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-2.15" data-y="-1.27" x="245.8" y="330.05833333333345" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-2.15" data-y="-2.54" x="245.8" y="365.61833333333345" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="2.15" data-y="-2.54" x="366.2" y="365.61833333333345" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="2.15" data-y="-1.27" x="366.2" y="330.05833333333345" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="2.15" data-y="0" x="366.2" y="294.49833333333345" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="2.15" data-y="1.27" x="366.2" y="258.93833333333345" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="2.15" data-y="2.54" x="366.2" y="223.37833333333344" width="28" height="16.799999999999983" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-2.1500000000000004" data-y="4.16" x="252.24" y="177.45833333333343" width="15.120000000000005" height="17.920000000000016" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.1300000000000006" data-y="4.16" x="280.79999999999995" y="177.45833333333343" width="15.120000000000005" height="17.920000000000016" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.97" data-y="-3.2861261293105146" x="422.20000000000005" y="387.34986495402785" width="17.91999999999996" height="15.120000000000005" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.97" data-y="-4.306126129310515" x="422.20000000000005" y="415.90986495402785" width="17.91999999999996" height="15.120000000000005" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="4.15" data-y="0.823873870689486" x="422.20000000000005" y="271.42986495402783" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="4.15" data-y="-0.44612612931051393" x="422.20000000000005" y="306.98986495402784" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="4.15" data-y="-1.7161261293105137" x="422.20000000000005" y="342.54986495402784" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="8.45" data-y="-1.7161261293105137" x="542.5999999999999" y="342.54986495402784" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="8.45" data-y="-0.44612612931051393" x="542.5999999999999" y="306.98986495402784" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="8.45" data-y="0.823873870689486" x="542.5999999999999" y="271.42986495402783" width="28" height="16.799999999999955" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.9699999999999998" data-y="-2.516126" x="422.2" y="359.3498613333334" width="17.920000000000016" height="28" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="4.2425" data-y="-4.788063" x="427.38" y="431.02986133333343" width="22.819999999999993" height="11.868471999999997" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="4.1075" data-y="-3.7961259999999992" x="419.82" y="402.46986133333337" width="30.379999999999995" height="13.440000000000055" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="4.47" data-y="-4.306126" x="440.12" y="415.9098613333334" width="10.079999999999984" height="15.120000000000005" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="4.47" data-y="-2.786126" x="440.12" y="359.3498613333334" width="10.079999999999984" height="43.120000000000005" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="8.45" data-y="-3.508063" x="542.5999999999999" y="359.3498613333334" width="28" height="83.548472" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="8.469999999999999" data-y="-1.081126" x="543.72" y="323.7898613333334" width="26.87999999999988" height="18.75999999999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="8.469999999999999" data-y="0.188874" x="543.72" y="288.2298613333334" width="26.87999999999988" height="18.75999999999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="4.3625" data-y="-1.081126" x="434.1" y="323.7898613333334" width="16.099999999999966" height="18.75999999999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="4.3625" data-y="0.188874" x="434.1" y="288.2298613333334" width="16.099999999999966" height="18.75999999999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.3824999999999994" data-y="-3.0111259999999995" x="409.59999999999997" y="355.14986133333343" width="10.220000000000027" height="64.12" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.424999999999999" data-y="-4.728063000000001" x="409.59999999999997" y="427.6698613333335" width="12.599999999999966" height="15.228471999999954" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="2.925" data-y="-2.54" x="394.20000000000005" y="365.6183333333334" width="15.39999999999992" height="16.80000000000001" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="7.725" data-y="-3.4330629999999998" x="530" y="355.14986133333343" width="12.599999999999909" height="87.74847199999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-2.1500000000000004" data-y="3.34" x="245.79999999999998" y="195.37833333333344" width="28.00000000000003" height="28" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-2.1500000000000004" data-y="1.9049999999999998" x="245.79999999999998" y="240.17833333333343" width="28.00000000000003" height="18.76000000000002" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="2.1500000000000004" data-y="1.9049999999999998" x="366.2" y="240.17833333333343" width="28.000000000000057" height="18.76000000000002" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="6.074999999999999" data-y="-3.283063" x="450.19999999999993" y="346.7498613333334" width="79.80000000000007" height="96.14847200000003" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="9.475" data-y="-1.938063" x="570.5999999999999" y="271.4298613333334" width="29.40000000000009" height="171.46847200000002" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="6.299999999999999" data-y="-0.22112599999999993" x="450.19999999999993" y="271.4298613333334" width="92.39999999999998" height="75.32" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="2.6499999999999995" data-y="0.635" x="366.2" y="275.7383333333334" width="55.99999999999994" height="18.760000000000048" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="2.425" data-y="-1.9049999999999998" x="366.2" y="346.8583333333334" width="43.39999999999998" height="18.75999999999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.9249999999999998" data-y="0.635" x="245.79999999999998" y="275.7383333333334" width="40.60000000000005" height="18.760000000000048" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.1499999999999995" data-y="-1.268063" x="394.20000000000005" y="330.05833333333345" width="27.999999999999886" height="16.69152799999995" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.1499999999999995" data-y="0" x="394.20000000000005" y="294.49833333333345" width="27.999999999999886" height="16.799999999999955" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-2.1500000000000004" data-y="-1.9049999999999998" x="245.79999999999998" y="346.8583333333334" width="28.00000000000003" height="18.75999999999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="6.325" data-y="1.9819369999999998" x="394.20000000000005" y="223.37833333333344" width="205.79999999999995" height="48.05152799999996" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-6.325" data-y="1.0799999999999998" x="40" y="162.89833333333343" width="205.79999999999998" height="219.51999999999998" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="5.825" data-y="3.92" x="366.2" y="162.89833333333343" width="233.8" height="60.48000000000002" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="0.6200000000000001" data-y="4.42" x="308.52" y="162.89833333333343" width="57.68000000000001" height="32.48000000000002" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.9250000000000003" data-y="-0.635" x="245.79999999999998" y="311.2983333333334" width="40.599999999999994" height="18.760000000000048" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="2.6499999999999995" data-y="-0.635" x="366.2" y="311.2983333333334" width="55.99999999999994" height="18.760000000000048" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-3.4000000000000004" data-y="-3.92" x="40" y="382.4183333333334" width="369.59999999999997" height="60.48000000000002" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="0.22499999999999987" data-y="1.2099999999999995" x="286.4" y="195.37833333333344" width="79.80000000000001" height="147.27999999999997" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="-2.1300000000000003" x="273.8" y="342.6583333333334" width="92.39999999999998" height="39.75999999999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.6074999999999995" data-y="-2.516126" x="419.82" y="359.3498613333334" width="2.3799999999999955" height="28" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.7424999999999993" data-y="-4.788063" x="422.19999999999993" y="431.02986133333343" width="5.180000000000064" height="11.868471999999997" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.6075000000000004" data-y="-4.246126" x="419.82" y="415.9098613333334" width="2.3800000000000523" height="11.760000000000048" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.6075000000000004" data-y="-3.2861259999999994" x="419.82" y="387.3498613333334" width="2.3800000000000523" height="15.119999999999948" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="7.969999999999999" data-y="-1.081126" x="542.5999999999999" y="323.7898613333334" width="1.1200000000001182" height="18.75999999999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="7.969999999999999" data-y="0.188874" x="542.5999999999999" y="288.2298613333334" width="1.1200000000001182" height="18.75999999999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.8624999999999994" data-y="-1.081126" x="422.19999999999993" y="323.7898613333334" width="11.900000000000091" height="18.75999999999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.8624999999999994" data-y="0.188874" x="422.19999999999993" y="288.2298613333334" width="11.900000000000091" height="18.75999999999999" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.5324999999999998" data-y="-4.306126000000001" x="418" y="419.26986133333344" width="1.8199999999999932" height="8.400000000000034" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.5324999999999998" data-y="-1.7161259999999996" x="418" y="346.7498613333334" width="1.8199999999999932" height="8.400000000000034" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="7.874999999999999" data-y="-1.7161259999999998" x="538.4" y="346.7498613333334" width="4.199999999999932" height="8.400000000000034" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.425" data-y="3.34" x="273.8" y="195.37833333333344" width="12.599999999999966" height="28" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.425" data-y="1.9049999999999998" x="273.8" y="240.17833333333343" width="12.599999999999966" height="18.76000000000002" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.1499999999999995" data-y="1.0469369999999998" x="394.20000000000005" y="271.4298613333334" width="27.999999999999886" height="4.308472000000052" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="2.925" data-y="-1.568063" x="394.20000000000005" y="346.74986133333346" width="15.39999999999992" height="0.10847199999994928" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.4249999999999996" data-y="0.22500000000000003" x="273.8" y="294.49833333333345" width="12.600000000000023" height="4.199999999999989" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.4249999999999996" data-y="1.045" x="273.8" y="271.5383333333334" width="12.600000000000023" height="4.2000000000000455" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-2.535" data-y="4.42" x="245.79999999999998" y="162.89833333333343" width="6.440000000000026" height="32.48000000000002" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.6350000000000002" data-y="3.925" x="295.91999999999996" y="190.61833333333342" width="12.600000000000023" height="4.760000000000019" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.6350000000000002" data-y="4.655" x="295.91999999999996" y="162.89833333333343" width="12.600000000000023" height="19.319999999999993" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.425" data-y="-1.045" x="273.8" y="330.0583333333334" width="12.599999999999966" height="4.2000000000000455" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.425" data-y="-0.22500000000000003" x="273.8" y="307.0983333333334" width="12.599999999999966" height="4.199999999999989" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.5749999999999997" data-y="-1.2700000000000002" x="273.8" y="334.25833333333344" width="4.199999999999989" height="8.399999999999977" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.4249999999999998" data-y="2.54" x="273.8" y="223.37833333333344" width="12.599999999999966" height="16.799999999999983" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.6400000000000006" data-y="4.16" x="267.36" y="177.45833333333343" width="13.43999999999994" height="17.920000000000016" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.6075" data-y="-1.791126064655257" x="419.82" y="346.74986133333346" width="2.3800000000000523" height="12.600003620694338" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.5749999999999997" data-y="0" x="273.8" y="298.69833333333344" width="4.199999999999989" height="8.399999999999977" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.7850000000000006" data-y="4.16" x="295.91999999999996" y="182.21833333333342" width="4.2000000000000455" height="8.400000000000006" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.5749999999999997" data-y="1.27" x="273.8" y="263.13833333333343" width="4.199999999999989" height="8.399999999999977" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="1.4949999999999999" x="278" y="258.93833333333345" width="8.399999999999977" height="4.199999999999989" fill="#dbeafe" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.3500000000000005" data-y="-1.716126129310514" x="409.6" y="346.7498649540278" width="8.399999999999977" height="8.399999999999977" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="0" x="278" y="298.69833333333344" width="8.399999999999977" height="8.399999999999977" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.5600000000000005" data-y="4.16" x="300.12" y="182.21833333333342" width="8.399999999999977" height="8.400000000000006" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.3500000000000005" data-y="-4.306126129310515" x="409.6" y="419.26986495402787" width="8.399999999999977" height="8.399999999999977" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="1.27" x="278" y="263.13833333333343" width="8.399999999999977" height="8.399999999999977" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="-1.27" x="278" y="334.25833333333344" width="8.399999999999977" height="8.399999999999977" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="7.649999999999999" data-y="-1.716126129310514" x="530" y="346.7498649540278" width="8.399999999999977" height="8.399999999999977" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.35" data-y="-14.594583333333334" x="278" y="697.9666666666668" width="8.399999999999977" height="27.159999999999968" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.35" data-y="-13.324583333333335" x="278" y="662.4066666666668" width="8.399999999999977" height="27.160000000000082" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="7.65" data-y="-17.392646333333335" x="530" y="746.0181946666669" width="8.400000000000091" height="87.74847199999988" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.35" data-y="-17.579583333333336" x="278" y="756.4866666666669" width="8.399999999999977" height="77.27999999999986" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.03" data-y="-17.434583333333336" x="286.4" y="756.4866666666669" width="9.520000000000039" height="69.15999999999997" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-5.75" data-y="-17.579583333333336" x="40" y="756.4866666666669" width="238" height="77.27999999999986" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-5.75" data-y="-14.034583333333334" x="40" y="654.0066666666668" width="238" height="83.71999999999991" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.3499999999999996" data-y="-16.970709333333335" x="409.59999999999997" y="746.0181946666669" width="8.400000000000034" height="64.11999999999989" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.5600000000000004" data-y="-17.579583333333336" x="300.12" y="756.4866666666669" width="8.399999999999977" height="77.27999999999986" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-5.205" data-y="-15.864583333333334" x="40" y="737.7266666666668" width="268.52" height="18.759999999999877" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="1.3949999999999998" data-y="-17.242646333333333" x="308.52" y="737.6181946666668" width="101.08000000000004" height="96.14847199999997" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="8.9" data-y="-17.242646333333333" x="538.4000000000001" y="737.6181946666668" width="61.59999999999991" height="96.14847199999997" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="5.5" data-y="-17.242646333333333" x="418" y="737.6181946666668" width="112" height="96.14847199999997" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-5.355" data-y="-10.749583333333334" x="40" y="553.7666666666668" width="260.12" height="100.24000000000001" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="4.795" data-y="-9.454583333333336" x="308.52" y="553.7666666666668" width="291.48" height="27.72000000000014" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="4.645" data-y="-12.737646333333334" x="300.12" y="581.4866666666668" width="299.88" height="156.131528" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.9550000000000004" data-y="-14.032646333333334" x="286.4" y="654.0066666666668" width="13.720000000000027" height="83.61152800000002" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.9550000000000005" data-y="-18.814583333333335" x="286.4" y="825.6466666666669" width="13.720000000000027" height="8.11999999999989" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.7850000000000005" data-y="-17.434583333333336" x="295.92" y="756.4866666666669" width="4.199999999999989" height="69.15999999999997" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.35" data-y="-15.454583333333334" x="278" y="733.5266666666669" width="8.399999999999977" height="4.199999999999818" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.8050000000000002" data-y="-15.527646333333335" x="286.4" y="737.6181946666668" width="22.120000000000005" height="0.10847200000000612" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.3499999999999996" data-y="-18.687646397988594" x="409.59999999999997" y="818.5381982873613" width="8.400000000000034" height="15.228468379305468" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.5600000000000005" data-y="-9.304583333333333" x="300.12" y="553.7666666666668" width="8.399999999999977" height="19.319999999999936" fill="#fef3c7" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.3500000000000005" data-y="-15.675709462643848" x="409.6" y="737.6181982873611" width="8.399999999999977" height="8.400000000000091" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="-13.959583333333335" x="278" y="689.5666666666668" width="8.399999999999977" height="8.399999999999977" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.5600000000000005" data-y="-9.799583333333334" x="300.12" y="573.0866666666668" width="8.399999999999977" height="8.399999999999977" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.3500000000000005" data-y="-18.265709462643848" x="409.6" y="810.1381982873612" width="8.399999999999977" height="8.399999999999864" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="-12.689583333333335" x="278" y="654.0066666666668" width="8.399999999999977" height="8.399999999999977" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="-15.229583333333334" x="278" y="725.1266666666668" width="8.399999999999977" height="8.400000000000091" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="7.649999999999999" data-y="-15.675709462643848" x="530" y="737.6181982873611" width="8.399999999999977" height="8.400000000000091" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="-29.034166666666664" x="40" y="975.855" width="560" height="280" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.3500000000000005" data-y="-30.750292795977177" x="409.6" y="1159.7065316206945" width="8.399999999999977" height="8.399999999999864" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="-29.034166666666664" x="278" y="1111.6550000000002" width="8.399999999999977" height="8.399999999999636" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.5600000000000005" data-y="-24.874166666666664" x="300.12" y="995.1750000000001" width="8.399999999999977" height="8.399999999999864" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.3500000000000005" data-y="-33.34029279597718" x="409.6" y="1232.2265316206945" width="8.399999999999977" height="8.399999999999864" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="-27.764166666666664" x="278" y="1076.095" width="8.399999999999977" height="8.399999999999864" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="-30.304166666666664" x="278" y="1147.2150000000001" width="8.399999999999977" height="8.399999999999864" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="7.649999999999999" data-y="-30.750292795977177" x="530" y="1159.7065316206945" width="8.399999999999977" height="8.399999999999864" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="-44.24249999999999" x="40" y="1401.688333333333" width="560" height="280" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-0.5600000000000005" data-y="-40.082499999999996" x="300.12" y="1421.0083333333332" width="8.399999999999977" height="8.400000000000091" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="3.3500000000000005" data-y="-48.548626129310506" x="409.6" y="1658.0598649540275" width="8.399999999999977" height="8.400000000000091" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="-42.97249999999999" x="278" y="1501.9283333333333" width="8.399999999999977" height="8.399999999999636" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="-1.3499999999999996" data-y="-45.512499999999996" x="278" y="1573.0483333333332" width="8.399999999999977" height="8.400000000000091" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><g><rect data-type="rect" data-label="node" data-x="7.649999999999999" data-y="-45.95862612931051" x="530" y="1585.539864954028" width="8.399999999999977" height="8.399999999999636" fill="red" stroke="black" stroke-width="0.03571428571428571"/></g><text data-type="text" data-label="Layer z=0" data-x="0" data-y="6.306666666666667" x="320" y="126.31166666666675" fill="black" font-size="14" font-family="sans-serif" text-anchor="end" dominant-baseline="text-before-edge">Layer z=0</text><text data-type="text" data-label="Layer z=1" data-x="0" data-y="-8.362916666666667" x="320" y="537.0600000000002" fill="black" font-size="14" font-family="sans-serif" text-anchor="end" dominant-baseline="text-before-edge">Layer z=1</text><text data-type="text" data-label="Layer z=2" data-x="0" data-y="-22.3675" x="320" y="929.1883333333334" fill="black" font-size="14" font-family="sans-serif" text-anchor="end" dominant-baseline="text-before-edge">Layer z=2</text><text data-type="text" data-label="Layer z=3" data-x="0" data-y="-37.57583333333333" x="320" y="1355.0216666666665" fill="black" font-size="14" font-family="sans-serif" text-anchor="end" dominant-baseline="text-before-edge">Layer z=3</text><g id="crosshair" style="display: none"><line id="crosshair-h" y1="0" y2="1794" stroke="#666" stroke-width="0.5"/><line id="crosshair-v" x1="0" x2="640" stroke="#666" stroke-width="0.5"/><text id="coordinates" font-family="monospace" font-size="12" fill="#666"></text></g><script><![CDATA[
|
|
2
|
+
document.currentScript.parentElement.addEventListener('mousemove', (e) => {
|
|
3
|
+
const svg = e.currentTarget;
|
|
4
|
+
const rect = svg.getBoundingClientRect();
|
|
5
|
+
const x = e.clientX - rect.left;
|
|
6
|
+
const y = e.clientY - rect.top;
|
|
7
|
+
const crosshair = svg.getElementById('crosshair');
|
|
8
|
+
const h = svg.getElementById('crosshair-h');
|
|
9
|
+
const v = svg.getElementById('crosshair-v');
|
|
10
|
+
const coords = svg.getElementById('coordinates');
|
|
11
|
+
|
|
12
|
+
crosshair.style.display = 'block';
|
|
13
|
+
h.setAttribute('x1', '0');
|
|
14
|
+
h.setAttribute('x2', '640');
|
|
15
|
+
h.setAttribute('y1', y);
|
|
16
|
+
h.setAttribute('y2', y);
|
|
17
|
+
v.setAttribute('x1', x);
|
|
18
|
+
v.setAttribute('x2', x);
|
|
19
|
+
v.setAttribute('y1', '0');
|
|
20
|
+
v.setAttribute('y2', '1794');
|
|
21
|
+
|
|
22
|
+
// Calculate real coordinates using inverse transformation
|
|
23
|
+
const matrix = {"a":28,"c":0,"e":320,"b":0,"d":-28,"f":302.8983333333334};
|
|
24
|
+
// Manually invert and apply the affine transform
|
|
25
|
+
// Since we only use translate and scale, we can directly compute:
|
|
26
|
+
// x' = (x - tx) / sx
|
|
27
|
+
// y' = (y - ty) / sy
|
|
28
|
+
const sx = matrix.a;
|
|
29
|
+
const sy = matrix.d;
|
|
30
|
+
const tx = matrix.e;
|
|
31
|
+
const ty = matrix.f;
|
|
32
|
+
const realPoint = {
|
|
33
|
+
x: (x - tx) / sx,
|
|
34
|
+
y: (y - ty) / sy // Flip y back since we used negative scale
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
|
|
38
|
+
coords.setAttribute('x', (x + 5).toString());
|
|
39
|
+
coords.setAttribute('y', (y - 5).toString());
|
|
40
|
+
});
|
|
41
|
+
document.currentScript.parentElement.addEventListener('mouseleave', () => {
|
|
42
|
+
document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
|
|
43
|
+
});
|
|
44
|
+
]]></script></svg>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { expect, test } from "bun:test"
|
|
2
|
+
import { matchesExactZFilter, parseZFilterInput } from "../lib/utils/z-filter"
|
|
3
|
+
|
|
4
|
+
test("parseZFilterInput parses a single z", () => {
|
|
5
|
+
expect(parseZFilterInput("1")).toEqual([1])
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
test("parseZFilterInput parses multiple z values", () => {
|
|
9
|
+
expect(parseZFilterInput("1, 2,3")).toEqual([1, 2, 3])
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
test("parseZFilterInput normalizes duplicates and ordering", () => {
|
|
13
|
+
expect(parseZFilterInput("3,1,3,2")).toEqual([1, 2, 3])
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
test("parseZFilterInput returns null for empty input", () => {
|
|
17
|
+
expect(parseZFilterInput(" ")).toBeNull()
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
test("parseZFilterInput returns null for invalid input", () => {
|
|
21
|
+
expect(parseZFilterInput("1,a")).toBeNull()
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
test("matchesExactZFilter only matches exact single-layer selections", () => {
|
|
25
|
+
expect(matchesExactZFilter([1], [1])).toBe(true)
|
|
26
|
+
expect(matchesExactZFilter([1, 2], [1])).toBe(false)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test("matchesExactZFilter only matches exact shared-layer selections", () => {
|
|
30
|
+
expect(matchesExactZFilter([1, 2, 3], [1, 2, 3])).toBe(true)
|
|
31
|
+
expect(matchesExactZFilter([1, 2], [1, 2, 3])).toBe(false)
|
|
32
|
+
expect(matchesExactZFilter([1, 2, 3, 4], [1, 2, 3])).toBe(false)
|
|
33
|
+
})
|
package/dist/index.d.ts
DELETED
|
@@ -1,381 +0,0 @@
|
|
|
1
|
-
import { BaseSolver, BasePipelineSolver, PipelineStep } from '@tscircuit/solver-utils';
|
|
2
|
-
import { GraphicsObject } from 'graphics-debug';
|
|
3
|
-
import Flatbush from 'flatbush';
|
|
4
|
-
import RBush from 'rbush';
|
|
5
|
-
import { Bounds } from '@tscircuit/math-utils';
|
|
6
|
-
|
|
7
|
-
type TraceId = string;
|
|
8
|
-
interface SimpleRouteJson {
|
|
9
|
-
layerCount: number;
|
|
10
|
-
minTraceWidth: number;
|
|
11
|
-
minViaDiameter?: number;
|
|
12
|
-
obstacles: Obstacle[];
|
|
13
|
-
connections: Array<SimpleRouteConnection>;
|
|
14
|
-
bounds: {
|
|
15
|
-
minX: number;
|
|
16
|
-
maxX: number;
|
|
17
|
-
minY: number;
|
|
18
|
-
maxY: number;
|
|
19
|
-
};
|
|
20
|
-
outline?: Array<{
|
|
21
|
-
x: number;
|
|
22
|
-
y: number;
|
|
23
|
-
}>;
|
|
24
|
-
}
|
|
25
|
-
interface Obstacle {
|
|
26
|
-
type: "rect";
|
|
27
|
-
layers: string[];
|
|
28
|
-
zLayers?: number[];
|
|
29
|
-
center: {
|
|
30
|
-
x: number;
|
|
31
|
-
y: number;
|
|
32
|
-
};
|
|
33
|
-
width: number;
|
|
34
|
-
height: number;
|
|
35
|
-
connectedTo: TraceId[];
|
|
36
|
-
netIsAssignable?: boolean;
|
|
37
|
-
offBoardConnectsTo?: TraceId[];
|
|
38
|
-
}
|
|
39
|
-
interface SimpleRouteConnection {
|
|
40
|
-
name: string;
|
|
41
|
-
netConnectionName?: string;
|
|
42
|
-
nominalTraceWidth?: number;
|
|
43
|
-
pointsToConnect: Array<{
|
|
44
|
-
x: number;
|
|
45
|
-
y: number;
|
|
46
|
-
layer: string;
|
|
47
|
-
pointId?: string;
|
|
48
|
-
pcb_port_id?: string;
|
|
49
|
-
}>;
|
|
50
|
-
externallyConnectedPointIds?: string[][];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
type XYRect = {
|
|
54
|
-
x: number;
|
|
55
|
-
y: number;
|
|
56
|
-
width: number;
|
|
57
|
-
height: number;
|
|
58
|
-
};
|
|
59
|
-
type GridFill3DOptions = {
|
|
60
|
-
gridSizes?: number[];
|
|
61
|
-
initialCellRatio?: number;
|
|
62
|
-
maxAspectRatio?: number | null;
|
|
63
|
-
minSingle: {
|
|
64
|
-
width: number;
|
|
65
|
-
height: number;
|
|
66
|
-
};
|
|
67
|
-
minMulti: {
|
|
68
|
-
width: number;
|
|
69
|
-
height: number;
|
|
70
|
-
minLayers: number;
|
|
71
|
-
};
|
|
72
|
-
preferMultiLayer?: boolean;
|
|
73
|
-
maxMultiLayerSpan?: number;
|
|
74
|
-
};
|
|
75
|
-
type Candidate3D = {
|
|
76
|
-
x: number;
|
|
77
|
-
y: number;
|
|
78
|
-
z: number;
|
|
79
|
-
distance: number;
|
|
80
|
-
/** Larger values mean more multi-layer potential at this seed. */
|
|
81
|
-
zSpanLen?: number;
|
|
82
|
-
/** Marked when the seed came from the edge analysis pass. */
|
|
83
|
-
isEdgeSeed?: boolean;
|
|
84
|
-
};
|
|
85
|
-
type Placed3D = {
|
|
86
|
-
rect: XYRect;
|
|
87
|
-
zLayers: number[];
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
type CapacityMeshNodeId = string;
|
|
91
|
-
interface CapacityMeshNode {
|
|
92
|
-
capacityMeshNodeId: string;
|
|
93
|
-
center: {
|
|
94
|
-
x: number;
|
|
95
|
-
y: number;
|
|
96
|
-
};
|
|
97
|
-
width: number;
|
|
98
|
-
height: number;
|
|
99
|
-
layer: string;
|
|
100
|
-
availableZ: number[];
|
|
101
|
-
_depth?: number;
|
|
102
|
-
_completelyInsideObstacle?: boolean;
|
|
103
|
-
_containsObstacle?: boolean;
|
|
104
|
-
_containsTarget?: boolean;
|
|
105
|
-
_targetConnectionName?: string;
|
|
106
|
-
_strawNode?: boolean;
|
|
107
|
-
_strawParentCapacityMeshNodeId?: CapacityMeshNodeId;
|
|
108
|
-
_adjacentNodeIds?: CapacityMeshNodeId[];
|
|
109
|
-
_parent?: CapacityMeshNode;
|
|
110
|
-
}
|
|
111
|
-
type RTreeRect = XYRect & {
|
|
112
|
-
minX: number;
|
|
113
|
-
minY: number;
|
|
114
|
-
maxX: number;
|
|
115
|
-
maxY: number;
|
|
116
|
-
zLayers: number[];
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
interface SegmentWithAdjacentEmptySpace {
|
|
120
|
-
parent: CapacityMeshNode;
|
|
121
|
-
start: {
|
|
122
|
-
x: number;
|
|
123
|
-
y: number;
|
|
124
|
-
};
|
|
125
|
-
end: {
|
|
126
|
-
x: number;
|
|
127
|
-
y: number;
|
|
128
|
-
};
|
|
129
|
-
z: number;
|
|
130
|
-
facingDirection: "x+" | "x-" | "y+" | "y-";
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Find edges with adjacent empty space in the mesh
|
|
134
|
-
*
|
|
135
|
-
* Do this by iterating over each edge of the rect (each step is one edge)
|
|
136
|
-
* and checking if the is completely covered by any other edge
|
|
137
|
-
*
|
|
138
|
-
* If it is completely covered, then it doesn't have an adjacent empty space,
|
|
139
|
-
* continue
|
|
140
|
-
*
|
|
141
|
-
* If it is partially uncovered, then divide it into uncovered segments and add
|
|
142
|
-
* each uncovered segment as a new edge with an adjacent empty space
|
|
143
|
-
*/
|
|
144
|
-
declare class FindSegmentsWithAdjacentEmptySpaceSolver extends BaseSolver {
|
|
145
|
-
private input;
|
|
146
|
-
allEdges: Array<SegmentWithAdjacentEmptySpace>;
|
|
147
|
-
unprocessedEdges: Array<SegmentWithAdjacentEmptySpace>;
|
|
148
|
-
segmentsWithAdjacentEmptySpace: Array<SegmentWithAdjacentEmptySpace>;
|
|
149
|
-
edgeSpatialIndex: Flatbush;
|
|
150
|
-
lastCandidateEdge: SegmentWithAdjacentEmptySpace | null;
|
|
151
|
-
lastOverlappingEdges: Array<SegmentWithAdjacentEmptySpace> | null;
|
|
152
|
-
lastUncoveredSegments: Array<SegmentWithAdjacentEmptySpace> | null;
|
|
153
|
-
constructor(input: {
|
|
154
|
-
meshNodes: CapacityMeshNode[];
|
|
155
|
-
});
|
|
156
|
-
_step(): void;
|
|
157
|
-
getOutput(): {
|
|
158
|
-
segmentsWithAdjacentEmptySpace: Array<SegmentWithAdjacentEmptySpace>;
|
|
159
|
-
};
|
|
160
|
-
visualize(): Required<GraphicsObject>;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
type ExpandEdgesToEmptySpaceSolverInput = {
|
|
164
|
-
inputMeshNodes: CapacityMeshNode[];
|
|
165
|
-
segmentsWithAdjacentEmptySpace: Array<SegmentWithAdjacentEmptySpace>;
|
|
166
|
-
boardVoid?: {
|
|
167
|
-
boardVoidRects: XYRect[];
|
|
168
|
-
layerCount: number;
|
|
169
|
-
};
|
|
170
|
-
};
|
|
171
|
-
interface ExpandedSegment {
|
|
172
|
-
segment: SegmentWithAdjacentEmptySpace;
|
|
173
|
-
newNode: CapacityMeshNode;
|
|
174
|
-
}
|
|
175
|
-
declare class ExpandEdgesToEmptySpaceSolver extends BaseSolver {
|
|
176
|
-
private input;
|
|
177
|
-
unprocessedSegments: Array<SegmentWithAdjacentEmptySpace>;
|
|
178
|
-
expandedSegments: Array<ExpandedSegment>;
|
|
179
|
-
lastSegment: SegmentWithAdjacentEmptySpace | null;
|
|
180
|
-
lastSearchBounds: Bounds | null;
|
|
181
|
-
lastCollidingNodes: CapacityMeshNode[] | null;
|
|
182
|
-
lastSearchCorner1: {
|
|
183
|
-
x: number;
|
|
184
|
-
y: number;
|
|
185
|
-
} | null;
|
|
186
|
-
lastSearchCorner2: {
|
|
187
|
-
x: number;
|
|
188
|
-
y: number;
|
|
189
|
-
} | null;
|
|
190
|
-
lastExpandedSegment: ExpandedSegment | null;
|
|
191
|
-
rectSpatialIndex: RBush<CapacityMeshNode>;
|
|
192
|
-
constructor(input: ExpandEdgesToEmptySpaceSolverInput);
|
|
193
|
-
_step(): void;
|
|
194
|
-
getOutput(): {
|
|
195
|
-
expandedSegments: ExpandedSegment[];
|
|
196
|
-
};
|
|
197
|
-
visualize(): Required<GraphicsObject>;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
type GapFillSolverInput = {
|
|
201
|
-
meshNodes: CapacityMeshNode[];
|
|
202
|
-
boardVoid?: {
|
|
203
|
-
boardVoidRects: XYRect[];
|
|
204
|
-
layerCount: number;
|
|
205
|
-
};
|
|
206
|
-
};
|
|
207
|
-
declare class GapFillSolverPipeline extends BasePipelineSolver<GapFillSolverInput> {
|
|
208
|
-
findSegmentsWithAdjacentEmptySpaceSolver?: FindSegmentsWithAdjacentEmptySpaceSolver;
|
|
209
|
-
expandEdgesToEmptySpaceSolver?: ExpandEdgesToEmptySpaceSolver;
|
|
210
|
-
pipelineDef: PipelineStep<any>[];
|
|
211
|
-
getOutput(): {
|
|
212
|
-
outputNodes: CapacityMeshNode[];
|
|
213
|
-
};
|
|
214
|
-
initialVisualize(): GraphicsObject;
|
|
215
|
-
finalVisualize(): GraphicsObject;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
type RectDiffSeedingSolverInput = {
|
|
219
|
-
simpleRouteJson: SimpleRouteJson;
|
|
220
|
-
obstacleIndexByLayer: Array<RBush<RTreeRect>>;
|
|
221
|
-
gridOptions?: Partial<GridFill3DOptions>;
|
|
222
|
-
boardVoidRects?: XYRect[];
|
|
223
|
-
layerNames: string[];
|
|
224
|
-
zIndexByName: Map<string, number>;
|
|
225
|
-
obstacleClearance?: number;
|
|
226
|
-
};
|
|
227
|
-
/**
|
|
228
|
-
* First phase of RectDiff: grid-based seeding and placement.
|
|
229
|
-
*
|
|
230
|
-
* This solver is responsible for walking all grid sizes and producing
|
|
231
|
-
* an initial set of placed rectangles.
|
|
232
|
-
*/
|
|
233
|
-
declare class RectDiffSeedingSolver extends BaseSolver {
|
|
234
|
-
private input;
|
|
235
|
-
private srj;
|
|
236
|
-
private layerNames;
|
|
237
|
-
private layerCount;
|
|
238
|
-
private bounds;
|
|
239
|
-
private options;
|
|
240
|
-
private boardVoidRects?;
|
|
241
|
-
private gridIndex;
|
|
242
|
-
private candidates;
|
|
243
|
-
private placed;
|
|
244
|
-
private placedIndexByLayer;
|
|
245
|
-
private hardPlacedByLayer;
|
|
246
|
-
private expansionIndex;
|
|
247
|
-
private edgeAnalysisDone;
|
|
248
|
-
private totalSeedsThisGrid;
|
|
249
|
-
private consumedSeedsThisGrid;
|
|
250
|
-
constructor(input: RectDiffSeedingSolverInput);
|
|
251
|
-
_setup(): void;
|
|
252
|
-
/** Exactly ONE grid candidate step per call. */
|
|
253
|
-
_step(): void;
|
|
254
|
-
/**
|
|
255
|
-
* One micro-step during the GRID phase: handle exactly one candidate.
|
|
256
|
-
*/
|
|
257
|
-
private _stepGrid;
|
|
258
|
-
/** Compute solver progress (0 to 1) during GRID phase. */
|
|
259
|
-
computeProgress(): number;
|
|
260
|
-
/**
|
|
261
|
-
* Output the intermediate RectDiff engine data to feed into the
|
|
262
|
-
* expansion phase solver.
|
|
263
|
-
*/
|
|
264
|
-
getOutput(): {
|
|
265
|
-
layerNames: string[];
|
|
266
|
-
layerCount: number;
|
|
267
|
-
bounds: XYRect;
|
|
268
|
-
options: Required<Omit<GridFill3DOptions, "gridSizes" | "maxMultiLayerSpan">> & {
|
|
269
|
-
gridSizes: number[];
|
|
270
|
-
maxMultiLayerSpan: number | undefined;
|
|
271
|
-
};
|
|
272
|
-
boardVoidRects: XYRect[] | undefined;
|
|
273
|
-
gridIndex: number;
|
|
274
|
-
candidates: Candidate3D[];
|
|
275
|
-
placed: Placed3D[];
|
|
276
|
-
expansionIndex: number;
|
|
277
|
-
edgeAnalysisDone: boolean;
|
|
278
|
-
totalSeedsThisGrid: number;
|
|
279
|
-
consumedSeedsThisGrid: number;
|
|
280
|
-
obstacles: Obstacle[];
|
|
281
|
-
obstacleClearance: number | undefined;
|
|
282
|
-
};
|
|
283
|
-
/** Visualization focused on the grid seeding phase. */
|
|
284
|
-
visualize(): GraphicsObject;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
type RectDiffExpansionSolverInput = {
|
|
288
|
-
layerNames: string[];
|
|
289
|
-
layerCount: number;
|
|
290
|
-
bounds: XYRect;
|
|
291
|
-
options: {
|
|
292
|
-
gridSizes: number[];
|
|
293
|
-
[key: string]: any;
|
|
294
|
-
};
|
|
295
|
-
boardVoidRects: XYRect[];
|
|
296
|
-
gridIndex: number;
|
|
297
|
-
candidates: Candidate3D[];
|
|
298
|
-
placed: Placed3D[];
|
|
299
|
-
expansionIndex: number;
|
|
300
|
-
edgeAnalysisDone: boolean;
|
|
301
|
-
totalSeedsThisGrid: number;
|
|
302
|
-
consumedSeedsThisGrid: number;
|
|
303
|
-
obstacleIndexByLayer: Array<RBush<RTreeRect>>;
|
|
304
|
-
zIndexByName: Map<string, number>;
|
|
305
|
-
layerNamesCanonical: string[];
|
|
306
|
-
obstacles: Obstacle[];
|
|
307
|
-
obstacleClearance?: number;
|
|
308
|
-
};
|
|
309
|
-
/**
|
|
310
|
-
* Second phase of RectDiff: expand placed rects to their maximal extents.
|
|
311
|
-
*
|
|
312
|
-
* This solver takes the intermediate data produced by RectDiffSeedingSolver
|
|
313
|
-
* and runs the EXPANSION phase, then finalizes to capacity mesh nodes.
|
|
314
|
-
*/
|
|
315
|
-
declare class RectDiffExpansionSolver extends BaseSolver {
|
|
316
|
-
private input;
|
|
317
|
-
placedIndexByLayer: Array<RBush<RTreeRect>>;
|
|
318
|
-
_meshNodes: CapacityMeshNode[];
|
|
319
|
-
constructor(input: RectDiffExpansionSolverInput);
|
|
320
|
-
_setup(): void;
|
|
321
|
-
_step(): void;
|
|
322
|
-
private _stepExpansion;
|
|
323
|
-
private finalizeIfNeeded;
|
|
324
|
-
computeProgress(): number;
|
|
325
|
-
getOutput(): {
|
|
326
|
-
meshNodes: CapacityMeshNode[];
|
|
327
|
-
};
|
|
328
|
-
/** Simple visualization of expanded placements. */
|
|
329
|
-
visualize(): GraphicsObject;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
type RectDiffGridSolverPipelineInput = {
|
|
333
|
-
bounds: Bounds;
|
|
334
|
-
obstacles: Obstacle[];
|
|
335
|
-
connections: SimpleRouteConnection[];
|
|
336
|
-
outline?: Pick<SimpleRouteJson, "outline">;
|
|
337
|
-
layerCount: number;
|
|
338
|
-
minTraceWidth: number;
|
|
339
|
-
obstacleClearance?: number;
|
|
340
|
-
gridOptions?: Partial<GridFill3DOptions>;
|
|
341
|
-
boardVoidRects?: XYRect[];
|
|
342
|
-
layerNames?: string[];
|
|
343
|
-
zIndexByName?: Map<string, number>;
|
|
344
|
-
};
|
|
345
|
-
declare class RectDiffGridSolverPipeline extends BasePipelineSolver<RectDiffGridSolverPipelineInput> {
|
|
346
|
-
rectDiffSeedingSolver?: RectDiffSeedingSolver;
|
|
347
|
-
rectDiffExpansionSolver?: RectDiffExpansionSolver;
|
|
348
|
-
private obstacleIndexByLayer;
|
|
349
|
-
private layerNames;
|
|
350
|
-
private zIndexByName;
|
|
351
|
-
constructor(inputProblem: RectDiffGridSolverPipelineInput);
|
|
352
|
-
pipelineDef: PipelineStep<any>[];
|
|
353
|
-
getConstructorParams(): RectDiffGridSolverPipelineInput[];
|
|
354
|
-
getOutput(): {
|
|
355
|
-
meshNodes: CapacityMeshNode[];
|
|
356
|
-
};
|
|
357
|
-
visualize(): GraphicsObject;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
interface RectDiffPipelineInput {
|
|
361
|
-
simpleRouteJson: SimpleRouteJson;
|
|
362
|
-
gridOptions?: Partial<GridFill3DOptions>;
|
|
363
|
-
obstacleClearance?: number;
|
|
364
|
-
}
|
|
365
|
-
declare class RectDiffPipeline extends BasePipelineSolver<RectDiffPipelineInput> {
|
|
366
|
-
rectDiffGridSolverPipeline?: RectDiffGridSolverPipeline;
|
|
367
|
-
gapFillSolver?: GapFillSolverPipeline;
|
|
368
|
-
boardVoidRects: XYRect[] | undefined;
|
|
369
|
-
zIndexByName?: Map<string, number>;
|
|
370
|
-
layerNames?: string[];
|
|
371
|
-
pipelineDef: PipelineStep<any>[];
|
|
372
|
-
_setup(): void;
|
|
373
|
-
getConstructorParams(): RectDiffPipelineInput[];
|
|
374
|
-
getOutput(): {
|
|
375
|
-
meshNodes: CapacityMeshNode[];
|
|
376
|
-
};
|
|
377
|
-
initialVisualize(): GraphicsObject;
|
|
378
|
-
finalVisualize(): GraphicsObject;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
export { RectDiffPipeline, type RectDiffPipelineInput };
|