@tscircuit/schematic-trace-solver 0.0.25 → 0.0.27

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 (62) hide show
  1. package/.github/workflows/bun-test.yml +8 -0
  2. package/README.md +28 -0
  3. package/bunfig.toml +2 -2
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +31 -6136
  6. package/lib/solvers/NetLabelPlacementSolver/NetLabelPlacementSolver.ts +0 -1
  7. package/lib/solvers/NetLabelPlacementSolver/SingleNetLabelPlacementSolver/SingleNetLabelPlacementSolver.ts +11 -0
  8. package/lib/solvers/NetLabelPlacementSolver/SingleNetLabelPlacementSolver/SingleNetLabelPlacementSolver_visualize.ts +0 -1
  9. package/lib/solvers/SchematicTraceLinesSolver/SchematicTraceLinesSolver.ts +0 -2
  10. package/lib/solvers/SchematicTraceLinesSolver/SchematicTraceSingleLineSolver/SchematicTraceSingleLineSolver.ts +0 -1
  11. package/lib/solvers/TraceOverlapShiftSolver/TraceOverlapIssueSolver/TraceOverlapIssueSolver.ts +0 -2
  12. package/lib/solvers/TraceOverlapShiftSolver/TraceOverlapShiftSolver.ts +0 -1
  13. package/package.json +6 -7
  14. package/site/SingleNetLabelPlacementSolver/SingleNetLabelPlacementSolver01.page.tsx +574 -0
  15. package/site/components/DownloadDropdown.tsx +4 -2
  16. package/site/examples/example01-basic.page.tsx +1 -1
  17. package/site/examples/example02.page.tsx +1 -1
  18. package/site/examples/example03.page.tsx +1 -1
  19. package/site/examples/example04-single-symbol.page.tsx +1 -1
  20. package/site/examples/example05.page.tsx +1 -1
  21. package/site/examples/example06.page.tsx +1 -1
  22. package/site/examples/example07.page.tsx +1 -1
  23. package/site/examples/example08.page.tsx +1 -1
  24. package/site/examples/example09.page.tsx +1 -1
  25. package/site/examples/example10.page.tsx +1 -1
  26. package/site/examples/example11.page.tsx +1 -1
  27. package/site/examples/example12.page.tsx +1 -1
  28. package/site/examples/example13.page.tsx +219 -0
  29. package/site/examples/example14.page.tsx +210 -0
  30. package/tests/__snapshots__/svg.snap.svg +3 -0
  31. package/tests/examples/__snapshots__/example01.snap.svg +157 -0
  32. package/tests/examples/__snapshots__/example02.snap.svg +262 -0
  33. package/tests/examples/__snapshots__/example03.snap.svg +282 -0
  34. package/tests/examples/__snapshots__/example04.snap.svg +87 -0
  35. package/tests/examples/__snapshots__/example05.snap.svg +190 -0
  36. package/tests/examples/__snapshots__/example06.snap.svg +94 -0
  37. package/tests/examples/__snapshots__/example07.snap.svg +204 -0
  38. package/tests/examples/__snapshots__/example08.snap.svg +136 -0
  39. package/tests/examples/__snapshots__/example09.snap.svg +484 -0
  40. package/tests/examples/__snapshots__/example10.snap.svg +135 -0
  41. package/tests/examples/__snapshots__/example11.snap.svg +162 -0
  42. package/tests/examples/__snapshots__/example12.snap.svg +145 -0
  43. package/tests/examples/__snapshots__/example13.snap.svg +316 -0
  44. package/tests/examples/__snapshots__/example14.snap.svg +213 -0
  45. package/tests/examples/example01.test.ts +12 -0
  46. package/tests/examples/example02.test.ts +12 -0
  47. package/tests/examples/example03.test.ts +12 -0
  48. package/tests/examples/example04.test.ts +12 -0
  49. package/tests/examples/example05.test.ts +12 -0
  50. package/tests/examples/example06.test.ts +12 -0
  51. package/tests/examples/example07.test.ts +12 -0
  52. package/tests/examples/example08.test.ts +12 -0
  53. package/tests/examples/example09.test.ts +12 -0
  54. package/tests/examples/example10.test.ts +12 -0
  55. package/tests/examples/example11.test.tsx +12 -0
  56. package/tests/examples/example12.test.tsx +12 -0
  57. package/tests/examples/example13.test.tsx +12 -0
  58. package/tests/examples/example14.test.tsx +12 -0
  59. package/tests/fixtures/matcher.ts +62 -0
  60. package/tests/fixtures/preload.ts +1 -0
  61. package/tests/solvers/NetLabelPlacementSolver/SingleNetLabelPlacementSolver/SingleNetLabelPlacementSolver01.test.ts +13 -0
  62. package/tests/svg.test.ts +11 -0
