@tscircuit/rectdiff 0.0.19 → 0.0.21

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 (117) hide show
  1. package/.github/workflows/bun-test.yml +1 -1
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +28 -35
  4. package/lib/solvers/RectDiffExpansionSolver/RectDiffExpansionSolver.ts +6 -3
  5. package/lib/solvers/RectDiffGridSolverPipeline/buildObstacleIndexes.ts +2 -1
  6. package/lib/solvers/RectDiffSeedingSolver/RectDiffSeedingSolver.ts +2 -7
  7. package/lib/types/capacity-mesh-types.ts +1 -0
  8. package/lib/utils/expandRectFromSeed.ts +3 -0
  9. package/lib/utils/rectToTree.ts +5 -1
  10. package/lib/utils/resizeSoftOverlaps.ts +8 -16
  11. package/package.json +1 -1
  12. package/tests/solver/__snapshots__/rectDiffGridSolverPipeline.snap.svg +3 -3
  13. package/tests/solver/both-points-equivalent/__snapshots__/both-points-equivalent.snap.svg +44 -0
  14. package/tests/solver/both-points-equivalent/both-points-equivalent.srj.json +64 -0
  15. package/tests/solver/both-points-equivalent/both-points-equivalent.test.ts +92 -0
  16. package/tests/solver/bugreport01-be84eb/__snapshots__/bugreport01-be84eb.snap.svg +44 -0
  17. package/tests/solver/bugreport01-be84eb/bugreport01-be84eb.json +929 -0
  18. package/tests/solver/bugreport01-be84eb/bugreport01-be84eb.test.ts +93 -0
  19. package/tests/solver/bugreport02-bc4361/__snapshots__/bugreport02-bc4361.snap.svg +44 -0
  20. package/tests/solver/bugreport02-bc4361/bugreport02-bc4361.json +1276 -0
  21. package/tests/solver/bugreport02-bc4361/bugreport02-bc4361.test.ts +93 -0
  22. package/tests/solver/bugreport03-fe4a17/__snapshots__/bugreport03-fe4a17.snap.svg +44 -0
  23. package/tests/solver/bugreport03-fe4a17/bugreport03-fe4a17.json +986 -0
  24. package/tests/solver/bugreport03-fe4a17/bugreport03-fe4a17.test.ts +93 -0
  25. package/tests/solver/bugreport07-d3f3be/__snapshots__/bugreport07-d3f3be.snap.svg +44 -0
  26. package/tests/solver/bugreport07-d3f3be/bugreport07-d3f3be.json +1211 -0
  27. package/tests/solver/bugreport07-d3f3be/bugreport07-d3f3be.test.ts +93 -0
  28. package/tests/solver/bugreport08-e3ec95/__snapshots__/bugreport08-e3ec95.snap.svg +44 -0
  29. package/tests/solver/bugreport08-e3ec95/bugreport08-e3ec95.json +1511 -0
  30. package/tests/solver/bugreport08-e3ec95/bugreport08-e3ec95.test.ts +93 -0
  31. package/tests/solver/bugreport09-618e09/__snapshots__/bugreport09-618e09.snap.svg +44 -0
  32. package/tests/solver/bugreport09-618e09/bugreport09-618e09.json +2827 -0
  33. package/tests/solver/bugreport09-618e09/bugreport09-618e09.test.ts +93 -0
  34. package/tests/solver/bugreport10-71239a/__snapshots__/bugreport10-71239a.snap.svg +44 -0
  35. package/tests/solver/bugreport10-71239a/bugreport10-71239a.json +890 -0
  36. package/tests/solver/bugreport10-71239a/bugreport10-71239a.test.ts +93 -0
  37. package/tests/solver/bugreport11-b2de3c/__snapshots__/bugreport11-b2de3c.snap.svg +44 -0
  38. package/tests/solver/bugreport11-b2de3c/bugreport11-b2de3c.json +4315 -0
  39. package/tests/solver/bugreport11-b2de3c/bugreport11-b2de3c.test.ts +93 -0
  40. package/tests/solver/bugreport12-35ce1c/__snapshots__/bugreport12-35ce1c.snap.svg +44 -0
  41. package/tests/solver/bugreport12-35ce1c/bugreport12-35ce1c.json +475 -0
  42. package/tests/solver/bugreport12-35ce1c/bugreport12-35ce1c.test.ts +93 -0
  43. package/tests/solver/bugreport13-b9a758/__snapshots__/bugreport13-b9a758.snap.svg +44 -0
  44. package/tests/solver/bugreport13-b9a758/bugreport13-b9a758.json +15815 -0
  45. package/tests/solver/bugreport13-b9a758/bugreport13-b9a758.test.ts +93 -0
  46. package/tests/solver/bugreport16-d95f38/__snapshots__/bugreport16-d95f38.snap.svg +44 -0
  47. package/tests/solver/bugreport16-d95f38/bugreport16-d95f38.json +623 -0
  48. package/tests/solver/bugreport16-d95f38/bugreport16-d95f38.test.ts +93 -0
  49. package/tests/solver/bugreport18-1b2d06/__snapshots__/bugreport18-1b2d06.snap.svg +44 -0
  50. package/tests/solver/bugreport18-1b2d06/bugreport18-1b2d06.json +543 -0
  51. package/tests/solver/bugreport18-1b2d06/bugreport18-1b2d06.test.ts +93 -0
  52. package/tests/solver/bugreport19/__snapshots__/bugreport19.snap.svg +44 -0
  53. package/tests/solver/bugreport19/bugreport19.json +678 -0
  54. package/tests/solver/bugreport19/bugreport19.test.ts +93 -0
  55. package/tests/solver/bugreport20-obstacle-clipping/__snapshots__/bugreport20-obstacle-clipping.snap.svg +44 -0
  56. package/tests/solver/bugreport20-obstacle-clipping/bugreport20-obstacle-clipping.json +109 -0
  57. package/tests/solver/bugreport20-obstacle-clipping/bugreport20-obstacle-clipping.test.ts +93 -0
  58. package/tests/solver/bugreport21-board-outline/__snapshots__/bugreport21-board-outline.snap.svg +44 -0
  59. package/tests/solver/bugreport21-board-outline/bugreport21-board-outline.json +148 -0
  60. package/tests/solver/bugreport21-board-outline/bugreport21-board-outline.test.ts +93 -0
  61. package/tests/solver/bugreport22-2a75ce/__snapshots__/bugreport22-2a75ce.snap.svg +44 -0
  62. package/tests/solver/bugreport22-2a75ce/bugreport22-2a75ce.json +1550 -0
  63. package/tests/solver/bugreport22-2a75ce/bugreport22-2a75ce.test.ts +93 -0
  64. package/tests/solver/bugreport23-LGA15x4/__snapshots__/bugreport23-LGA15x4.snap.svg +44 -0
  65. package/tests/solver/bugreport23-LGA15x4/bugreport23-LGA15x4.srj.json +2401 -0
  66. package/tests/solver/bugreport23-LGA15x4/bugreport23-LGA15x4.test.ts +92 -0
  67. package/tests/solver/bugreport24-05597c/__snapshots__/bugreport24-05597c.snap.svg +44 -0
  68. package/tests/solver/bugreport24-05597c/bugreport24-05597c.json +8427 -0
  69. package/tests/solver/bugreport24-05597c/bugreport24-05597c.test.ts +93 -0
  70. package/tests/solver/bugreport25-4b1d55/__snapshots__/bugreport25-4b1d55.snap.svg +44 -0
  71. package/tests/solver/bugreport25-4b1d55/bugreport25-4b1d55.json +119 -0
  72. package/tests/solver/bugreport25-4b1d55/bugreport25-4b1d55.test.ts +93 -0
  73. package/tests/solver/bugreport26-66b0b2/__snapshots__/bugreport26-66b0b2.snap.svg +44 -0
  74. package/tests/solver/bugreport26-66b0b2/bugreport26-66b0b2.json +1651 -0
  75. package/tests/solver/bugreport26-66b0b2/bugreport26-66b0b2.test.ts +93 -0
  76. package/tests/solver/bugreport27-dd3734/__snapshots__/bugreport27-dd3734.snap.svg +44 -0
  77. package/tests/solver/bugreport27-dd3734/bugreport27-dd3734.json +4116 -0
  78. package/tests/solver/bugreport27-dd3734/bugreport27-dd3734.test.ts +93 -0
  79. package/tests/solver/bugreport28-18a9ef/__snapshots__/bugreport28-18a9ef.snap.svg +44 -0
  80. package/tests/solver/bugreport28-18a9ef/bugreport28-18a9ef.json +4116 -0
  81. package/tests/solver/bugreport28-18a9ef/bugreport28-18a9ef.test.ts +93 -0
  82. package/tests/solver/bugreport29-7deae8/__snapshots__/bugreport29-7deae8.snap.svg +44 -0
  83. package/tests/solver/bugreport29-7deae8/bugreport29-7deae8.json +4118 -0
  84. package/tests/solver/bugreport29-7deae8/bugreport29-7deae8.test.ts +93 -0
  85. package/tests/solver/bugreport30-2174c8/__snapshots__/bugreport30-2174c8.snap.svg +44 -0
  86. package/tests/solver/bugreport30-2174c8/bugreport30-2174c8.json +4007 -0
  87. package/tests/solver/bugreport30-2174c8/bugreport30-2174c8.test.ts +93 -0
  88. package/tests/solver/bugreport33-213d45/__snapshots__/bugreport33-213d45.snap.svg +44 -0
  89. package/tests/solver/bugreport33-213d45/bugreport33-213d45.json +5089 -0
  90. package/tests/solver/bugreport33-213d45/bugreport33-213d45.test.ts +93 -0
  91. package/tests/solver/bugreport34-e9dea2/__snapshots__/bugreport34-e9dea2.snap.svg +44 -0
  92. package/tests/solver/bugreport34-e9dea2/bugreport34-e9dea2.json +3924 -0
  93. package/tests/solver/bugreport34-e9dea2/bugreport34-e9dea2.test.ts +93 -0
  94. package/tests/solver/bugreport35-191db9/__snapshots__/bugreport35-191db9.snap.svg +44 -0
  95. package/tests/solver/bugreport35-191db9/bugreport35-191db9.json +4237 -0
  96. package/tests/solver/bugreport35-191db9/bugreport35-191db9.test.ts +93 -0
  97. package/tests/solver/bugreport36-bf8303/__snapshots__/bugreport36-bf8303.snap.svg +44 -0
  98. package/tests/solver/bugreport36-bf8303/bugreport36-bf8303.json +29660 -0
  99. package/tests/solver/bugreport36-bf8303/bugreport36-bf8303.test.ts +93 -0
  100. package/tests/solver/interaction/__snapshots__/interaction.snap.svg +44 -0
  101. package/tests/solver/interaction/interaction.srj.json +58 -0
  102. package/tests/solver/interaction/interaction.test.ts +92 -0
  103. package/tests/solver/multi-point/__snapshots__/multi-point.snap.svg +44 -0
  104. package/tests/solver/multi-point/multi-point.srj.json +57 -0
  105. package/tests/solver/multi-point/multi-point.test.ts +92 -0
  106. package/tests/solver/no-better-path/__snapshots__/no-better-path.snap.svg +44 -0
  107. package/tests/solver/no-better-path/no-better-path.srj.json +48 -0
  108. package/tests/solver/no-better-path/no-better-path.test.ts +92 -0
  109. package/tests/solver/offboardconnects01/__snapshots__/offboardconnects01.snap.svg +44 -0
  110. package/tests/solver/offboardconnects01/offboardconnects01.srj.json +53 -0
  111. package/tests/solver/offboardconnects01/offboardconnects01.test.ts +92 -0
  112. package/tests/solver/pcb_trace_id-should-return-root-connection-name/__snapshots__/pcb_trace_id-should-return-root-connection-name.snap.svg +44 -0
  113. package/tests/solver/pcb_trace_id-should-return-root-connection-name/pcb_trace_id-should-return-root-connection-name.srj.json +129 -0
  114. package/tests/solver/pcb_trace_id-should-return-root-connection-name/pcb_trace_id-should-return-root-connection-name.test.ts +92 -0
  115. package/tests/solver/transitivity/__snapshots__/transitivity.snap.svg +44 -0
  116. package/tests/solver/transitivity/transitivity.srj.json +64 -0
  117. package/tests/solver/transitivity/transitivity.test.ts +92 -0
