@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.
Files changed (36) hide show
  1. package/components/SolverDebugger3d.tsx +64 -10
  2. package/lib/RectDiffPipeline.ts +23 -0
  3. package/lib/fixtures/twoNodeExpansionFixture.ts +1 -1
  4. package/lib/solvers/GapFillSolver/ExpandEdgesToEmptySpaceSolver.ts +2 -2
  5. package/lib/solvers/GapFillSolver/FindSegmentsWithAdjacentEmptySpaceSolver.ts +1 -1
  6. package/lib/solvers/GapFillSolver/GapFillSolverPipeline.ts +2 -2
  7. package/lib/solvers/OuterLayerContainmentMergeSolver/OuterLayerContainmentMergeSolver.ts +311 -0
  8. package/lib/solvers/RectDiffExpansionSolver/RectDiffExpansionSolver.ts +5 -2
  9. package/lib/solvers/RectDiffGridSolverPipeline/RectDiffGridSolverPipeline.ts +8 -5
  10. package/lib/solvers/RectDiffGridSolverPipeline/buildObstacleIndexes.ts +6 -6
  11. package/lib/solvers/RectDiffSeedingSolver/RectDiffSeedingSolver.ts +4 -4
  12. package/lib/solvers/RectDiffSeedingSolver/computeCandidates3D.ts +1 -1
  13. package/lib/solvers/RectDiffSeedingSolver/computeEdgeCandidates3D.ts +1 -1
  14. package/lib/solvers/RectDiffSeedingSolver/longestFreeSpanAroundZ.ts +1 -1
  15. package/lib/types/capacity-mesh-types.ts +1 -1
  16. package/lib/types/srj-types.ts +1 -0
  17. package/lib/utils/expandRectFromSeed.ts +1 -1
  18. package/lib/utils/finalizeRects.ts +1 -1
  19. package/lib/utils/isFullyOccupiedAtPoint.ts +1 -1
  20. package/lib/utils/isSelfRect.ts +1 -1
  21. package/lib/utils/rectToTree.ts +2 -2
  22. package/lib/utils/renderObstacleClearance.ts +1 -1
  23. package/lib/utils/resizeSoftOverlaps.ts +1 -1
  24. package/lib/utils/sameTreeRect.ts +1 -1
  25. package/lib/utils/searchStrip.ts +1 -1
  26. package/lib/utils/z-filter.ts +43 -0
  27. package/package.json +6 -2
  28. package/tests/solver/arduino-uno-inner2-ground-bottom-power/__snapshots__/arduino-uno-inner2-ground-bottom-power.snap.svg +1 -1
  29. package/tests/solver/arduino-uno-inner2-ground-inner1-power/__snapshots__/arduino-uno-inner2-ground-inner1-power.snap.svg +3 -3
  30. package/tests/solver/bugreport08-e3ec95/__snapshots__/bugreport08-e3ec95.snap.svg +1 -1
  31. package/tests/solver/bugreport22-2a75ce/__snapshots__/bugreport22-2a75ce.snap.svg +1 -1
  32. package/tests/solver/bugreport24-05597c/__snapshots__/bugreport24-05597c.snap.svg +1 -1
  33. package/tests/solver/repros/merge-single-layer-node/__snapshots__/merge-single-layer-node.snap.svg +44 -0
  34. package/tests/z-filter.test.ts +33 -0
  35. package/dist/index.d.ts +0 -381
  36. package/dist/index.js +0 -2764
@@ -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 };