@@ -0,0 +1,135 @@
1
+ <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="100%" height="100%" fill="white" />
3
+ <g>
4
+ <circle data-type="point" data-label="Q1_NPN.1
5
+ y-" data-x="-2.2855604555" data-y="-0.5519250999999993" cx="49.983280260645415" cy="365.6995529759246" r="3" fill="hsl(256, 100%, 50%, 0.8)" />
6
+ </g>
7
+ <g>
8
+ <circle data-type="point" data-label="Q1_NPN.2
9
+ y+" data-x="-2.2855604555000015" data-y="0.5519250999999993" cx="49.9832802606453" cy="274.3004470240754" r="3" fill="hsl(257, 100%, 50%, 0.8)" />
10
+ </g>
11
+ <g>
12
+ <circle data-type="point" data-label="Q1_NPN.3
13
+ x+" data-x="-1.5938689350000006" data-y="0.004526300000001031" cx="107.2555320282994" cy="319.6252210913492" r="3" fill="hsl(258, 100%, 50%, 0.8)" />
14
+ </g>
15
+ <g>
16
+ <circle data-type="point" data-label="Q2_PNP.1
17
+ y-" data-x="3.2144395445" data-y="-0.5519250999999993" cx="505.38482182413946" cy="365.6995529759246" r="3" fill="hsl(79, 100%, 50%, 0.8)" />
18
+ </g>
19
+ <g>
20
+ <circle data-type="point" data-label="Q2_PNP.2
21
+ y+" data-x="3.2144395444999985" data-y="0.5519250999999993" cx="505.38482182413935" cy="274.3004470240754" r="3" fill="hsl(80, 100%, 50%, 0.8)" />
22
+ </g>
23
+ <g>
24
+ <circle data-type="point" data-label="Q2_PNP.3
25
+ x+" data-x="3.9061310649999994" data-y="0.004526300000001031" cx="562.6570735917935" cy="319.6252210913492" r="3" fill="hsl(81, 100%, 50%, 0.8)" />
26
+ </g>
27
+ <g>
28
+ <circle data-type="point" data-label="" data-x="-2.2855604555" data-y="-0.5519250999999993" cx="49.983280260645415" cy="365.6995529759246" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
29
+ </g>
30
+ <g>
31
+ <circle data-type="point" data-label="" data-x="3.2144395445" data-y="-0.5519250999999993" cx="505.38482182413946" cy="365.6995529759246" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
32
+ </g>
33
+ <g>
34
+ <circle data-type="point" data-label="" data-x="-2.2855604555000015" data-y="0.5519250999999993" cx="49.9832802606453" cy="274.3004470240754" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
35
+ </g>
36
+ <g>
37
+ <circle data-type="point" data-label="" data-x="3.2144395444999985" data-y="0.5519250999999993" cx="505.38482182413935" cy="274.3004470240754" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
38
+ </g>
39
+ <g>
40
+ <circle data-type="point" data-label="" data-x="-1.5938689350000006" data-y="0.004526300000001031" cx="107.2555320282994" cy="319.6252210913492" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
41
+ </g>
42
+ <g>
43
+ <circle data-type="point" data-label="" data-x="3.9061310649999994" data-y="0.004526300000001031" cx="562.6570735917935" cy="319.6252210913492" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
44
+ </g>
45
+ <g>
46
+ <polyline data-points="-2.2855604555,-0.5519250999999993 3.2144395445,-0.5519250999999993" data-type="line" data-label="" points="49.983280260645415,365.6995529759246 505.38482182413946,365.6995529759246" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
47
+ </g>
48
+ <g>
49
+ <polyline data-points="-2.2855604555000015,0.5519250999999993 3.2144395444999985,0.5519250999999993" data-type="line" data-label="" points="49.9832802606453,274.3004470240754 505.38482182413935,274.3004470240754" fill="none" stroke="hsl(102, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
50
+ </g>
51
+ <g>
52
+ <polyline data-points="-1.5938689350000006,0.004526300000001031 3.9061310649999994,0.004526300000001031" data-type="line" data-label="" points="107.2555320282994,319.6252210913492 562.6570735917935,319.6252210913492" fill="none" stroke="hsl(321, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
53
+ </g>
54
+ <g>
55
+ <rect data-type="rect" data-label="schematic_component_0" data-x="-2" data-y="0" x="40" y="274.3004470240754" width="67.2555320282994" height="91.39910595184915" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.012077253803571426" />
56
+ </g>
57
+ <g>
58
+ <rect data-type="rect" data-label="schematic_component_1" data-x="3.5" data-y="0" x="495.4015415634941" y="274.3004470240754" width="67.2555320282994" height="91.39910595184915" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.012077253803571426" />
59
+ </g>
60
+ <g>
61
+ <rect data-type="rect" data-label="" data-x="-2.2855604555" data-y="-0.7779250999999993" x="41.70325223221823" y="365.78235325620886" width="16.560056056854336" height="37.26012612792226" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.012077253803571426" />
62
+ </g>
63
+ <g>
64
+ <rect data-type="rect" data-label="" data-x="3.2144395445" data-y="-0.7779250999999993" x="497.1047937957123" y="365.78235325620886" width="16.56005605685442" height="37.26012612792226" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.012077253803571426" />
65
+ </g>
66
+ <g>
67
+ <rect data-type="rect" data-label="" data-x="-2.2855604555000015" data-y="0.7779250999999993" x="41.70325223221812" y="236.95752061586887" width="16.560056056854336" height="37.26012612792226" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.012077253803571426" />
68
+ </g>
69
+ <g>
70
+ <rect data-type="rect" data-label="" data-x="3.2144395444999985" data-y="0.7779250999999993" x="497.10479379571217" y="236.95752061586887" width="16.560056056854307" height="37.26012612792226" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.012077253803571426" />
71
+ </g>
72
+ <g>
73
+ <rect data-type="rect" data-label="" data-x="-1.3678689350000006" data-y="0.004526300000001031" x="107.33833230858366" y="311.345193062922" width="37.26012612792226" height="16.560056056854364" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.012077253803571426" />
74
+ </g>
75
+ <g>
76
+ <rect data-type="rect" data-label="" data-x="4.132131064999999" data-y="0.004526300000001031" x="562.7398738720777" y="311.345193062922" width="37.26012612792226" height="16.560056056854364" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.012077253803571426" />
77
+ </g>
78
+ <g id="crosshair" style="display: none">
79
+ <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
80
+ <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>
81
+ </g>
82
+ <script>
83
+ <![CDATA[
84
+ document.currentScript.parentElement.addEventListener('mousemove', (e) => {
85
+ const svg = e.currentTarget;
86
+ const rect = svg.getBoundingClientRect();
87
+ const x = e.clientX - rect.left;
88
+ const y = e.clientY - rect.top;
89
+ const crosshair = svg.getElementById('crosshair');
90
+ const h = svg.getElementById('crosshair-h');
91
+ const v = svg.getElementById('crosshair-v');
92
+ const coords = svg.getElementById('coordinates');
93
+
94
+ crosshair.style.display = 'block';
95
+ h.setAttribute('x1', '0');
96
+ h.setAttribute('x2', '640');
97
+ h.setAttribute('y1', y);
98
+ h.setAttribute('y2', y);
99
+ v.setAttribute('x1', x);
100
+ v.setAttribute('x2', x);
101
+ v.setAttribute('y1', '0');
102
+ v.setAttribute('y2', '640');
103
+
104
+ // Calculate real coordinates using inverse transformation
105
+ const matrix = {
106
+ "a": 82.80028028427165,
107
+ "c": 0,
108
+ "e": 239.228326582693,
109
+ "b": 0,
110
+ "d": -82.80028028427165,
111
+ "f": 320
112
+ };
113
+ // Manually invert and apply the affine transform
114
+ // Since we only use translate and scale, we can directly compute:
115
+ // x' = (x - tx) / sx
116
+ // y' = (y - ty) / sy
117
+ const sx = matrix.a;
118
+ const sy = matrix.d;
119
+ const tx = matrix.e;
120
+ const ty = matrix.f;
121
+ const realPoint = {
122
+ x: (x - tx) / sx,
123
+ y: (y - ty) / sy // Flip y back since we used negative scale
124
+ }
125
+
126
+ coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
127
+ coords.setAttribute('x', (x + 5).toString());
128
+ coords.setAttribute('y', (y - 5).toString());
129
+ });
130
+ document.currentScript.parentElement.addEventListener('mouseleave', () => {
131
+ document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
132
+ });
133
+ ]]>
134
+ </script>
135
+ </svg>
@@ -0,0 +1,162 @@
1
+ <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="100%" height="100%" fill="white" />
3
+ <g>
4
+ <circle data-type="point" data-label="R1.1
5
+ x-" data-x="-1.58" data-y="0.765" cx="103.74558303886928" cy="224.94699646643113" r="3" fill="hsl(226, 100%, 50%, 0.8)" />
6
+ </g>
7
+ <g>
8
+ <circle data-type="point" data-label="R1.2
9
+ x+" data-x="-0.48" data-y="0.765" cx="259.2226148409894" cy="224.94699646643113" r="3" fill="hsl(227, 100%, 50%, 0.8)" />
10
+ </g>
11
+ <g>
12
+ <circle data-type="point" data-label="R2.1
13
+ x-" data-x="0.48" data-y="0.765" cx="394.9116607773851" cy="224.94699646643113" r="3" fill="hsl(107, 100%, 50%, 0.8)" />
14
+ </g>
15
+ <g>
16
+ <circle data-type="point" data-label="R2.2
17
+ x+" data-x="1.58" data-y="0.765" cx="550.3886925795052" cy="224.94699646643113" r="3" fill="hsl(108, 100%, 50%, 0.8)" />
18
+ </g>
19
+ <g>
20
+ <circle data-type="point" data-label="R3.1
21
+ x-" data-x="-1.58" data-y="-0.765" cx="103.74558303886928" cy="441.2014134275618" r="3" fill="hsl(348, 100%, 50%, 0.8)" />
22
+ </g>
23
+ <g>
24
+ <circle data-type="point" data-label="R3.2
25
+ x+" data-x="-0.48" data-y="-0.765" cx="259.2226148409894" cy="441.2014134275618" r="3" fill="hsl(349, 100%, 50%, 0.8)" />
26
+ </g>
27
+ <g>
28
+ <circle data-type="point" data-label="J1.1
29
+ x-" data-x="0.5800000000000001" data-y="-0.665" cx="409.0459363957597" cy="427.0671378091873" r="3" fill="hsl(218, 100%, 50%, 0.8)" />
30
+ </g>
31
+ <g>
32
+ <circle data-type="point" data-label="J1.2
33
+ y-" data-x="1.03" data-y="-1.03" cx="472.6501766784452" cy="478.65724381625444" r="3" fill="hsl(219, 100%, 50%, 0.8)" />
34
+ </g>
35
+ <g>
36
+ <circle data-type="point" data-label="J1.3
37
+ x+" data-x="1.48" data-y="-0.665" cx="536.2544169611307" cy="427.0671378091873" r="3" fill="hsl(220, 100%, 50%, 0.8)" />
38
+ </g>
39
+ <g>
40
+ <circle data-type="point" data-label="" data-x="0.27999999999999997" data-y="0.765" cx="366.64310954063603" cy="224.94699646643113" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
41
+ </g>
42
+ <g>
43
+ <circle data-type="point" data-label="" data-x="1.7800000000000002" data-y="0.765" cx="578.6572438162544" cy="224.94699646643113" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
44
+ </g>
45
+ <g>
46
+ <circle data-type="point" data-label="" data-x="0.5800000000000001" data-y="-0.665" cx="409.0459363957597" cy="427.0671378091873" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
47
+ </g>
48
+ <g>
49
+ <circle data-type="point" data-label="" data-x="-1.58" data-y="0.765" cx="103.74558303886928" cy="224.94699646643113" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
50
+ </g>
51
+ <g>
52
+ <circle data-type="point" data-label="" data-x="1.48" data-y="-0.665" cx="536.2544169611307" cy="427.0671378091873" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
53
+ </g>
54
+ <g>
55
+ <circle data-type="point" data-label="" data-x="-0.48" data-y="0.765" cx="259.2226148409894" cy="224.94699646643113" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
56
+ </g>
57
+ <g>
58
+ <polyline data-points="0.48,0.765 -0.48,-0.765" data-type="line" data-label="" points="394.9116607773851,224.94699646643113 259.2226148409894,441.2014134275618" fill="none" stroke="hsl(224, 100%, 50%, 0.8)" stroke-width="1" />
59
+ </g>
60
+ <g>
61
+ <polyline data-points="1.58,0.765 -1.58,-0.765" data-type="line" data-label="" points="550.3886925795052,224.94699646643113 103.74558303886928,441.2014134275618" fill="none" stroke="hsl(224, 100%, 50%, 0.8)" stroke-width="1" />
62
+ </g>
63
+ <g>
64
+ <polyline data-points="0.5800000000000001,-0.665 -1.58,0.765" data-type="line" data-label="" points="409.0459363957597,427.0671378091873 103.74558303886928,224.94699646643113" fill="none" stroke="hsl(168, 100%, 50%, 0.8)" stroke-width="1" />
65
+ </g>
66
+ <g>
67
+ <polyline data-points="1.48,-0.665 -0.48,0.765" data-type="line" data-label="" points="536.2544169611307,427.0671378091873 259.2226148409894,224.94699646643113" fill="none" stroke="hsl(168, 100%, 50%, 0.8)" stroke-width="1" />
68
+ </g>
69
+ <g>
70
+ <polyline data-points="0.48,0.765 0.27999999999999997,0.765 0,0.765 0,-0.765 -0.27999999999999997,-0.765 -0.48,-0.765" data-type="line" data-label="" points="394.9116607773851,224.94699646643113 366.64310954063603,224.94699646643113 327.0671378091873,224.94699646643113 327.0671378091873,441.2014134275618 287.4911660777385,441.2014134275618 259.2226148409894,441.2014134275618" fill="none" stroke="purple" stroke-width="1" />
71
+ </g>
72
+ <g>
73
+ <polyline data-points="1.58,0.765 1.7800000000000002,0.765 1.7800000000000002,0 -1.78,0 -1.78,-0.765 -1.58,-0.765" data-type="line" data-label="" points="550.3886925795052,224.94699646643113 578.6572438162544,224.94699646643113 578.6572438162544,333.0742049469965 75.47703180212017,333.0742049469965 75.47703180212017,441.2014134275618 103.74558303886928,441.2014134275618" fill="none" stroke="purple" stroke-width="1" />
74
+ </g>
75
+ <g>
76
+ <rect data-type="rect" data-label="schematic_component_0" data-x="-1.03" data-y="0.765" x="103.74558303886928" y="197.46214134275627" width="155.47703180212014" height="54.969710247349695" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.0070750000000000006" />
77
+ </g>
78
+ <g>
79
+ <rect data-type="rect" data-label="schematic_component_1" data-x="1.03" data-y="0.765" x="394.9116607773851" y="197.46214134275627" width="155.4770318021201" height="54.969710247349695" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.0070750000000000006" />
80
+ </g>
81
+ <g>
82
+ <rect data-type="rect" data-label="schematic_component_2" data-x="-1.03" data-y="-0.765" x="103.74558303886928" y="413.716558303887" width="155.47703180212014" height="54.969710247349724" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.0070750000000000006" />
83
+ </g>
84
+ <g>
85
+ <rect data-type="rect" data-label="schematic_component_3" data-x="1.03" data-y="-0.765" x="409.0459363957597" y="403.74558303886926" width="127.20848056537096" height="74.91166077738518" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.0070750000000000006" />
86
+ </g>
87
+ <g>
88
+ <rect data-type="rect" data-label="" data-x="0.27999999999999997" data-y="0.99" x="352.5088339222615" y="161.3427561837456" width="28.26855123674909" height="63.60424028268554" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.0070750000000000006" />
89
+ </g>
90
+ <g>
91
+ <rect data-type="rect" data-label="" data-x="1.7800000000000002" data-y="0.99" x="564.5229681978799" y="161.3427561837456" width="28.26855123674909" height="63.60424028268554" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.0070750000000000006" />
92
+ </g>
93
+ <g>
94
+ <rect data-type="rect" data-label="" data-x="0.3540000000000001" data-y="-0.665" x="345.30035335689047" y="412.9328621908127" width="63.60424028268551" height="28.26855123674909" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.0070750000000000006" />
95
+ </g>
96
+ <g>
97
+ <rect data-type="rect" data-label="" data-x="-1.806" data-y="0.765" x="40" y="210.81272084805656" width="63.60424028268554" height="28.26855123674912" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.0070750000000000006" />
98
+ </g>
99
+ <g>
100
+ <rect data-type="rect" data-label="" data-x="1.706" data-y="-0.665" x="536.3957597173144" y="412.9328621908127" width="63.60424028268562" height="28.26855123674909" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.0070750000000000006" />
101
+ </g>
102
+ <g>
103
+ <rect data-type="rect" data-label="" data-x="-0.254" data-y="0.765" x="259.36395759717317" y="210.81272084805656" width="63.60424028268551" height="28.26855123674912" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.0070750000000000006" />
104
+ </g>
105
+ <g id="crosshair" style="display: none">
106
+ <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
107
+ <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>
108
+ </g>
109
+ <script>
110
+ <![CDATA[
111
+ document.currentScript.parentElement.addEventListener('mousemove', (e) => {
112
+ const svg = e.currentTarget;
113
+ const rect = svg.getBoundingClientRect();
114
+ const x = e.clientX - rect.left;
115
+ const y = e.clientY - rect.top;
116
+ const crosshair = svg.getElementById('crosshair');
117
+ const h = svg.getElementById('crosshair-h');
118
+ const v = svg.getElementById('crosshair-v');
119
+ const coords = svg.getElementById('coordinates');
120
+
121
+ crosshair.style.display = 'block';
122
+ h.setAttribute('x1', '0');
123
+ h.setAttribute('x2', '640');
124
+ h.setAttribute('y1', y);
125
+ h.setAttribute('y2', y);
126
+ v.setAttribute('x1', x);
127
+ v.setAttribute('x2', x);
128
+ v.setAttribute('y1', '0');
129
+ v.setAttribute('y2', '640');
130
+
131
+ // Calculate real coordinates using inverse transformation
132
+ const matrix = {
133
+ "a": 141.34275618374556,
134
+ "c": 0,
135
+ "e": 327.0671378091873,
136
+ "b": 0,
137
+ "d": -141.34275618374556,
138
+ "f": 333.0742049469965
139
+ };
140
+ // Manually invert and apply the affine transform
141
+ // Since we only use translate and scale, we can directly compute:
142
+ // x' = (x - tx) / sx
143
+ // y' = (y - ty) / sy
144
+ const sx = matrix.a;
145
+ const sy = matrix.d;
146
+ const tx = matrix.e;
147
+ const ty = matrix.f;
148
+ const realPoint = {
149
+ x: (x - tx) / sx,
150
+ y: (y - ty) / sy // Flip y back since we used negative scale
151
+ }
152
+
153
+ coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
154
+ coords.setAttribute('x', (x + 5).toString());
155
+ coords.setAttribute('y', (y - 5).toString());
156
+ });
157
+ document.currentScript.parentElement.addEventListener('mouseleave', () => {
158
+ document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
159
+ });
160
+ ]]>
161
+ </script>
162
+ </svg>
@@ -0,0 +1,145 @@
1
+ <svg width="640" height="640" viewBox="0 0 640 640" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="100%" height="100%" fill="white" />
3
+ <g>
4
+ <circle data-type="point" data-label="J1.1
5
+ x+" data-x="1.1" data-y="0.2" cx="288.33702882483374" cy="207.43247369481963" r="3" fill="hsl(218, 100%, 50%, 0.8)" />
6
+ </g>
7
+ <g>
8
+ <circle data-type="point" data-label="J1.2
9
+ x+" data-x="1.1" data-y="0" cx="288.33702882483374" cy="230.00856722434997" r="3" fill="hsl(219, 100%, 50%, 0.8)" />
10
+ </g>
11
+ <g>
12
+ <circle data-type="point" data-label="J1.3
13
+ x+" data-x="1.1" data-y="-0.2" cx="288.33702882483374" cy="252.5846607538803" r="3" fill="hsl(220, 100%, 50%, 0.8)" />
14
+ </g>
15
+ <g>
16
+ <circle data-type="point" data-label="R1.1
17
+ x-" data-x="0.5499999999999996" data-y="-1.7944553499999996" cx="226.25277161862525" cy="432.5675263051804" r="3" fill="hsl(226, 100%, 50%, 0.8)" />
18
+ </g>
19
+ <g>
20
+ <circle data-type="point" data-label="R1.2
21
+ x+" data-x="1.6499999999999997" data-y="-1.7944553499999996" cx="350.4212860310421" cy="432.5675263051804" r="3" fill="hsl(227, 100%, 50%, 0.8)" />
22
+ </g>
23
+ <g>
24
+ <circle data-type="point" data-label="C1.1
25
+ x-" data-x="2.3099999999999996" data-y="0.01999999999999985" cx="424.9223946784922" cy="227.75095787139696" r="3" fill="hsl(121, 100%, 50%, 0.8)" />
26
+ </g>
27
+ <g>
28
+ <circle data-type="point" data-label="C1.2
29
+ x+" data-x="3.41" data-y="0.01999999999999985" cx="549.090909090909" cy="227.75095787139696" r="3" fill="hsl(122, 100%, 50%, 0.8)" />
30
+ </g>
31
+ <g>
32
+ <circle data-type="point" data-label="" data-x="1.3" data-y="0.2" cx="310.9131223543641" cy="207.43247369481963" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
33
+ </g>
34
+ <g>
35
+ <circle data-type="point" data-label="" data-x="1.3" data-y="-0.4486138374999999" cx="310.9131223543641" cy="280.6483069945576" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
36
+ </g>
37
+ <g>
38
+ <circle data-type="point" data-label="" data-x="1.8499999999999996" data-y="-1.7944553499999996" cx="372.9973795605724" cy="432.5675263051804" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
39
+ </g>
40
+ <g>
41
+ <circle data-type="point" data-label="" data-x="3.41" data-y="0.01999999999999985" cx="549.090909090909" cy="227.75095787139696" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
42
+ </g>
43
+ <g>
44
+ <polyline data-points="1.1,0.2 2.3099999999999996,0.01999999999999985" data-type="line" data-label="" points="288.33702882483374,207.43247369481963 424.9223946784922,227.75095787139696" fill="none" stroke="hsl(190, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
45
+ </g>
46
+ <g>
47
+ <polyline data-points="1.1,0 0.5499999999999996,-1.7944553499999996" data-type="line" data-label="" points="288.33702882483374,230.00856722434997 226.25277161862525,432.5675263051804" fill="none" stroke="hsl(158, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
48
+ </g>
49
+ <g>
50
+ <polyline data-points="1.1,-0.2 1.6499999999999997,-1.7944553499999996" data-type="line" data-label="" points="288.33702882483374,252.5846607538803 350.4212860310421,432.5675263051804" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
51
+ </g>
52
+ <g>
53
+ <polyline data-points="1.1,-0.2 3.41,0.01999999999999985" data-type="line" data-label="" points="288.33702882483374,252.5846607538803 549.090909090909,227.75095787139696" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
54
+ </g>
55
+ <g>
56
+ <polyline data-points="1.6499999999999997,-1.7944553499999996 3.41,0.01999999999999985" data-type="line" data-label="" points="350.4212860310421,432.5675263051804 549.090909090909,227.75095787139696" fill="none" stroke="hsl(157, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
57
+ </g>
58
+ <g>
59
+ <polyline data-points="1.1,0.2 1.3,0.2 1.7049999999999998,0.2 1.7049999999999998,0.01999999999999985 2.1099999999999994,0.01999999999999985 2.3099999999999996,0.01999999999999985" data-type="line" data-label="" points="288.33702882483374,207.43247369481963 310.9131223543641,207.43247369481963 356.62971175166297,207.43247369481963 356.62971175166297,227.75095787139696 402.34630114896186,227.75095787139696 424.9223946784922,227.75095787139696" fill="none" stroke="purple" stroke-width="1" />
60
+ </g>
61
+ <g>
62
+ <polyline data-points="1.1,0 1.3,0 1.3,-0.8972276749999998 0.34999999999999964,-0.8972276749999998 0.34999999999999964,-1.7944553499999996 0.5499999999999996,-1.7944553499999996" data-type="line" data-label="" points="288.33702882483374,230.00856722434997 310.9131223543641,230.00856722434997 310.9131223543641,331.28804676476517 203.6766780890949,331.28804676476517 203.6766780890949,432.5675263051804 226.25277161862525,432.5675263051804" fill="none" stroke="purple" stroke-width="1" />
63
+ </g>
64
+ <g>
65
+ <polyline data-points="1.6499999999999997,-1.7944553499999996 1.8499999999999996,-1.7944553499999996 1.8499999999999996,-0.2 1.1,-0.2" data-type="line" data-label="" points="350.4212860310421,432.5675263051804 372.9973795605724,432.5675263051804 372.9973795605724,252.5846607538803 288.33702882483374,252.5846607538803" fill="none" stroke="purple" stroke-width="1" />
66
+ </g>
67
+ <g>
68
+ <rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40.000000000000014" y="184.8563801652893" width="248.33702882483374" height="90.30437411812136" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008858928571428573" />
69
+ </g>
70
+ <g>
71
+ <rect data-type="rect" data-label="schematic_component_1" data-x="1.0999999999999996" data-y="-1.7944553499999996" x="226.25277161862525" y="410.61731546059264" width="124.16851441241684" height="43.90042168917546" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008858928571428573" />
72
+ </g>
73
+ <g>
74
+ <rect data-type="rect" data-label="schematic_component_2" data-x="2.86" data-y="0.01999999999999985" x="424.9223946784922" y="180.34116145938327" width="124.16851441241681" height="94.81959282402738" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008858928571428573" />
75
+ </g>
76
+ <g>
77
+ <rect data-type="rect" data-label="" data-x="1.3" data-y="0.42500000000000004" x="299.62507558959885" y="156.6362632533764" width="22.57609352953034" height="50.796210441443236" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008858928571428573" />
78
+ </g>
79
+ <g>
80
+ <rect data-type="rect" data-label="" data-x="1.5250000000000001" data-y="-0.4486138374999999" x="310.9131223543641" y="269.3602602297924" width="50.796210441443236" height="22.57609352953034" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008858928571428573" />
81
+ </g>
82
+ <g>
83
+ <rect data-type="rect" data-label="" data-x="1.8499999999999996" data-y="-2.0194553499999994" x="361.7093327958072" y="432.56752630518037" width="22.576093529530397" height="50.79621044144329" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008858928571428573" />
84
+ </g>
85
+ <g>
86
+ <rect data-type="rect" data-label="" data-x="3.636" data-y="0.01999999999999985" x="549.2037895585568" y="216.4629111066318" width="50.796210441443236" height="22.57609352953034" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008858928571428573" />
87
+ </g>
88
+ <g id="crosshair" style="display: none">
89
+ <line id="crosshair-h" y1="0" y2="640" stroke="#666" stroke-width="0.5" />
90
+ <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>
91
+ </g>
92
+ <script>
93
+ <![CDATA[
94
+ document.currentScript.parentElement.addEventListener('mousemove', (e) => {
95
+ const svg = e.currentTarget;
96
+ const rect = svg.getBoundingClientRect();
97
+ const x = e.clientX - rect.left;
98
+ const y = e.clientY - rect.top;
99
+ const crosshair = svg.getElementById('crosshair');
100
+ const h = svg.getElementById('crosshair-h');
101
+ const v = svg.getElementById('crosshair-v');
102
+ const coords = svg.getElementById('coordinates');
103
+
104
+ crosshair.style.display = 'block';
105
+ h.setAttribute('x1', '0');
106
+ h.setAttribute('x2', '640');
107
+ h.setAttribute('y1', y);
108
+ h.setAttribute('y2', y);
109
+ v.setAttribute('x1', x);
110
+ v.setAttribute('x2', x);
111
+ v.setAttribute('y1', '0');
112
+ v.setAttribute('y2', '640');
113
+
114
+ // Calculate real coordinates using inverse transformation
115
+ const matrix = {
116
+ "a": 112.88046764765167,
117
+ "c": 0,
118
+ "e": 164.16851441241687,
119
+ "b": 0,
120
+ "d": -112.88046764765167,
121
+ "f": 230.00856722434997
122
+ };
123
+ // Manually invert and apply the affine transform
124
+ // Since we only use translate and scale, we can directly compute:
125
+ // x' = (x - tx) / sx
126
+ // y' = (y - ty) / sy
127
+ const sx = matrix.a;
128
+ const sy = matrix.d;
129
+ const tx = matrix.e;
130
+ const ty = matrix.f;
131
+ const realPoint = {
132
+ x: (x - tx) / sx,
133
+ y: (y - ty) / sy // Flip y back since we used negative scale
134
+ }
135
+
136
+ coords.textContent = `(${realPoint.x.toFixed(2)}, ${realPoint.y.toFixed(2)})`;
137
+ coords.setAttribute('x', (x + 5).toString());
138
+ coords.setAttribute('y', (y - 5).toString());
139
+ });
140
+ document.currentScript.parentElement.addEventListener('mouseleave', () => {
141
+ document.currentScript.parentElement.getElementById('crosshair').style.display = 'none';
142
+ });
143
+ ]]>
144
+ </script>
145
+ </svg>