@tscircuit/schematic-trace-solver 0.0.43 → 0.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts
CHANGED
|
@@ -238,6 +238,7 @@ declare class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
238
238
|
*/
|
|
239
239
|
traceNetIslands: Record<ConnNetId, Array<SolvedTracePath>>;
|
|
240
240
|
correctedTraceMap: Record<MspConnectionPairId, SolvedTracePath>;
|
|
241
|
+
cleanupPhase: "diagonals" | "done" | null;
|
|
241
242
|
constructor(params: {
|
|
242
243
|
inputProblem: InputProblem;
|
|
243
244
|
inputTracePaths: Array<SolvedTracePath>;
|
|
@@ -248,6 +249,8 @@ declare class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
248
249
|
findNextOverlapIssue(): {
|
|
249
250
|
overlappingTraceSegments: Array<OverlappingTraceSegmentLocator>;
|
|
250
251
|
} | null;
|
|
252
|
+
private findNextDiagonalSegment;
|
|
253
|
+
private findAndFixNextDiagonalSegment;
|
|
251
254
|
_step(): void;
|
|
252
255
|
visualize(): graphics_debug.GraphicsObject;
|
|
253
256
|
}
|
package/dist/index.js
CHANGED
|
@@ -1188,6 +1188,7 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
|
|
|
1188
1188
|
*/
|
|
1189
1189
|
traceNetIslands = {};
|
|
1190
1190
|
correctedTraceMap = {};
|
|
1191
|
+
cleanupPhase = null;
|
|
1191
1192
|
constructor(params) {
|
|
1192
1193
|
super();
|
|
1193
1194
|
this.inputProblem = params.inputProblem;
|
|
@@ -1314,6 +1315,47 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
|
|
|
1314
1315
|
}
|
|
1315
1316
|
return null;
|
|
1316
1317
|
}
|
|
1318
|
+
findNextDiagonalSegment() {
|
|
1319
|
+
const EPS4 = 2e-3;
|
|
1320
|
+
for (const mspPairId in this.correctedTraceMap) {
|
|
1321
|
+
const tracePath = this.correctedTraceMap[mspPairId].tracePath;
|
|
1322
|
+
for (let i = 0; i < tracePath.length - 1; i++) {
|
|
1323
|
+
const p1 = tracePath[i];
|
|
1324
|
+
const p2 = tracePath[i + 1];
|
|
1325
|
+
const isHorizontal2 = Math.abs(p1.y - p2.y) < EPS4;
|
|
1326
|
+
const isVertical2 = Math.abs(p1.x - p2.x) < EPS4;
|
|
1327
|
+
if (!isHorizontal2 && !isVertical2) {
|
|
1328
|
+
return { mspPairId, tracePath, i, p1, p2 };
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
return null;
|
|
1333
|
+
}
|
|
1334
|
+
findAndFixNextDiagonalSegment() {
|
|
1335
|
+
const diagonalInfo = this.findNextDiagonalSegment();
|
|
1336
|
+
if (!diagonalInfo) {
|
|
1337
|
+
return false;
|
|
1338
|
+
}
|
|
1339
|
+
const { mspPairId, tracePath, i, p1, p2 } = diagonalInfo;
|
|
1340
|
+
const EPS4 = 2e-3;
|
|
1341
|
+
const p0 = i > 0 ? tracePath[i - 1] : null;
|
|
1342
|
+
const p3 = i + 2 < tracePath.length ? tracePath[i + 2] : null;
|
|
1343
|
+
const prevIsVertical = p0 ? Math.abs(p0.x - p1.x) < EPS4 : false;
|
|
1344
|
+
const prevIsHorizontal = p0 ? Math.abs(p0.y - p1.y) < EPS4 : false;
|
|
1345
|
+
const nextIsVertical = p3 ? Math.abs(p2.x - p3.x) < EPS4 : false;
|
|
1346
|
+
const nextIsHorizontal = p3 ? Math.abs(p2.y - p3.y) < EPS4 : false;
|
|
1347
|
+
const elbow1 = { x: p1.x, y: p2.y };
|
|
1348
|
+
const elbow2 = { x: p2.x, y: p1.y };
|
|
1349
|
+
let score1 = 0;
|
|
1350
|
+
if (prevIsVertical) score1++;
|
|
1351
|
+
if (nextIsHorizontal) score1++;
|
|
1352
|
+
let score2 = 0;
|
|
1353
|
+
if (prevIsHorizontal) score2++;
|
|
1354
|
+
if (nextIsVertical) score2++;
|
|
1355
|
+
const elbowPoint = score1 < score2 ? elbow1 : elbow2;
|
|
1356
|
+
tracePath.splice(i + 1, 0, elbowPoint);
|
|
1357
|
+
return true;
|
|
1358
|
+
}
|
|
1317
1359
|
_step() {
|
|
1318
1360
|
if (this.activeSubSolver?.solved) {
|
|
1319
1361
|
for (const [mspPairId, newTrace] of Object.entries(
|
|
@@ -1330,6 +1372,17 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
|
|
|
1330
1372
|
}
|
|
1331
1373
|
const overlapIssue = this.findNextOverlapIssue();
|
|
1332
1374
|
if (overlapIssue === null) {
|
|
1375
|
+
if (this.cleanupPhase === null) {
|
|
1376
|
+
this.cleanupPhase = "diagonals";
|
|
1377
|
+
}
|
|
1378
|
+
if (this.cleanupPhase === "diagonals") {
|
|
1379
|
+
const fixedDiagonal = this.findAndFixNextDiagonalSegment();
|
|
1380
|
+
if (!fixedDiagonal) {
|
|
1381
|
+
this.cleanupPhase = "done";
|
|
1382
|
+
this.solved = true;
|
|
1383
|
+
}
|
|
1384
|
+
return;
|
|
1385
|
+
}
|
|
1333
1386
|
this.solved = true;
|
|
1334
1387
|
return;
|
|
1335
1388
|
}
|
|
@@ -1344,12 +1397,23 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
|
|
|
1344
1397
|
return this.activeSubSolver.visualize();
|
|
1345
1398
|
}
|
|
1346
1399
|
const graphics = visualizeInputProblem(this.inputProblem);
|
|
1400
|
+
graphics.circles = graphics.circles || [];
|
|
1347
1401
|
for (const trace of Object.values(this.correctedTraceMap)) {
|
|
1348
1402
|
graphics.lines.push({
|
|
1349
1403
|
points: trace.tracePath,
|
|
1350
1404
|
strokeColor: "purple"
|
|
1351
1405
|
});
|
|
1352
1406
|
}
|
|
1407
|
+
if (this.cleanupPhase === "diagonals") {
|
|
1408
|
+
const diagonalInfo = this.findNextDiagonalSegment();
|
|
1409
|
+
if (diagonalInfo) {
|
|
1410
|
+
graphics.lines.push({
|
|
1411
|
+
points: [diagonalInfo.p1, diagonalInfo.p2],
|
|
1412
|
+
strokeColor: "red",
|
|
1413
|
+
strokeWidth: 0.05
|
|
1414
|
+
});
|
|
1415
|
+
}
|
|
1416
|
+
}
|
|
1353
1417
|
return graphics;
|
|
1354
1418
|
}
|
|
1355
1419
|
};
|
|
@@ -42,6 +42,8 @@ export class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
42
42
|
|
|
43
43
|
correctedTraceMap: Record<MspConnectionPairId, SolvedTracePath> = {}
|
|
44
44
|
|
|
45
|
+
cleanupPhase: "diagonals" | "done" | null = null
|
|
46
|
+
|
|
45
47
|
constructor(params: {
|
|
46
48
|
inputProblem: InputProblem
|
|
47
49
|
inputTracePaths: Array<SolvedTracePath>
|
|
@@ -211,6 +213,62 @@ export class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
211
213
|
return null
|
|
212
214
|
}
|
|
213
215
|
|
|
216
|
+
private findNextDiagonalSegment() {
|
|
217
|
+
const EPS = 2e-3
|
|
218
|
+
for (const mspPairId in this.correctedTraceMap) {
|
|
219
|
+
const tracePath = this.correctedTraceMap[mspPairId]!.tracePath
|
|
220
|
+
for (let i = 0; i < tracePath.length - 1; i++) {
|
|
221
|
+
const p1 = tracePath[i]!
|
|
222
|
+
const p2 = tracePath[i + 1]!
|
|
223
|
+
|
|
224
|
+
const isHorizontal = Math.abs(p1.y - p2.y) < EPS
|
|
225
|
+
const isVertical = Math.abs(p1.x - p2.x) < EPS
|
|
226
|
+
|
|
227
|
+
if (!isHorizontal && !isVertical) {
|
|
228
|
+
return { mspPairId, tracePath, i, p1, p2 }
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return null
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
private findAndFixNextDiagonalSegment(): boolean {
|
|
236
|
+
const diagonalInfo = this.findNextDiagonalSegment()
|
|
237
|
+
|
|
238
|
+
if (!diagonalInfo) {
|
|
239
|
+
return false // No diagonal segments found
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const { mspPairId, tracePath, i, p1, p2 } = diagonalInfo
|
|
243
|
+
const EPS = 2e-3
|
|
244
|
+
|
|
245
|
+
const p0 = i > 0 ? tracePath[i - 1] : null
|
|
246
|
+
const p3 = i + 2 < tracePath.length ? tracePath[i + 2] : null
|
|
247
|
+
|
|
248
|
+
const prevIsVertical = p0 ? Math.abs(p0.x - p1.x) < EPS : false
|
|
249
|
+
const prevIsHorizontal = p0 ? Math.abs(p0.y - p1.y) < EPS : false
|
|
250
|
+
|
|
251
|
+
const nextIsVertical = p3 ? Math.abs(p2.x - p3.x) < EPS : false
|
|
252
|
+
const nextIsHorizontal = p3 ? Math.abs(p2.y - p3.y) < EPS : false
|
|
253
|
+
|
|
254
|
+
const elbow1 = { x: p1.x, y: p2.y } // vertical from p1
|
|
255
|
+
const elbow2 = { x: p2.x, y: p1.y } // horizontal from p1
|
|
256
|
+
|
|
257
|
+
let score1 = 0
|
|
258
|
+
if (prevIsVertical) score1++
|
|
259
|
+
if (nextIsHorizontal) score1++
|
|
260
|
+
|
|
261
|
+
let score2 = 0
|
|
262
|
+
if (prevIsHorizontal) score2++
|
|
263
|
+
if (nextIsVertical) score2++
|
|
264
|
+
|
|
265
|
+
const elbowPoint = score1 < score2 ? elbow1 : elbow2
|
|
266
|
+
|
|
267
|
+
// Replace [p1, p2] with [p1, elbowPoint, p2]
|
|
268
|
+
tracePath.splice(i + 1, 0, elbowPoint)
|
|
269
|
+
return true // Fixed one diagonal, return true to re-evaluate in next step
|
|
270
|
+
}
|
|
271
|
+
|
|
214
272
|
override _step() {
|
|
215
273
|
if (this.activeSubSolver?.solved) {
|
|
216
274
|
for (const [mspPairId, newTrace] of Object.entries(
|
|
@@ -231,6 +289,19 @@ export class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
231
289
|
const overlapIssue = this.findNextOverlapIssue()
|
|
232
290
|
|
|
233
291
|
if (overlapIssue === null) {
|
|
292
|
+
if (this.cleanupPhase === null) {
|
|
293
|
+
this.cleanupPhase = "diagonals"
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (this.cleanupPhase === "diagonals") {
|
|
297
|
+
const fixedDiagonal = this.findAndFixNextDiagonalSegment()
|
|
298
|
+
if (!fixedDiagonal) {
|
|
299
|
+
this.cleanupPhase = "done"
|
|
300
|
+
this.solved = true
|
|
301
|
+
}
|
|
302
|
+
return
|
|
303
|
+
}
|
|
304
|
+
// If cleanupPhase is "done", then the solver is truly solved.
|
|
234
305
|
this.solved = true
|
|
235
306
|
return
|
|
236
307
|
}
|
|
@@ -249,6 +320,7 @@ export class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
249
320
|
}
|
|
250
321
|
|
|
251
322
|
const graphics = visualizeInputProblem(this.inputProblem)
|
|
323
|
+
graphics.circles = graphics.circles || []
|
|
252
324
|
|
|
253
325
|
// Draw current corrected traces
|
|
254
326
|
for (const trace of Object.values(this.correctedTraceMap)) {
|
|
@@ -258,6 +330,17 @@ export class TraceOverlapShiftSolver extends BaseSolver {
|
|
|
258
330
|
})
|
|
259
331
|
}
|
|
260
332
|
|
|
333
|
+
if (this.cleanupPhase === "diagonals") {
|
|
334
|
+
const diagonalInfo = this.findNextDiagonalSegment()
|
|
335
|
+
if (diagonalInfo) {
|
|
336
|
+
graphics.lines!.push({
|
|
337
|
+
points: [diagonalInfo.p1, diagonalInfo.p2],
|
|
338
|
+
strokeColor: "red",
|
|
339
|
+
strokeWidth: 0.05,
|
|
340
|
+
})
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
261
344
|
return graphics
|
|
262
345
|
}
|
|
263
346
|
}
|
package/package.json
CHANGED
|
@@ -51,7 +51,7 @@ x-" data-x="1.6" data-y="1.7049999999999998" cx="353.6" cy="244.12000000000006"
|
|
|
51
51
|
<circle data-type="point" data-label="" data-x="1.6" data-y="1.7049999999999998" cx="353.6" cy="244.12000000000006" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
|
|
52
52
|
</g>
|
|
53
53
|
<g>
|
|
54
|
-
<circle data-type="point" data-label="" data-x="1.3" data-y="
|
|
54
|
+
<circle data-type="point" data-label="" data-x="1.3" data-y="0.09999999999999998" cx="320" cy="423.88000000000005" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
|
|
55
55
|
</g>
|
|
56
56
|
<g>
|
|
57
57
|
<circle data-type="point" data-label="" data-x="0.9490000000000001" data-y="2.105" cx="280.68800000000005" cy="199.32000000000005" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
|
|
@@ -66,10 +66,10 @@ x-" data-x="1.6" data-y="1.7049999999999998" cx="353.6" cy="244.12000000000006"
|
|
|
66
66
|
<polyline data-points="1.2000000000000002,0.30000000000000004 1.6,2.105" data-type="line" data-label="" points="308.80000000000007,401.48 353.6,199.32000000000005" fill="none" stroke="hsl(190, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
|
|
67
67
|
</g>
|
|
68
68
|
<g>
|
|
69
|
-
<polyline data-points="1.2000000000000002,0.09999999999999998 1.
|
|
69
|
+
<polyline data-points="1.2000000000000002,0.09999999999999998 1.3,0.09999999999999998 1.3,1.5049999999999997 1.049,1.5049999999999997 1.049,1.905 1.6,1.9049999999999998" data-type="line" data-label="" points="308.80000000000007,423.88000000000005 320,423.88000000000005 320,266.5200000000001 291.88800000000003,266.5200000000001 291.88800000000003,221.72000000000003 353.6,221.72000000000006" fill="none" stroke="purple" stroke-width="1" />
|
|
70
70
|
</g>
|
|
71
71
|
<g>
|
|
72
|
-
<polyline data-points="1.2000000000000002,0.30000000000000004 1.
|
|
72
|
+
<polyline data-points="1.2000000000000002,0.30000000000000004 1.5000000000000002,0.30000000000000004 1.5000000000000002,1.4049999999999998 0.9490000000000001,1.4049999999999998 0.9490000000000001,2.105 1.6,2.105" data-type="line" data-label="" points="308.80000000000007,401.48 342.4000000000001,401.48 342.4000000000001,277.72 280.68800000000005,277.72 280.68800000000005,199.32000000000005 353.6,199.32000000000005" fill="none" stroke="purple" stroke-width="1" />
|
|
73
73
|
</g>
|
|
74
74
|
<g>
|
|
75
75
|
<rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40" y="379.08000000000004" width="268.80000000000007" height="112" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008928571428571428" />
|
|
@@ -84,7 +84,7 @@ x-" data-x="1.6" data-y="1.7049999999999998" cx="353.6" cy="244.12000000000006"
|
|
|
84
84
|
<rect data-type="rect" data-label="" data-x="1.374" data-y="1.7049999999999998" x="303.088" y="232.92000000000004" width="50.400000000000034" height="22.400000000000034" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008928571428571428" />
|
|
85
85
|
</g>
|
|
86
86
|
<g>
|
|
87
|
-
<rect data-type="rect" data-label="" data-x="1.
|
|
87
|
+
<rect data-type="rect" data-label="" data-x="1.5250000000000001" data-y="0.09999999999999998" x="320" y="412.68000000000006" width="50.40000000000009" height="22.399999999999977" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008928571428571428" />
|
|
88
88
|
</g>
|
|
89
89
|
<g>
|
|
90
90
|
<rect data-type="rect" data-label="" data-x="0.9490000000000001" data-y="2.33" x="269.48800000000006" y="148.92000000000002" width="22.399999999999977" height="50.400000000000034" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008928571428571428" />
|
|
@@ -534,7 +534,7 @@ x+" data-x="-8.4" data-y="-17" cx="198.31710258539454" cy="399.68032912258366" r
|
|
|
534
534
|
<circle data-type="point" data-label="" data-x="3.5999999999999996" data-y="0.7000000000000015" cx="413.0516274346982" cy="82.94690496986073" r="3" fill="hsl(80, 100%, 50%, 0.9)" />
|
|
535
535
|
</g>
|
|
536
536
|
<g>
|
|
537
|
-
<circle data-type="point" data-label="" data-x="-5.750000000000001" data-y="-10
|
|
537
|
+
<circle data-type="point" data-label="" data-x="-5.750000000000001" data-y="-10" cx="245.73764348961578" cy="274.4185229604899" r="3" fill="hsl(80, 100%, 50%, 0.9)" />
|
|
538
538
|
</g>
|
|
539
539
|
<g>
|
|
540
540
|
<circle data-type="point" data-label="" data-x="-4" data-y="-11.775" cx="277.0530950301392" cy="306.1813380944494" r="3" fill="hsl(80, 100%, 50%, 0.9)" />
|
|
@@ -849,7 +849,7 @@ x+" data-x="-8.4" data-y="-17" cx="198.31710258539454" cy="399.68032912258366" r
|
|
|
849
849
|
<polyline data-points="-4.449999999999999,-10 -4,-10 -4,-10.45" data-type="line" data-label="" points="269.00055034829035,274.4185229604899 277.0530950301392,274.4185229604899 277.0530950301392,282.47106764233877" fill="none" stroke="purple" stroke-width="1" />
|
|
850
850
|
</g>
|
|
851
851
|
<g>
|
|
852
|
-
<polyline data-points="-5.550000000000001,-10 -5.750000000000001,-10.1 -7.075,-10.1 -7.075,-5 -8.4,-5" data-type="line" data-label="" points="249.31655223710416,274.4185229604899 245.73764348961578,276.2079773342341 222.02737303750516,276.2079773342341 222.02737303750516,184.94580427328003 198.31710258539454,184.94580427328003" fill="none" stroke="purple" stroke-width="1" />
|
|
852
|
+
<polyline data-points="-5.550000000000001,-10 -5.750000000000001,-10 -5.750000000000001,-10.1 -7.075,-10.1 -7.075,-5 -8.4,-5" data-type="line" data-label="" points="249.31655223710416,274.4185229604899 245.73764348961578,274.4185229604899 245.73764348961578,276.2079773342341 222.02737303750516,276.2079773342341 222.02737303750516,184.94580427328003 198.31710258539454,184.94580427328003" fill="none" stroke="purple" stroke-width="1" />
|
|
853
853
|
</g>
|
|
854
854
|
<g>
|
|
855
855
|
<polyline data-points="-4,-11.55 -4,-12 -3,-12 -3,-12.45" data-type="line" data-label="" points="277.0530950301392,302.1550657535249 277.0530950301392,310.2076104353738 294.9476387675812,310.2076104353738 294.9476387675812,318.2601551172227" fill="none" stroke="purple" stroke-width="1" />
|
|
@@ -876,7 +876,7 @@ x+" data-x="-8.4" data-y="-17" cx="198.31710258539454" cy="399.68032912258366" r
|
|
|
876
876
|
<polyline data-points="-3,-16.45 -3,-16 -4,-16 -4,-15.55" data-type="line" data-label="" points="294.9476387675812,389.8383300669906 294.9476387675812,381.7857853851417 277.0530950301392,381.7857853851417 277.0530950301392,373.73324070329284" fill="none" stroke="purple" stroke-width="1" />
|
|
877
877
|
</g>
|
|
878
878
|
<g>
|
|
879
|
-
<polyline data-points="-5.550000000000001,-16 -6.875000000000001,-16 -6.875000000000001,-9.9 -8.200000000000001,-9.9 -8.4,-10" data-type="line" data-label="" points="249.31655223710416,381.7857853851417 225.60628178499354,381.7857853851417 225.60628178499354,272.6290685867457 201.89601133288292,272.6290685867457 198.31710258539454,274.4185229604899" fill="none" stroke="purple" stroke-width="1" />
|
|
879
|
+
<polyline data-points="-5.550000000000001,-16 -6.875000000000001,-16 -6.875000000000001,-9.9 -8.200000000000001,-9.9 -8.200000000000001,-10 -8.4,-10" data-type="line" data-label="" points="249.31655223710416,381.7857853851417 225.60628178499354,381.7857853851417 225.60628178499354,272.6290685867457 201.89601133288292,272.6290685867457 201.89601133288292,274.4185229604899 198.31710258539454,274.4185229604899" fill="none" stroke="purple" stroke-width="1" />
|
|
880
880
|
</g>
|
|
881
881
|
<g>
|
|
882
882
|
<polyline data-points="-4,-18.45 -4,-18 -3,-18 -3,-17.55" data-type="line" data-label="" points="277.0530950301392,425.6274175418746 277.0530950301392,417.5748728600257 294.9476387675812,417.5748728600257 294.9476387675812,409.52232817817685" fill="none" stroke="purple" stroke-width="1" />
|
|
@@ -1056,7 +1056,7 @@ x+" data-x="-8.4" data-y="-17" cx="198.31710258539454" cy="399.68032912258366" r
|
|
|
1056
1056
|
<rect data-type="rect" data-label="" data-x="3.3739999999999997" data-y="0.7000000000000015" x="404.9811882091119" y="81.15745059611653" width="8.052544681848872" height="3.5789087474883985" fill="hsl(80, 100%, 50%, 0.35)" stroke="black" stroke-width="0.05588295598214286" />
|
|
1057
1057
|
</g>
|
|
1058
1058
|
<g>
|
|
1059
|
-
<rect data-type="rect" data-label="" data-x="-5.750000000000001" data-y="-9.
|
|
1059
|
+
<rect data-type="rect" data-label="" data-x="-5.750000000000001" data-y="-9.775" x="243.94818911587157" y="266.365978278641" width="3.5789087474883843" height="8.052544681848872" fill="hsl(80, 100%, 50%, 0.35)" stroke="black" stroke-width="0.05588295598214286" />
|
|
1060
1060
|
</g>
|
|
1061
1061
|
<g>
|
|
1062
1062
|
<rect data-type="rect" data-label="" data-x="-3.775" data-y="-11.775" x="277.0530950301392" y="304.3918837207052" width="8.052544681848929" height="3.5789087474884127" fill="hsl(80, 100%, 50%, 0.35)" stroke="black" stroke-width="0.05588295598214286" />
|