@@ -0,0 +1,93 @@
1
+ import { expect, test } from "bun:test"
2
+ import srj_json from "./bugreport11-b2de3c.json"
3
+ import {
4
+ getBounds,
5
+ getSvgFromGraphicsObject,
6
+ mergeGraphics,
7
+ stackGraphicsVertically,
8
+ type GraphicsObject,
9
+ type Rect,
10
+ } from "graphics-debug"
11
+ import { RectDiffPipeline } from "lib/RectDiffPipeline"
12
+ import { makeCapacityMeshNodeWithLayerInfo } from "tests/fixtures/makeCapacityMeshNodeWithLayerInfo"
13
+ import { makeSimpleRouteOutlineGraphics } from "tests/fixtures/makeSimpleRouteOutlineGraphics"
14
+
15
+ const srj = srj_json.simple_route_json ?? srj_json.simpleRouteJson ?? srj_json
16
+
17
+ test("bugreport11-b2de3c", async () => {
18
+ const solver = new RectDiffPipeline({
19
+ simpleRouteJson: srj,
20
+ })
21
+
22
+ const outline = makeSimpleRouteOutlineGraphics(srj)
23
+
24
+ solver.solve()
25
+
26
+ const { meshNodes } = solver.getOutput()
27
+ const rectsByCombo = makeCapacityMeshNodeWithLayerInfo(meshNodes)
28
+ const allGraphicsObjects: GraphicsObject[] = []
29
+
30
+ for (const z of Array.from({ length: srj.layerCount }, (_, index) => index)) {
31
+ const layerRects: Rect[] = []
32
+
33
+ for (const [key, rects] of rectsByCombo) {
34
+ const layers = key
35
+ .split(",")
36
+ .map((value) => Number.parseInt(value, 10))
37
+ .filter((value) => !Number.isNaN(value))
38
+
39
+ if (layers.includes(z)) {
40
+ layerRects.push(...rects)
41
+ }
42
+ }
43
+
44
+ let labelY = 0
45
+
46
+ if (layerRects.length > 0) {
47
+ let maxY = -Infinity
48
+
49
+ for (const rect of layerRects) {
50
+ const top = rect.center.y + rect.height * (2 / 3)
51
+
52
+ if (top > maxY) maxY = top
53
+ }
54
+
55
+ labelY = maxY
56
+ }
57
+
58
+ const graphics: GraphicsObject = {
59
+ title: `RectDiffPipeline - z${z}`,
60
+ texts: [
61
+ {
62
+ anchorSide: "top_right",
63
+ text: `Layer z=${z}`,
64
+ x: 0,
65
+ y: labelY,
66
+ fontSize: 0.5,
67
+ },
68
+ ],
69
+ coordinateSystem: "cartesian",
70
+ rects: layerRects,
71
+ points: [],
72
+ lines: [],
73
+ }
74
+
75
+ allGraphicsObjects.push(mergeGraphics(graphics, outline))
76
+ }
77
+
78
+ const stackedGraphics = stackGraphicsVertically(allGraphicsObjects)
79
+ const bounds = getBounds(stackedGraphics)
80
+ const boundsWidth = Math.max(1, bounds.maxX - bounds.minX)
81
+ const boundsHeight = Math.max(1, bounds.maxY - bounds.minY)
82
+ const svgWidth = 640
83
+ const svgHeight = Math.max(
84
+ svgWidth,
85
+ Math.ceil((boundsHeight / boundsWidth) * svgWidth),
86
+ )
87
+
88
+ const svg = getSvgFromGraphicsObject(stackedGraphics, {
89
+ svgWidth,
90
+ svgHeight,
91
+ })
92
+ await expect(svg).toMatchSvgSnapshot(import.meta.path)
93
+ })
@@ -0,0 +1,44 @@
1
+ <svg width="640" height="1035" viewBox="0 0 640 1035" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="white"/><g><polyline data-points="-11.749999999999998,-10.620000000000001 23.424999999999997,-10.620000000000001 23.424999999999997,10.620000000000001 -11.749999999999998,10.620000000000001 -11.749999999999998,-10.620000000000001" data-type="line" data-label="bounds" points="40.00000000000003,467.19154228855723 600,467.19154228855723 600,129.04228855721385 40.00000000000003,129.04228855721385 40.00000000000003,467.19154228855723" fill="none" stroke="#111827" stroke-width="1.5920398009950252"/></g><g><polyline data-points="-11.749999999999998,-42.22 23.424999999999997,-42.22 23.424999999999997,-20.98 -11.749999999999998,-20.98 -11.749999999999998,-42.22" data-type="line" data-label="bounds" points="40.00000000000003,970.2761194029852 600,970.2761194029852 600,632.1268656716418 40.00000000000003,632.1268656716418 40.00000000000003,970.2761194029852" fill="none" stroke="#111827" stroke-width="1.5920398009950252"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="0" x="119.60199004975125" y="129.04228855721385" width="214.92537313432842" height="338.1492537313434" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="14.1625" data-y="0" x="382.2885572139304" y="129.04228855721385" width="140.497512437811" height="338.1492537313434" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="21" data-y="-8.260018149999988" x="522.7860696517414" y="392.0478415920394" width="77.21393034825871" height="75.14370069651784" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="21" data-y="0.10001814999998704" x="522.7860696517414" y="229.65920398009945" width="77.21393034825871" height="133.73076537313477" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="21" data-y="8.16" x="522.7860696517414" y="129.04228855721385" width="77.21393034825871" height="78.32835820895525" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-9.25" data-y="9.620000000000001" x="40" y="129.04228855721385" width="79.60199004975125" height="31.840796019900523" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="9.620000000000001" x="334.52736318407966" y="129.04228855721385" width="47.76119402985074" height="31.840796019900523" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-9.25" data-y="-9.620000000000001" x="40" y="435.35074626865674" width="79.60199004975125" height="31.840796019900495" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-10.75" data-y="0" x="40" y="160.88308457711437" width="31.840796019900495" height="274.4676616915424" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="-9.620000000000001" x="334.52736318407966" y="435.35074626865674" width="47.76119402985074" height="31.840796019900495" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="-5" x="538.0690801990052" y="363.3899693532342" width="14.807113233830592" height="28.65787223880517" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="22.395017049999993" data-y="-5" x="567.2045229850745" y="363.3899693532342" width="32.795477014925495" height="28.65787223880517" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="22.424999999999997" data-y="5" x="568.1592039800995" y="207.3706467661691" width="31.840796019900495" height="22.288557213930346" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="5" x="539.1044776119404" y="207.3706467661691" width="12.736318407960198" height="22.288557213930346" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="20.91503499999999" data-y="-5" x="552.8761934328357" y="374.53422567164216" width="14.328329552238756" height="6.369359601989231" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="-1.27" x="334.52736318407966" y="314.0373134328358" width="47.76119402985074" height="8.597014925373117" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="1.27" x="334.52736318407966" y="273.5995024875622" width="47.76119402985074" height="8.597014925373117" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="3.81" x="334.52736318407966" y="233.1616915422885" width="47.76119402985074" height="8.597014925373145" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="6.35" x="334.52736318407966" y="192.7238805970149" width="47.76119402985074" height="8.597014925373117" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="1.27" x="71.8407960199005" y="273.5995024875622" width="47.761194029850756" height="8.597014925373117" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="3.81" x="71.8407960199005" y="233.1616915422885" width="47.761194029850756" height="8.597014925373145" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="6.35" x="71.8407960199005" y="192.7238805970149" width="47.761194029850756" height="8.597014925373117" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="-6.35" x="334.52736318407966" y="394.91293532338307" width="47.76119402985074" height="8.597014925373173" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="-3.8099999999999996" x="334.52736318407966" y="354.4751243781094" width="47.76119402985074" height="8.597014925373173" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="-6.35" x="71.8407960199005" y="394.91293532338307" width="47.761194029850756" height="8.597014925373173" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="-3.8099999999999996" x="71.8407960199005" y="354.4751243781094" width="47.761194029850756" height="8.597014925373173" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="-1.27" x="71.8407960199005" y="314.0373134328358" width="47.761194029850756" height="8.597014925373117" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="19.054982050000007" data-y="-5" x="522.7860696517414" y="374.53422567164216" width="15.28301054726387" height="6.369359601989231" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="7.620000000000001" x="71.8407960199005" y="160.88308457711437" width="47.761194029850756" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="5.08" x="71.8407960199005" y="201.320895522388" width="47.761194029850756" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="2.54" x="71.8407960199005" y="241.75870646766165" width="47.761194029850756" height="31.840796019900523" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="0" x="71.8407960199005" y="282.1965174129353" width="47.761194029850756" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="-2.54" x="71.8407960199005" y="322.6343283582089" width="47.761194029850756" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="-5.079999999999999" x="71.8407960199005" y="363.0721393034826" width="47.761194029850756" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="-7.620000000000001" x="71.8407960199005" y="403.50995024875624" width="47.761194029850756" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="7.620000000000001" x="334.52736318407966" y="160.88308457711437" width="47.76119402985074" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="5.08" x="334.52736318407966" y="201.320895522388" width="47.76119402985074" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="2.54" x="334.52736318407966" y="241.75870646766165" width="47.76119402985074" height="31.840796019900523" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="0" x="334.52736318407966" y="282.1965174129353" width="47.76119402985074" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="-2.54" x="334.52736318407966" y="322.6343283582089" width="47.76119402985074" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="-5.079999999999999" x="334.52736318407966" y="363.0721393034826" width="47.76119402985074" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="-7.620000000000001" x="334.52736318407966" y="403.50995024875624" width="47.76119402985074" height="31.840796019900495" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="19.0875" data-y="5" x="522.7860696517414" y="207.3706467661691" width="16.31840796019901" height="22.288557213930346" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="20.9125" data-y="5" x="551.8407960199006" y="207.3706467661691" width="16.31840796019901" height="22.288557213930346" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="19.08496500000001" data-y="-4.449963000000025" x="523.7407506467664" y="363.3899693532342" width="14.328329552238756" height="11.14425631840794" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="19.08496500000001" data-y="-5.550036999999975" x="523.7407506467664" y="380.9035852736314" width="14.328329552238756" height="11.144256318407997" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="20.91503499999999" data-y="-5.550036999999975" x="552.8761934328357" y="380.9035852736314" width="14.328329552238756" height="11.144256318407997" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="20.91503499999999" data-y="-4.449963000000025" x="552.8761934328357" y="363.3899693532342" width="14.328329552238756" height="11.14425631840794" fill="red" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="18.604982950000007" data-y="-5.550036999999975" x="522.7860696517414" y="380.9035852736314" width="0.9546809950250008" height="11.144256318407997" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="18.604982950000007" data-y="-4.449963000000025" x="522.7860696517414" y="363.3899693532342" width="0.9546809950250008" height="11.14425631840794" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="0" data-y="-31.6" x="119.60199004975125" y="632.1268656716418" width="214.92537313432842" height="338.1492537313434" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="14.1625" data-y="-31.6" x="382.2885572139304" y="632.1268656716418" width="140.497512437811" height="338.1492537313434" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="21" data-y="-39.86001814999999" x="522.7860696517414" y="895.1324187064673" width="77.21393034825871" height="75.14370069651784" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="21" data-y="-31.499981850000015" x="522.7860696517414" y="732.7437810945274" width="77.21393034825871" height="133.73076537313477" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="21" data-y="-23.44" x="522.7860696517414" y="632.1268656716418" width="77.21393034825871" height="78.32835820895525" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-9.25" data-y="-21.98" x="40" y="632.1268656716418" width="79.60199004975125" height="31.84079601990061" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="-21.98" x="334.52736318407966" y="632.1268656716418" width="47.76119402985074" height="31.84079601990061" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-9.25" data-y="-41.22" x="40" y="938.4353233830847" width="79.60199004975125" height="31.840796019900495" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-10.75" data-y="-31.6" x="40" y="663.9676616915424" width="31.840796019900495" height="274.4676616915423" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="-41.22" x="334.52736318407966" y="938.4353233830847" width="47.76119402985074" height="31.840796019900495" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="-36.6" x="538.0690801990052" y="866.4745464676622" width="14.807113233830592" height="28.657872238805112" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="22.395017049999993" data-y="-36.6" x="567.2045229850745" y="866.4745464676622" width="32.795477014925495" height="28.657872238805112" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="22.424999999999997" data-y="-26.6" x="568.1592039800995" y="710.455223880597" width="31.840796019900495" height="22.28855721393029" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="20" data-y="-26.6" x="539.1044776119404" y="710.455223880597" width="12.736318407960198" height="22.28855721393029" fill="#dbeafe" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="-8.25" data-y="-31.6" x="71.8407960199005" y="663.9676616915424" width="47.761194029850756" height="274.4676616915423" fill="#fef3c7" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="8.25" data-y="-31.6" x="334.52736318407966" y="663.9676616915424" width="47.76119402985074" height="274.4676616915423" fill="#fef3c7" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="19.0875" data-y="-26.6" x="522.7860696517414" y="710.455223880597" width="16.31840796019901" height="22.28855721393029" fill="#fef3c7" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="20.9125" data-y="-26.6" x="551.8407960199006" y="710.455223880597" width="16.31840796019901" height="22.28855721393029" fill="#fef3c7" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="19.054982050000007" data-y="-36.6" x="522.7860696517414" y="866.4745464676622" width="15.28301054726387" height="28.657872238805112" fill="#fef3c7" stroke="black" stroke-width="0.0628125"/></g><g><rect data-type="rect" data-label="node" data-x="20.91503499999999" data-y="-36.6" x="552.8761934328357" y="866.4745464676622" width="14.328329552238756" height="28.657872238805112" fill="#fef3c7" stroke="black" stroke-width="0.0628125"/></g><text data-type="text" data-label="Layer z=0" data-x="0" data-y="14.16" x="227.06467661691545" y="72.68407960198999" fill="black" font-size="7.9601990049751254" 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="-17.44" x="227.06467661691545" y="575.7686567164179" fill="black" font-size="7.9601990049751254" font-family="sans-serif" text-anchor="end" dominant-baseline="text-before-edge">Layer z=1</text><g id="crosshair" style="display: none"><line id="crosshair-h" y1="0" y2="1035" 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', '1035');
21
+
22
+ // Calculate real coordinates using inverse transformation
23
+ const matrix = {"a":15.920398009950251,"c":0,"e":227.06467661691545,"b":0,"d":-15.920398009950251,"f":298.11691542288554};
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,475 @@
1
+ {
2
+ "autorouting_bug_report_id": "35ce1c44-0000-0000-0000-000000000000",
3
+ "reporter_account_id": null,
4
+ "package_id": null,
5
+ "title": "Fixture: Provided simple route json",
6
+ "simple_route_json": {
7
+ "bounds": {
8
+ "minX": -11.749999999999998,
9
+ "maxX": 23.424999999999997,
10
+ "minY": -10.620000000000001,
11
+ "maxY": 10.620000000000001
12
+ },
13
+ "obstacles": [
14
+ {
15
+ "type": "rect",
16
+ "layers": ["top"],
17
+ "center": {
18
+ "x": -8.25,
19
+ "y": 7.62
20
+ },
21
+ "width": 3,
22
+ "height": 2,
23
+ "connectedTo": [
24
+ "pcb_smtpad_0",
25
+ "connectivity_net57",
26
+ "source_port_0",
27
+ "pcb_smtpad_0",
28
+ "pcb_port_0"
29
+ ]
30
+ },
31
+ {
32
+ "type": "rect",
33
+ "layers": ["top"],
34
+ "center": {
35
+ "x": -8.25,
36
+ "y": 5.08
37
+ },
38
+ "width": 3,
39
+ "height": 2,
40
+ "connectedTo": [
41
+ "pcb_smtpad_1",
42
+ "connectivity_net58",
43
+ "source_port_1",
44
+ "pcb_smtpad_1",
45
+ "pcb_port_1"
46
+ ]
47
+ },
48
+ {
49
+ "type": "rect",
50
+ "layers": ["top"],
51
+ "center": {
52
+ "x": -8.25,
53
+ "y": 2.54
54
+ },
55
+ "width": 3,
56
+ "height": 2,
57
+ "connectedTo": [
58
+ "pcb_smtpad_2",
59
+ "connectivity_net59",
60
+ "source_port_2",
61
+ "pcb_smtpad_2",
62
+ "pcb_port_2"
63
+ ]
64
+ },
65
+ {
66
+ "type": "rect",
67
+ "layers": ["top"],
68
+ "center": {
69
+ "x": -8.25,
70
+ "y": 0
71
+ },
72
+ "width": 3,
73
+ "height": 2,
74
+ "connectedTo": [
75
+ "pcb_smtpad_3",
76
+ "connectivity_net60",
77
+ "source_port_3",
78
+ "pcb_smtpad_3",
79
+ "pcb_port_3"
80
+ ]
81
+ },
82
+ {
83
+ "type": "rect",
84
+ "layers": ["top"],
85
+ "center": {
86
+ "x": -8.25,
87
+ "y": -2.54
88
+ },
89
+ "width": 3,
90
+ "height": 2,
91
+ "connectedTo": [
92
+ "pcb_smtpad_4",
93
+ "connectivity_net61",
94
+ "source_port_4",
95
+ "pcb_smtpad_4",
96
+ "pcb_port_4"
97
+ ]
98
+ },
99
+ {
100
+ "type": "rect",
101
+ "layers": ["top"],
102
+ "center": {
103
+ "x": -8.25,
104
+ "y": -5.079999999999999
105
+ },
106
+ "width": 3,
107
+ "height": 2,
108
+ "connectedTo": [
109
+ "pcb_smtpad_5",
110
+ "connectivity_net62",
111
+ "source_port_5",
112
+ "pcb_smtpad_5",
113
+ "pcb_port_5"
114
+ ]
115
+ },
116
+ {
117
+ "type": "rect",
118
+ "layers": ["top"],
119
+ "center": {
120
+ "x": -8.25,
121
+ "y": -7.62
122
+ },
123
+ "width": 3,
124
+ "height": 2,
125
+ "connectedTo": [
126
+ "pcb_smtpad_6",
127
+ "connectivity_net63",
128
+ "source_port_6",
129
+ "pcb_smtpad_6",
130
+ "pcb_port_6"
131
+ ]
132
+ },
133
+ {
134
+ "type": "rect",
135
+ "layers": ["top"],
136
+ "center": {
137
+ "x": 8.25,
138
+ "y": 7.62
139
+ },
140
+ "width": 3,
141
+ "height": 2,
142
+ "connectedTo": [
143
+ "pcb_smtpad_7",
144
+ "connectivity_net3",
145
+ "source_trace_1",
146
+ "source_port_7",
147
+ "source_net_1",
148
+ "pcb_smtpad_7",
149
+ "pcb_port_7"
150
+ ]
151
+ },
152
+ {
153
+ "type": "rect",
154
+ "layers": ["top"],
155
+ "center": {
156
+ "x": 8.25,
157
+ "y": 5.08
158
+ },
159
+ "width": 3,
160
+ "height": 2,
161
+ "connectedTo": [
162
+ "pcb_smtpad_8",
163
+ "connectivity_net9",
164
+ "source_trace_3",
165
+ "source_port_17",
166
+ "source_trace_0",
167
+ "source_port_8",
168
+ "source_net_0",
169
+ "pcb_smtpad_8",
170
+ "pcb_port_8",
171
+ "pcb_smtpad_17",
172
+ "pcb_port_17"
173
+ ]
174
+ },
175
+ {
176
+ "type": "rect",
177
+ "layers": ["top"],
178
+ "center": {
179
+ "x": 8.25,
180
+ "y": 2.54
181
+ },
182
+ "width": 3,
183
+ "height": 2,
184
+ "connectedTo": [
185
+ "pcb_smtpad_9",
186
+ "connectivity_net64",
187
+ "source_port_9",
188
+ "pcb_smtpad_9",
189
+ "pcb_port_9"
190
+ ]
191
+ },
192
+ {
193
+ "type": "rect",
194
+ "layers": ["top"],
195
+ "center": {
196
+ "x": 8.25,
197
+ "y": 0
198
+ },
199
+ "width": 3,
200
+ "height": 2,
201
+ "connectedTo": [
202
+ "pcb_smtpad_10",
203
+ "connectivity_net6",
204
+ "source_trace_2",
205
+ "source_port_10",
206
+ "source_port_14",
207
+ "pcb_smtpad_10",
208
+ "pcb_port_10",
209
+ "pcb_smtpad_14",
210
+ "pcb_port_14"
211
+ ]
212
+ },
213
+ {
214
+ "type": "rect",
215
+ "layers": ["top"],
216
+ "center": {
217
+ "x": 8.25,
218
+ "y": -2.54
219
+ },
220
+ "width": 3,
221
+ "height": 2,
222
+ "connectedTo": [
223
+ "pcb_smtpad_11",
224
+ "connectivity_net65",
225
+ "source_port_11",
226
+ "pcb_smtpad_11",
227
+ "pcb_port_11"
228
+ ]
229
+ },
230
+ {
231
+ "type": "rect",
232
+ "layers": ["top"],
233
+ "center": {
234
+ "x": 8.25,
235
+ "y": -5.079999999999999
236
+ },
237
+ "width": 3,
238
+ "height": 2,
239
+ "connectedTo": [
240
+ "pcb_smtpad_12",
241
+ "connectivity_net66",
242
+ "source_port_12",
243
+ "pcb_smtpad_12",
244
+ "pcb_port_12"
245
+ ]
246
+ },
247
+ {
248
+ "type": "rect",
249
+ "layers": ["top"],
250
+ "center": {
251
+ "x": 8.25,
252
+ "y": -7.62
253
+ },
254
+ "width": 3,
255
+ "height": 2,
256
+ "connectedTo": [
257
+ "pcb_smtpad_13",
258
+ "connectivity_net67",
259
+ "source_port_13",
260
+ "pcb_smtpad_13",
261
+ "pcb_port_13"
262
+ ]
263
+ },
264
+ {
265
+ "type": "rect",
266
+ "layers": ["top"],
267
+ "center": {
268
+ "x": 19.0875,
269
+ "y": 5
270
+ },
271
+ "width": 1.025,
272
+ "height": 1.4,
273
+ "connectedTo": [
274
+ "pcb_smtpad_14",
275
+ "connectivity_net6",
276
+ "source_trace_2",
277
+ "source_port_10",
278
+ "source_port_14",
279
+ "pcb_smtpad_10",
280
+ "pcb_port_10",
281
+ "pcb_smtpad_14",
282
+ "pcb_port_14"
283
+ ]
284
+ },
285
+ {
286
+ "type": "rect",
287
+ "layers": ["top"],
288
+ "center": {
289
+ "x": 20.9125,
290
+ "y": 5
291
+ },
292
+ "width": 1.025,
293
+ "height": 1.4,
294
+ "connectedTo": [
295
+ "pcb_smtpad_15",
296
+ "connectivity_net14",
297
+ "source_trace_5",
298
+ "source_port_18",
299
+ "source_port_15",
300
+ "pcb_smtpad_15",
301
+ "pcb_port_15",
302
+ "pcb_smtpad_18",
303
+ "pcb_port_18"
304
+ ]
305
+ },
306
+ {
307
+ "type": "rect",
308
+ "layers": ["top"],
309
+ "center": {
310
+ "x": 19.08496500000001,
311
+ "y": -4.449963000000025
312
+ },
313
+ "width": 0.8999982,
314
+ "height": 0.6999986,
315
+ "connectedTo": [
316
+ "pcb_smtpad_16",
317
+ "connectivity_net68",
318
+ "source_port_16",
319
+ "pcb_smtpad_16",
320
+ "pcb_port_16"
321
+ ]
322
+ },
323
+ {
324
+ "type": "rect",
325
+ "layers": ["top"],
326
+ "center": {
327
+ "x": 19.08496500000001,
328
+ "y": -5.550036999999975
329
+ },
330
+ "width": 0.8999982,
331
+ "height": 0.6999986,
332
+ "connectedTo": [
333
+ "pcb_smtpad_17",
334
+ "connectivity_net9",
335
+ "source_trace_3",
336
+ "source_port_17",
337
+ "source_trace_0",
338
+ "source_port_8",
339
+ "source_net_0",
340
+ "pcb_smtpad_8",
341
+ "pcb_port_8",
342
+ "pcb_smtpad_17",
343
+ "pcb_port_17"
344
+ ]
345
+ },
346
+ {
347
+ "type": "rect",
348
+ "layers": ["top"],
349
+ "center": {
350
+ "x": 20.91503499999999,
351
+ "y": -5.550036999999975
352
+ },
353
+ "width": 0.8999982,
354
+ "height": 0.6999986,
355
+ "connectedTo": [
356
+ "pcb_smtpad_18",
357
+ "connectivity_net14",
358
+ "source_trace_5",
359
+ "source_port_18",
360
+ "source_port_15",
361
+ "pcb_smtpad_15",
362
+ "pcb_port_15",
363
+ "pcb_smtpad_18",
364
+ "pcb_port_18"
365
+ ]
366
+ },
367
+ {
368
+ "type": "rect",
369
+ "layers": ["top"],
370
+ "center": {
371
+ "x": 20.91503499999999,
372
+ "y": -4.449963000000025
373
+ },
374
+ "width": 0.8999982,
375
+ "height": 0.6999986,
376
+ "connectedTo": [
377
+ "pcb_smtpad_19",
378
+ "connectivity_net11",
379
+ "source_trace_4",
380
+ "source_port_19",
381
+ "source_net_2",
382
+ "pcb_smtpad_19",
383
+ "pcb_port_19"
384
+ ]
385
+ }
386
+ ],
387
+ "connections": [
388
+ {
389
+ "name": "source_trace_2",
390
+ "source_trace_id": "source_trace_2",
391
+ "pointsToConnect": [
392
+ {
393
+ "x": 8.25,
394
+ "y": 0,
395
+ "layer": "top",
396
+ "pointId": "pcb_port_10",
397
+ "pcb_port_id": "pcb_port_10"
398
+ },
399
+ {
400
+ "x": 19.0875,
401
+ "y": 5,
402
+ "layer": "top",
403
+ "pointId": "pcb_port_14",
404
+ "pcb_port_id": "pcb_port_14"
405
+ }
406
+ ]
407
+ },
408
+ {
409
+ "name": "source_trace_5",
410
+ "source_trace_id": "source_trace_5",
411
+ "pointsToConnect": [
412
+ {
413
+ "x": 20.91503499999999,
414
+ "y": -5.550036999999975,
415
+ "layer": "top",
416
+ "pointId": "pcb_port_18",
417
+ "pcb_port_id": "pcb_port_18"
418
+ },
419
+ {
420
+ "x": 20.9125,
421
+ "y": 5,
422
+ "layer": "top",
423
+ "pointId": "pcb_port_15",
424
+ "pcb_port_id": "pcb_port_15"
425
+ }
426
+ ]
427
+ },
428
+ {
429
+ "name": "source_net_0",
430
+ "pointsToConnect": [
431
+ {
432
+ "x": 8.25,
433
+ "y": 5.08,
434
+ "layer": "top",
435
+ "pointId": "pcb_port_8",
436
+ "pcb_port_id": "pcb_port_8"
437
+ },
438
+ {
439
+ "x": 19.08496500000001,
440
+ "y": -5.550036999999975,
441
+ "layer": "top",
442
+ "pointId": "pcb_port_17",
443
+ "pcb_port_id": "pcb_port_17"
444
+ }
445
+ ]
446
+ },
447
+ {
448
+ "name": "source_net_1",
449
+ "pointsToConnect": [
450
+ {
451
+ "x": 8.25,
452
+ "y": 7.62,
453
+ "layer": "top",
454
+ "pointId": "pcb_port_7",
455
+ "pcb_port_id": "pcb_port_7"
456
+ }
457
+ ]
458
+ },
459
+ {
460
+ "name": "source_net_2",
461
+ "pointsToConnect": [
462
+ {
463
+ "x": 20.91503499999999,
464
+ "y": -4.449963000000025,
465
+ "layer": "top",
466
+ "pointId": "pcb_port_19",
467
+ "pcb_port_id": "pcb_port_19"
468
+ }
469
+ ]
470
+ }
471
+ ],
472
+ "layerCount": 2,
473
+ "minTraceWidth": 0.15
474
+ }
475
+ }