circuit-to-svg 0.0.70 → 0.0.72
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.js +90 -41
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1283,7 +1283,7 @@ import { su } from "@tscircuit/soup-util";
|
|
|
1283
1283
|
import { symbols } from "schematic-symbols";
|
|
1284
1284
|
import "svgson";
|
|
1285
1285
|
import {
|
|
1286
|
-
applyToPoint as
|
|
1286
|
+
applyToPoint as applyToPoint17,
|
|
1287
1287
|
compose as compose5
|
|
1288
1288
|
} from "transformation-matrix";
|
|
1289
1289
|
|
|
@@ -1369,12 +1369,45 @@ function pointPairsToMatrix(a1, a2, b1, b2) {
|
|
|
1369
1369
|
// lib/utils/get-sch-font-size.ts
|
|
1370
1370
|
import "transformation-matrix";
|
|
1371
1371
|
var getSchMmFontSize = (textType) => {
|
|
1372
|
-
return textType === "pin_number" ? 0.15 : 0.18;
|
|
1372
|
+
return textType === "error" ? 0.05 : textType === "pin_number" ? 0.15 : 0.18;
|
|
1373
1373
|
};
|
|
1374
1374
|
var getSchScreenFontSize = (transform, textType) => {
|
|
1375
1375
|
return Math.abs(transform.a) * getSchMmFontSize(textType);
|
|
1376
1376
|
};
|
|
1377
1377
|
|
|
1378
|
+
// lib/sch/svg-object-fns/create-svg-error-text.ts
|
|
1379
|
+
import { applyToPoint as applyToPoint16 } from "transformation-matrix";
|
|
1380
|
+
var createSvgSchErrorText = ({
|
|
1381
|
+
text,
|
|
1382
|
+
realCenter,
|
|
1383
|
+
realToScreenTransform
|
|
1384
|
+
}) => {
|
|
1385
|
+
const screenCenter = applyToPoint16(realToScreenTransform, realCenter);
|
|
1386
|
+
return {
|
|
1387
|
+
type: "element",
|
|
1388
|
+
name: "text",
|
|
1389
|
+
value: "",
|
|
1390
|
+
attributes: {
|
|
1391
|
+
x: screenCenter.x.toString(),
|
|
1392
|
+
y: screenCenter.y.toString(),
|
|
1393
|
+
fill: "red",
|
|
1394
|
+
"text-anchor": "middle",
|
|
1395
|
+
"dominant-baseline": "middle",
|
|
1396
|
+
"font-family": "sans-serif",
|
|
1397
|
+
"font-size": `${getSchScreenFontSize(realToScreenTransform, "error")}px`
|
|
1398
|
+
},
|
|
1399
|
+
children: [
|
|
1400
|
+
{
|
|
1401
|
+
type: "text",
|
|
1402
|
+
value: text,
|
|
1403
|
+
name: "",
|
|
1404
|
+
attributes: {},
|
|
1405
|
+
children: []
|
|
1406
|
+
}
|
|
1407
|
+
]
|
|
1408
|
+
};
|
|
1409
|
+
};
|
|
1410
|
+
|
|
1378
1411
|
// lib/sch/svg-object-fns/create-svg-objects-from-sch-component-with-symbol.ts
|
|
1379
1412
|
var ninePointAnchorToTextAnchor = {
|
|
1380
1413
|
top_left: "start",
|
|
@@ -1405,7 +1438,15 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1405
1438
|
}) => {
|
|
1406
1439
|
const svgObjects = [];
|
|
1407
1440
|
const symbol = symbols[schComponent.symbol_name];
|
|
1408
|
-
if (!symbol)
|
|
1441
|
+
if (!symbol) {
|
|
1442
|
+
return [
|
|
1443
|
+
createSvgSchErrorText({
|
|
1444
|
+
text: `Symbol not found: ${schComponent.symbol_name}`,
|
|
1445
|
+
realCenter: schComponent.center,
|
|
1446
|
+
realToScreenTransform
|
|
1447
|
+
})
|
|
1448
|
+
];
|
|
1449
|
+
}
|
|
1409
1450
|
const schPorts = su(circuitJson).schematic_port.list({
|
|
1410
1451
|
schematic_component_id: schComponent.schematic_component_id
|
|
1411
1452
|
});
|
|
@@ -1417,7 +1458,15 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1417
1458
|
symbol,
|
|
1418
1459
|
schComponent
|
|
1419
1460
|
});
|
|
1420
|
-
if (!schPortsWithSymbolPorts[0])
|
|
1461
|
+
if (!schPortsWithSymbolPorts[0]) {
|
|
1462
|
+
return [
|
|
1463
|
+
createSvgSchErrorText({
|
|
1464
|
+
text: `Could not match ports for symbol ${schComponent.symbol_name}`,
|
|
1465
|
+
realCenter: schComponent.center,
|
|
1466
|
+
realToScreenTransform
|
|
1467
|
+
})
|
|
1468
|
+
];
|
|
1469
|
+
}
|
|
1421
1470
|
const transformFromSymbolToReal = pointPairsToMatrix(
|
|
1422
1471
|
schPortsWithSymbolPorts[1]?.symbolPort ?? symbol.center,
|
|
1423
1472
|
schPortsWithSymbolPorts[1]?.schPort.center ?? schComponent.center,
|
|
@@ -1435,7 +1484,7 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1435
1484
|
name: "path",
|
|
1436
1485
|
attributes: {
|
|
1437
1486
|
d: points.map((p, i) => {
|
|
1438
|
-
const [x, y] =
|
|
1487
|
+
const [x, y] = applyToPoint17(
|
|
1439
1488
|
compose5(realToScreenTransform, transformFromSymbolToReal),
|
|
1440
1489
|
[p.x, p.y]
|
|
1441
1490
|
);
|
|
@@ -1450,7 +1499,7 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1450
1499
|
});
|
|
1451
1500
|
}
|
|
1452
1501
|
for (const text of texts) {
|
|
1453
|
-
const screenTextPos =
|
|
1502
|
+
const screenTextPos = applyToPoint17(
|
|
1454
1503
|
compose5(realToScreenTransform, transformFromSymbolToReal),
|
|
1455
1504
|
text
|
|
1456
1505
|
);
|
|
@@ -1484,7 +1533,7 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1484
1533
|
});
|
|
1485
1534
|
}
|
|
1486
1535
|
for (const box of boxes) {
|
|
1487
|
-
const screenBoxPos =
|
|
1536
|
+
const screenBoxPos = applyToPoint17(
|
|
1488
1537
|
compose5(realToScreenTransform, transformFromSymbolToReal),
|
|
1489
1538
|
box
|
|
1490
1539
|
);
|
|
@@ -1507,7 +1556,7 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1507
1556
|
});
|
|
1508
1557
|
}
|
|
1509
1558
|
for (const port of symbol.ports) {
|
|
1510
|
-
const screenPortPos =
|
|
1559
|
+
const screenPortPos = applyToPoint17(
|
|
1511
1560
|
compose5(realToScreenTransform, transformFromSymbolToReal),
|
|
1512
1561
|
port
|
|
1513
1562
|
);
|
|
@@ -1532,14 +1581,14 @@ var createSvgObjectsFromSchematicComponentWithSymbol = ({
|
|
|
1532
1581
|
import { su as su4 } from "@tscircuit/soup-util";
|
|
1533
1582
|
import "schematic-symbols";
|
|
1534
1583
|
import "svgson";
|
|
1535
|
-
import { applyToPoint as
|
|
1584
|
+
import { applyToPoint as applyToPoint22 } from "transformation-matrix";
|
|
1536
1585
|
|
|
1537
1586
|
// lib/sch/svg-object-fns/create-svg-objects-from-sch-port-on-box.ts
|
|
1538
1587
|
import "transformation-matrix";
|
|
1539
1588
|
import "@tscircuit/soup-util";
|
|
1540
1589
|
|
|
1541
1590
|
// lib/sch/svg-object-fns/create-svg-objects-for-sch-port-box-line.ts
|
|
1542
|
-
import { applyToPoint as
|
|
1591
|
+
import { applyToPoint as applyToPoint18 } from "transformation-matrix";
|
|
1543
1592
|
import { su as su2 } from "@tscircuit/soup-util";
|
|
1544
1593
|
var PIN_CIRCLE_RADIUS_MM = 0.02;
|
|
1545
1594
|
var createSvgObjectsForSchPortBoxLine = ({
|
|
@@ -1569,8 +1618,8 @@ var createSvgObjectsForSchPortBoxLine = ({
|
|
|
1569
1618
|
realEdgePos.y += realPinLineLength;
|
|
1570
1619
|
break;
|
|
1571
1620
|
}
|
|
1572
|
-
const screenSchPortPos =
|
|
1573
|
-
const screenRealEdgePos =
|
|
1621
|
+
const screenSchPortPos = applyToPoint18(transform, schPort.center);
|
|
1622
|
+
const screenRealEdgePos = applyToPoint18(transform, realEdgePos);
|
|
1574
1623
|
const realLineEnd = { ...schPort.center };
|
|
1575
1624
|
switch (schPort.side_of_component) {
|
|
1576
1625
|
case "left":
|
|
@@ -1586,7 +1635,7 @@ var createSvgObjectsForSchPortBoxLine = ({
|
|
|
1586
1635
|
realLineEnd.y += PIN_CIRCLE_RADIUS_MM;
|
|
1587
1636
|
break;
|
|
1588
1637
|
}
|
|
1589
|
-
const screenLineEnd =
|
|
1638
|
+
const screenLineEnd = applyToPoint18(transform, realLineEnd);
|
|
1590
1639
|
svgObjects.push({
|
|
1591
1640
|
name: "line",
|
|
1592
1641
|
type: "element",
|
|
@@ -1633,7 +1682,7 @@ var getUnitVectorFromOutsideToEdge = (side) => {
|
|
|
1633
1682
|
};
|
|
1634
1683
|
|
|
1635
1684
|
// lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-number-text.ts
|
|
1636
|
-
import { applyToPoint as
|
|
1685
|
+
import { applyToPoint as applyToPoint19 } from "transformation-matrix";
|
|
1637
1686
|
var createSvgObjectsForSchPortPinNumberText = (params) => {
|
|
1638
1687
|
const svgObjects = [];
|
|
1639
1688
|
const { schPort, schComponent, transform, circuitJson } = params;
|
|
@@ -1646,7 +1695,7 @@ var createSvgObjectsForSchPortPinNumberText = (params) => {
|
|
|
1646
1695
|
const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4;
|
|
1647
1696
|
realPinNumberPos.x += vecToEdge.x * realPinEdgeDistance / 2;
|
|
1648
1697
|
realPinNumberPos.y += vecToEdge.y * realPinEdgeDistance / 2;
|
|
1649
|
-
const screenPinNumberTextPos =
|
|
1698
|
+
const screenPinNumberTextPos = applyToPoint19(transform, realPinNumberPos);
|
|
1650
1699
|
if (schPort.side_of_component === "top" || schPort.side_of_component === "bottom") {
|
|
1651
1700
|
screenPinNumberTextPos.x -= 2;
|
|
1652
1701
|
} else {
|
|
@@ -1681,7 +1730,7 @@ var createSvgObjectsForSchPortPinNumberText = (params) => {
|
|
|
1681
1730
|
};
|
|
1682
1731
|
|
|
1683
1732
|
// lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-label.ts
|
|
1684
|
-
import { applyToPoint as
|
|
1733
|
+
import { applyToPoint as applyToPoint20 } from "transformation-matrix";
|
|
1685
1734
|
var LABEL_DIST_FROM_EDGE_MM = 0.1;
|
|
1686
1735
|
var createSvgObjectsForSchPortPinLabel = (params) => {
|
|
1687
1736
|
const svgObjects = [];
|
|
@@ -1695,7 +1744,7 @@ var createSvgObjectsForSchPortPinLabel = (params) => {
|
|
|
1695
1744
|
const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4;
|
|
1696
1745
|
realPinNumberPos.x += vecToEdge.x * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM);
|
|
1697
1746
|
realPinNumberPos.y += vecToEdge.y * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM);
|
|
1698
|
-
const screenPinNumberTextPos =
|
|
1747
|
+
const screenPinNumberTextPos = applyToPoint20(transform, realPinNumberPos);
|
|
1699
1748
|
const label = schPort.display_pin_label ?? schComponent.port_labels?.[`pin${schPort.pin_number}`];
|
|
1700
1749
|
if (!label) return [];
|
|
1701
1750
|
svgObjects.push({
|
|
@@ -1746,11 +1795,11 @@ var createSvgObjectsFromSchematicComponentWithBox = ({
|
|
|
1746
1795
|
schComponent.source_component_id
|
|
1747
1796
|
);
|
|
1748
1797
|
const svgObjects = [];
|
|
1749
|
-
const componentScreenTopLeft =
|
|
1798
|
+
const componentScreenTopLeft = applyToPoint22(transform, {
|
|
1750
1799
|
x: schComponent.center.x - schComponent.size.width / 2,
|
|
1751
1800
|
y: schComponent.center.y + schComponent.size.height / 2
|
|
1752
1801
|
});
|
|
1753
|
-
const componentScreenBottomRight =
|
|
1802
|
+
const componentScreenBottomRight = applyToPoint22(transform, {
|
|
1754
1803
|
x: schComponent.center.x + schComponent.size.width / 2,
|
|
1755
1804
|
y: schComponent.center.y - schComponent.size.height / 2
|
|
1756
1805
|
});
|
|
@@ -1770,7 +1819,7 @@ var createSvgObjectsFromSchematicComponentWithBox = ({
|
|
|
1770
1819
|
},
|
|
1771
1820
|
children: []
|
|
1772
1821
|
});
|
|
1773
|
-
const screenManufacturerNumberPos =
|
|
1822
|
+
const screenManufacturerNumberPos = applyToPoint22(transform, {
|
|
1774
1823
|
x: schComponent.center.x + schComponent.size.width / 2,
|
|
1775
1824
|
y: schComponent.center.y + schComponent.size.height / 2 + 0.5
|
|
1776
1825
|
// Above the component top edge
|
|
@@ -1854,14 +1903,14 @@ function createSvgObjectsFromSchematicComponent(params) {
|
|
|
1854
1903
|
}
|
|
1855
1904
|
|
|
1856
1905
|
// lib/sch/svg-object-fns/create-svg-objects-from-sch-debug-object.ts
|
|
1857
|
-
import { applyToPoint as
|
|
1906
|
+
import { applyToPoint as applyToPoint23 } from "transformation-matrix";
|
|
1858
1907
|
function createSvgObjectsFromSchDebugObject(debugObject, transform) {
|
|
1859
1908
|
if (debugObject.shape === "rect") {
|
|
1860
|
-
let [screenLeft, screenTop] =
|
|
1909
|
+
let [screenLeft, screenTop] = applyToPoint23(transform, [
|
|
1861
1910
|
debugObject.center.x - debugObject.size.width / 2,
|
|
1862
1911
|
debugObject.center.y - debugObject.size.height / 2
|
|
1863
1912
|
]);
|
|
1864
|
-
let [screenRight, screenBottom] =
|
|
1913
|
+
let [screenRight, screenBottom] = applyToPoint23(transform, [
|
|
1865
1914
|
debugObject.center.x + debugObject.size.width / 2,
|
|
1866
1915
|
debugObject.center.y + debugObject.size.height / 2
|
|
1867
1916
|
]);
|
|
@@ -1871,7 +1920,7 @@ function createSvgObjectsFromSchDebugObject(debugObject, transform) {
|
|
|
1871
1920
|
];
|
|
1872
1921
|
const width = Math.abs(screenRight - screenLeft);
|
|
1873
1922
|
const height = Math.abs(screenBottom - screenTop);
|
|
1874
|
-
const [screenCenterX, screenCenterY] =
|
|
1923
|
+
const [screenCenterX, screenCenterY] = applyToPoint23(transform, [
|
|
1875
1924
|
debugObject.center.x,
|
|
1876
1925
|
debugObject.center.y
|
|
1877
1926
|
]);
|
|
@@ -1917,11 +1966,11 @@ function createSvgObjectsFromSchDebugObject(debugObject, transform) {
|
|
|
1917
1966
|
];
|
|
1918
1967
|
}
|
|
1919
1968
|
if (debugObject.shape === "line") {
|
|
1920
|
-
const [screenStartX, screenStartY] =
|
|
1969
|
+
const [screenStartX, screenStartY] = applyToPoint23(transform, [
|
|
1921
1970
|
debugObject.start.x,
|
|
1922
1971
|
debugObject.start.y
|
|
1923
1972
|
]);
|
|
1924
|
-
const [screenEndX, screenEndY] =
|
|
1973
|
+
const [screenEndX, screenEndY] = applyToPoint23(transform, [
|
|
1925
1974
|
debugObject.end.x,
|
|
1926
1975
|
debugObject.end.y
|
|
1927
1976
|
]);
|
|
@@ -1971,7 +2020,7 @@ function createSvgObjectsFromSchDebugObject(debugObject, transform) {
|
|
|
1971
2020
|
}
|
|
1972
2021
|
|
|
1973
2022
|
// lib/sch/svg-object-fns/create-svg-objects-from-sch-trace.ts
|
|
1974
|
-
import { applyToPoint as
|
|
2023
|
+
import { applyToPoint as applyToPoint24 } from "transformation-matrix";
|
|
1975
2024
|
function createSchematicTrace(trace, transform) {
|
|
1976
2025
|
const edges = trace.edges;
|
|
1977
2026
|
if (edges.length === 0) return [];
|
|
@@ -1980,11 +2029,11 @@ function createSchematicTrace(trace, transform) {
|
|
|
1980
2029
|
for (let edgeIndex = 0; edgeIndex < edges.length; edgeIndex++) {
|
|
1981
2030
|
const edge = edges[edgeIndex];
|
|
1982
2031
|
if (edge.is_crossing) continue;
|
|
1983
|
-
const [screenFromX, screenFromY] =
|
|
2032
|
+
const [screenFromX, screenFromY] = applyToPoint24(transform, [
|
|
1984
2033
|
edge.from.x,
|
|
1985
2034
|
edge.from.y
|
|
1986
2035
|
]);
|
|
1987
|
-
const [screenToX, screenToY] =
|
|
2036
|
+
const [screenToX, screenToY] = applyToPoint24(transform, [
|
|
1988
2037
|
edge.to.x,
|
|
1989
2038
|
edge.to.y
|
|
1990
2039
|
]);
|
|
@@ -1996,11 +2045,11 @@ function createSchematicTrace(trace, transform) {
|
|
|
1996
2045
|
}
|
|
1997
2046
|
for (const edge of edges) {
|
|
1998
2047
|
if (!edge.is_crossing) continue;
|
|
1999
|
-
const [screenFromX, screenFromY] =
|
|
2048
|
+
const [screenFromX, screenFromY] = applyToPoint24(transform, [
|
|
2000
2049
|
edge.from.x,
|
|
2001
2050
|
edge.from.y
|
|
2002
2051
|
]);
|
|
2003
|
-
const [screenToX, screenToY] =
|
|
2052
|
+
const [screenToX, screenToY] = applyToPoint24(transform, [
|
|
2004
2053
|
edge.to.x,
|
|
2005
2054
|
edge.to.y
|
|
2006
2055
|
]);
|
|
@@ -2059,7 +2108,7 @@ function createSchematicTrace(trace, transform) {
|
|
|
2059
2108
|
}
|
|
2060
2109
|
if (trace.junctions) {
|
|
2061
2110
|
for (const junction of trace.junctions) {
|
|
2062
|
-
const [screenX, screenY] =
|
|
2111
|
+
const [screenX, screenY] = applyToPoint24(transform, [
|
|
2063
2112
|
junction.x,
|
|
2064
2113
|
junction.y
|
|
2065
2114
|
]);
|
|
@@ -2082,7 +2131,7 @@ function createSchematicTrace(trace, transform) {
|
|
|
2082
2131
|
|
|
2083
2132
|
// lib/sch/svg-object-fns/create-svg-objects-for-sch-net-label.ts
|
|
2084
2133
|
import {
|
|
2085
|
-
applyToPoint as
|
|
2134
|
+
applyToPoint as applyToPoint25,
|
|
2086
2135
|
compose as compose6,
|
|
2087
2136
|
rotate as rotate3,
|
|
2088
2137
|
scale as scale3,
|
|
@@ -2878,14 +2927,14 @@ var createSvgObjectsForSchNetLabel = (schNetLabel, realToScreenTransform) => {
|
|
|
2878
2927
|
const fontSizePx = getSchScreenFontSize(realToScreenTransform, "net_label");
|
|
2879
2928
|
const fontSizeMm = getSchMmFontSize("net_label");
|
|
2880
2929
|
const textWidthFSR = estimateTextWidth(schNetLabel.text || "");
|
|
2881
|
-
const screenCenter =
|
|
2930
|
+
const screenCenter = applyToPoint25(realToScreenTransform, schNetLabel.center);
|
|
2882
2931
|
const realTextGrowthVec = getUnitVectorFromOutsideToEdge(
|
|
2883
2932
|
schNetLabel.anchor_side
|
|
2884
2933
|
);
|
|
2885
2934
|
const screenTextGrowthVec = { ...realTextGrowthVec };
|
|
2886
2935
|
screenTextGrowthVec.y *= -1;
|
|
2887
2936
|
const fullWidthFsr = textWidthFSR + ARROW_POINT_WIDTH_FSR * 2 + END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length + END_PADDING_FSR;
|
|
2888
|
-
const screenAnchorPosition = schNetLabel.anchor_position ?
|
|
2937
|
+
const screenAnchorPosition = schNetLabel.anchor_position ? applyToPoint25(realToScreenTransform, schNetLabel.anchor_position) : {
|
|
2889
2938
|
x: screenCenter.x - screenTextGrowthVec.x * fullWidthFsr * fontSizePx / 2,
|
|
2890
2939
|
y: screenCenter.y - screenTextGrowthVec.y * fullWidthFsr * fontSizePx / 2
|
|
2891
2940
|
};
|
|
@@ -2895,8 +2944,8 @@ var createSvgObjectsForSchNetLabel = (schNetLabel, realToScreenTransform) => {
|
|
|
2895
2944
|
};
|
|
2896
2945
|
const pathRotation = {
|
|
2897
2946
|
left: 0,
|
|
2898
|
-
top:
|
|
2899
|
-
bottom: 90,
|
|
2947
|
+
top: 90,
|
|
2948
|
+
bottom: -90,
|
|
2900
2949
|
right: 180
|
|
2901
2950
|
}[schNetLabel.anchor_side];
|
|
2902
2951
|
const screenOutlinePoints = [
|
|
@@ -2926,7 +2975,7 @@ var createSvgObjectsForSchNetLabel = (schNetLabel, realToScreenTransform) => {
|
|
|
2926
2975
|
y: -0.6
|
|
2927
2976
|
}
|
|
2928
2977
|
].map(
|
|
2929
|
-
(fontRelativePoint) =>
|
|
2978
|
+
(fontRelativePoint) => applyToPoint25(
|
|
2930
2979
|
compose6(
|
|
2931
2980
|
realToScreenTransform,
|
|
2932
2981
|
translate6(realAnchorPosition.x, realAnchorPosition.y),
|
|
@@ -2959,7 +3008,7 @@ var createSvgObjectsForSchNetLabel = (schNetLabel, realToScreenTransform) => {
|
|
|
2959
3008
|
});
|
|
2960
3009
|
const screenTextPos = {
|
|
2961
3010
|
x: screenAnchorPosition.x + screenTextGrowthVec.x * fontSizePx * 0.5,
|
|
2962
|
-
y: screenAnchorPosition.y
|
|
3011
|
+
y: screenAnchorPosition.y - screenTextGrowthVec.y * fontSizePx * 0.5
|
|
2963
3012
|
};
|
|
2964
3013
|
const textAnchor = {
|
|
2965
3014
|
left: "start",
|
|
@@ -2970,8 +3019,8 @@ var createSvgObjectsForSchNetLabel = (schNetLabel, realToScreenTransform) => {
|
|
|
2970
3019
|
const textTransformString = {
|
|
2971
3020
|
left: "",
|
|
2972
3021
|
right: "",
|
|
2973
|
-
top: `rotate(90 ${screenTextPos.x} ${screenTextPos.y})`,
|
|
2974
|
-
bottom: `rotate(
|
|
3022
|
+
top: `rotate(-90 ${screenTextPos.x} ${screenTextPos.y})`,
|
|
3023
|
+
bottom: `rotate(90 ${screenTextPos.x} ${screenTextPos.y})`
|
|
2975
3024
|
}[schNetLabel.anchor_side];
|
|
2976
3025
|
svgObjects.push({
|
|
2977
3026
|
name: "text",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/pcb/convert-circuit-json-to-pcb-svg.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-trace-error.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-plated-hole.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-text.ts","../lib/utils/pairs.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-trace.ts","../lib/pcb/layer-name-to-color.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-smt-pads.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-board.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-via.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-hole.ts","../lib/pcb/colors.ts","../lib/utils/colors.ts","../lib/sch/convert-circuit-json-to-schematic-svg.ts","../lib/sch/draw-schematic-grid.ts","../lib/sch/draw-schematic-labeled-points.ts","../lib/sch/get-schematic-bounds-from-circuit-json.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component-with-symbol.ts","../lib/utils/get-sch-stroke-size.ts","../lib/utils/match-sch-ports-with-symbol-ports.ts","../lib/utils/point-pairs-to-matrix.ts","../lib/utils/get-sch-font-size.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component-with-box.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-port-on-box.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-box-line.ts","../lib/utils/get-unit-vector-from-outside-to-edge.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-number-text.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-label.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-debug-object.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-trace.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-net-label.ts","../lib/sch/arial-text-metrics.ts","../lib/sch/estimate-text-width.ts"],"sourcesContent":["import type { Point, AnyCircuitElement } from \"circuit-json\"\nimport { type INode as SvgObject, stringify } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n scale,\n translate,\n} from \"transformation-matrix\"\nimport { createSvgObjectsFromPcbTraceError } from \"./svg-object-fns/create-svg-objects-from-pcb-trace-error\"\nimport { createSvgObjectsFromPcbFabricationNotePath } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path\"\nimport { createSvgObjectsFromPcbFabricationNoteText } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text\"\nimport { createSvgObjectsFromPcbPlatedHole } from \"./svg-object-fns/create-svg-objects-from-pcb-plated-hole\"\nimport { createSvgObjectsFromPcbSilkscreenPath } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-path\"\nimport { createSvgObjectsFromPcbSilkscreenText } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-text\"\nimport { createSvgObjectsFromPcbTrace } from \"./svg-object-fns/create-svg-objects-from-pcb-trace\"\nimport { createSvgObjectsFromSmtPad } from \"./svg-object-fns/create-svg-objects-from-smt-pads\"\nimport { createSvgObjectsFromPcbBoard } from \"./svg-object-fns/create-svg-objects-from-pcb-board\"\nimport { createSvgObjectsFromPcbVia } from \"./svg-object-fns/create-svg-objects-from-pcb-via\"\nimport { createSvgObjectsFromPcbHole } from \"./svg-object-fns/create-svg-objects-from-pcb-hole\"\n\nconst OBJECT_ORDER: AnyCircuitElement[\"type\"][] = [\n \"pcb_trace_error\",\n \"pcb_plated_hole\",\n \"pcb_fabrication_note_text\",\n \"pcb_fabrication_note_path\",\n \"pcb_silkscreen_text\",\n \"pcb_silkscreen_path\",\n \"pcb_via\",\n \"pcb_trace\",\n \"pcb_smtpad\",\n \"pcb_component\",\n \"pcb_board\",\n]\n\ninterface PointObjectNotation {\n x: number\n y: number\n}\n\ninterface Options {\n width?: number\n height?: number\n shouldDrawErrors?: boolean\n}\n\nexport function convertCircuitJsonToPcbSvg(\n soup: AnyCircuitElement[],\n options?: Options,\n): string {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n // Process all elements to determine bounds\n for (const item of soup) {\n if (item.type === \"pcb_board\") {\n if (\n item.outline &&\n Array.isArray(item.outline) &&\n item.outline.length >= 3\n )\n updateBoundsToIncludeOutline(item.outline)\n else if (\"center\" in item && \"width\" in item && \"height\" in item)\n updateBounds(item.center, item.width, item.height)\n } else if (\"x\" in item && \"y\" in item) {\n updateBounds({ x: item.x, y: item.y }, 0, 0)\n } else if (\"route\" in item) {\n updateTraceBounds(item.route)\n }\n }\n\n const padding = 1 // Reduced padding for tighter boundary\n const circuitWidth = maxX - minX + 2 * padding\n const circuitHeight = maxY - minY + 2 * padding\n\n const svgWidth = options?.width ?? 800\n const svgHeight = options?.height ?? 600\n const paths: PointObjectNotation[][] = []\n for (const item of soup) {\n if (\"route\" in item && item.route !== undefined) {\n paths.push(item.route as PointObjectNotation[])\n }\n }\n\n // Calculate scale factor to fit the circuit within the SVG, maintaining aspect ratio\n const scaleX = svgWidth / circuitWidth\n const scaleY = svgHeight / circuitHeight\n const scaleFactor = Math.min(scaleX, scaleY)\n\n // Calculate centering offsets\n const offsetX = (svgWidth - circuitWidth * scaleFactor) / 2\n const offsetY = (svgHeight - circuitHeight * scaleFactor) / 2\n\n const transform = compose(\n translate(\n offsetX - minX * scaleFactor + padding * scaleFactor,\n svgHeight - offsetY + minY * scaleFactor - padding * scaleFactor,\n ),\n scale(scaleFactor, -scaleFactor), // Flip in y-direction\n )\n\n const svgObjects = soup\n .sort(\n (a, b) =>\n (OBJECT_ORDER.indexOf(b.type) ?? 9999) -\n (OBJECT_ORDER.indexOf(a.type) ?? 9999),\n )\n .flatMap((item) =>\n createSvgObjects(item, transform, soup, options?.shouldDrawErrors),\n )\n\n let strokeWidth = String(0.05 * scaleFactor)\n\n for (const element of soup) {\n if (\"stroke_width\" in element) {\n strokeWidth = String(scaleFactor * element.stroke_width)\n break\n }\n }\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n value: \"\",\n children: [\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n value: `\n .boundary { fill: #000; }\n .pcb-board { fill: none; }\n .pcb-trace { fill: none; }\n .pcb-hole-outer { fill: rgb(200, 52, 52); }\n .pcb-hole-inner { fill: rgb(255, 38, 226); }\n .pcb-pad { }\n .pcb-boundary { fill: none; stroke: #fff; stroke-width: 0.3; }\n .pcb-silkscreen { fill: none; }\n .pcb-silkscreen-top { stroke: #f2eda1; }\n .pcb-silkscreen-bottom { stroke: #f2eda1; }\n .pcb-silkscreen-text { fill: #f2eda1; }\n `,\n },\n ],\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n },\n createSvgObjectFromPcbBoundary(transform, minX, minY, maxX, maxY),\n ...svgObjects,\n ].filter((child): child is SvgObject => child !== null),\n }\n\n try {\n return stringify(svgObject as SvgObject)\n } catch (error) {\n console.error(\"Error stringifying SVG object:\", error)\n throw error\n }\n\n function updateBounds(center: any, width: any, height: any) {\n const halfWidth = width / 2\n const halfHeight = height / 2\n minX = Math.min(minX, center.x - halfWidth)\n minY = Math.min(minY, center.y - halfHeight)\n maxX = Math.max(maxX, center.x + halfWidth)\n maxY = Math.max(maxY, center.y + halfHeight)\n }\n\n function updateBoundsToIncludeOutline(outline: Point[]) {\n for (const point of outline) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n\n function updateTraceBounds(route: any[]) {\n for (const point of route) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n}\n\nfunction createSvgObjects(\n elm: AnyCircuitElement,\n transform: Matrix,\n soup: AnyCircuitElement[],\n shouldDrawErrors?: boolean,\n): SvgObject[] {\n switch (elm.type) {\n case \"pcb_trace_error\":\n return createSvgObjectsFromPcbTraceError(\n elm,\n transform,\n soup,\n shouldDrawErrors,\n ).filter(Boolean)\n case \"pcb_component\":\n return [createSvgObjectsFromPcbComponent(elm, transform)].filter(Boolean)\n case \"pcb_trace\":\n return createSvgObjectsFromPcbTrace(elm, transform)\n case \"pcb_plated_hole\":\n return createSvgObjectsFromPcbPlatedHole(elm, transform).filter(Boolean)\n case \"pcb_hole\":\n return createSvgObjectsFromPcbHole(elm, transform)\n case \"pcb_smtpad\":\n return createSvgObjectsFromSmtPad(elm, transform)\n case \"pcb_silkscreen_text\":\n return createSvgObjectsFromPcbSilkscreenText(elm, transform)\n case \"pcb_fabrication_note_path\":\n return createSvgObjectsFromPcbFabricationNotePath(elm, transform)\n case \"pcb_fabrication_note_text\":\n return createSvgObjectsFromPcbFabricationNoteText(elm, transform)\n case \"pcb_silkscreen_path\":\n return createSvgObjectsFromPcbSilkscreenPath(elm, transform)\n case \"pcb_board\":\n return createSvgObjectsFromPcbBoard(elm, transform)\n case \"pcb_via\":\n return createSvgObjectsFromPcbVia(elm, transform)\n default:\n return []\n }\n}\n\nfunction createSvgObjectsFromPcbComponent(component: any, transform: any): any {\n const { center, width, height, rotation = 0 } = component\n const [x, y] = applyToPoint(transform, [center.x, center.y])\n const scaledWidth = width * Math.abs(transform.a)\n const scaledHeight = height * Math.abs(transform.d)\n const transformStr = `translate(${x}, ${y}) rotate(${-rotation}) scale(1, -1)`\n\n return {\n name: \"g\",\n type: \"element\",\n attributes: { transform: transformStr },\n children: [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component-outline\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n ],\n }\n}\n\nfunction createSvgObjectFromPcbBoundary(\n transform: any,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n): SvgObject {\n const [x1, y1] = applyToPoint(transform, [minX, minY])\n const [x2, y2] = applyToPoint(transform, [maxX, maxY])\n const width = Math.abs(x2 - x1)\n const height = Math.abs(y2 - y1)\n const x = Math.min(x1, x2)\n const y = Math.min(y1, y2)\n return {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-boundary\",\n x: x.toString(),\n y: y.toString(),\n width: width.toString(),\n height: height.toString(),\n },\n }\n}\n\n/**\n * @deprecated use `convertCircuitJsonToPcbSvg` instead\n */\nexport const circuitJsonToPcbSvg = convertCircuitJsonToPcbSvg\n","import type { PcbTraceError, PcbPort, AnyCircuitElement } from \"circuit-json\"\nimport type { SvgObject } from \"../../../lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbTraceError(\n pcbTraceError: PcbTraceError,\n transform: Matrix,\n circuitJson: AnyCircuitElement[],\n shouldDrawErrors?: boolean,\n): SvgObject[] {\n if (!shouldDrawErrors) return []\n const { pcb_port_ids } = pcbTraceError\n\n const port1 = circuitJson.find(\n (el): el is PcbPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[0],\n )\n const port2 = circuitJson.find(\n (el): el is PcbPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[1],\n )\n\n if (!port1 || !port2) return []\n\n const screenPort1 = applyToPoint(transform, {\n x: port1.x,\n y: port1.y,\n })\n const screenPort2 = applyToPoint(transform, {\n x: port2.x,\n y: port2.y,\n })\n\n const errorCenter = {\n x: (screenPort1.x + screenPort2.x) / 2,\n y: (screenPort1.y + screenPort2.y) / 2,\n }\n\n if (\n isNaN(screenPort1.x) ||\n isNaN(screenPort1.y) ||\n isNaN(screenPort2.x) ||\n isNaN(screenPort2.y) ||\n isNaN(errorCenter.x) ||\n isNaN(errorCenter.y)\n ) {\n return []\n }\n\n const svgObjects: SvgObject[] = [\n {\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: screenPort1.x.toString(),\n y1: screenPort1.y.toString(),\n x2: errorCenter.x.toString(),\n y2: errorCenter.y.toString(),\n stroke: \"red\",\n \"stroke-width\": \"1.5\",\n \"stroke-dasharray\": \"2,2\",\n },\n children: [],\n value: \"\",\n },\n {\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: errorCenter.x.toString(),\n y1: errorCenter.y.toString(),\n x2: screenPort2.x.toString(),\n y2: screenPort2.y.toString(),\n stroke: \"red\",\n \"stroke-width\": \"1.5\",\n \"stroke-dasharray\": \"2,2\",\n },\n children: [],\n value: \"\",\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n x: (errorCenter.x - 5).toString(),\n y: (errorCenter.y - 5).toString(),\n width: \"10\",\n height: \"10\",\n fill: \"red\",\n transform: `rotate(45 ${errorCenter.x} ${errorCenter.y})`,\n },\n children: [],\n value: \"\",\n },\n {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: errorCenter.x.toString(),\n y: (errorCenter.y - 15).toString(),\n fill: \"red\",\n \"font-family\": \"sans-serif\",\n \"font-size\": \"12\",\n \"text-anchor\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: pcbTraceError.message || \"Pcb Trace Error\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n },\n ]\n\n return svgObjects\n}\n","import type { PcbSilkscreenPath, PcbFabricationNotePath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbFabricationNotePath(\n fabNotePath: PcbFabricationNotePath,\n transform: Matrix,\n): SvgObject[] {\n if (!fabNotePath.route || !Array.isArray(fabNotePath.route)) return []\n\n // Close the path if the first and last points are the same\n const firstPoint = fabNotePath.route[0]\n const lastPoint = fabNotePath.route[fabNotePath.route.length - 1]\n const isClosed =\n firstPoint!.x === lastPoint!.x && firstPoint!.y === lastPoint!.y\n\n const path =\n fabNotePath.route\n .slice(0, isClosed ? -1 : undefined)\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \") + (isClosed ? \" Z\" : \"\")\n\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-fabrication-note-path\",\n stroke: fabNotePath.color || \"rgba(255,255,255,0.5)\",\n fill: \"none\",\n d: path,\n \"stroke-width\": (\n fabNotePath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": fabNotePath.pcb_component_id,\n \"data-pcb-fabrication-note-path-id\":\n fabNotePath.pcb_fabrication_note_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbFabricationNoteText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { toString as matrixToString } from \"transformation-matrix\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbFabricationNoteText(\n pcbFabNoteText: PcbFabricationNoteText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n anchor_alignment,\n text,\n font_size = 1,\n layer = \"top\",\n color,\n } = pcbFabNoteText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY), // TODO do anchor_alignment\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: \"pcb-fabrication-note-text\",\n fill: color || \"rgba(255,255,255,0.5)\",\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","import type { PCBPlatedHole } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbPlatedHole(\n hole: PCBPlatedHole,\n transform: any,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.shape === \"pill\") {\n const scaledOuterWidth = hole.outer_width * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_height * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_height * Math.abs(transform.a)\n\n const outerRadiusX = scaledOuterWidth / 2\n const outerRadiusY = scaledOuterHeight / 2\n const innerRadiusX = scaledHoleWidth / 2\n const innerRadiusY = scaledHoleHeight / 2\n const straightLength = scaledOuterHeight - scaledOuterWidth\n\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n // Outer pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n d:\n `M${x - outerRadiusX},${y - straightLength / 2} ` +\n `v${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 ${scaledOuterWidth},0 ` +\n `v-${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 -${scaledOuterWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n // Inner pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n d:\n `M${x - innerRadiusX},${y - (scaledHoleHeight - scaledHoleWidth) / 2} ` +\n `v${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 ${scaledHoleWidth},0 ` +\n `v-${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 -${scaledHoleWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n // Fallback to circular hole if not pill-shaped\n if (hole.shape === \"circle\") {\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n return []\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbSilkscreenPath(\n silkscreenPath: PcbSilkscreenPath,\n transform: Matrix,\n): SvgObject[] {\n if (!silkscreenPath.route || !Array.isArray(silkscreenPath.route)) return []\n\n let path = silkscreenPath.route\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n\n // Close the path if the first and last points match\n const firstPoint = silkscreenPath.route[0]\n const lastPoint = silkscreenPath.route[silkscreenPath.route.length - 1]\n if (\n firstPoint &&\n lastPoint &&\n firstPoint.x === lastPoint.x &&\n firstPoint.y === lastPoint.y\n ) {\n path += \" Z\"\n }\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: `pcb-silkscreen pcb-silkscreen-${silkscreenPath.layer}`,\n d: path,\n \"stroke-width\": (\n silkscreenPath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": silkscreenPath.pcb_component_id,\n \"data-pcb-silkscreen-path-id\": silkscreenPath.pcb_silkscreen_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n toString as matrixToString,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbSilkscreenText(\n pcbSilkscreenText: PcbSilkscreenText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n text,\n font_size = 1,\n layer = \"top\",\n } = pcbSilkscreenText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY),\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: `pcb-silkscreen-text pcb-silkscreen-${layer}`,\n \"data-pcb-silkscreen-text-id\": pcbSilkscreenText.pcb_component_id,\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","/**\n * Return pairs of adjacent elements in an array.\n */\nexport function pairs<T>(arr: Array<T>): Array<[T, T]> {\n const result: Array<[T, T]> = []\n for (let i = 0; i < arr.length - 1; i++) {\n result.push([arr[i]!, arr[i + 1]!])\n }\n return result\n}\n","import type { PCBTrace } from \"circuit-json\"\nimport { pairs } from \"lib/utils/pairs\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { LAYER_NAME_TO_COLOR } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromPcbTrace(\n trace: PCBTrace,\n transform: Matrix,\n): SvgObject[] {\n if (!trace.route || !Array.isArray(trace.route) || trace.route.length < 2)\n return []\n\n const segments = pairs(trace.route)\n const svgObjects: SvgObject[] = []\n\n for (const [start, end] of segments) {\n const startPoint = applyToPoint(transform, [start.x, start.y])\n const endPoint = applyToPoint(transform, [end.x, end.y])\n\n const layer =\n \"layer\" in start ? start.layer : \"layer\" in end ? end.layer : null\n if (!layer) continue\n\n const layerColor =\n LAYER_NAME_TO_COLOR[layer as keyof typeof LAYER_NAME_TO_COLOR] ?? \"white\"\n\n const traceWidth =\n \"width\" in start ? start.width : \"width\" in end ? end.width : null\n\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-trace\",\n stroke: layerColor,\n d: `M ${startPoint[0]} ${startPoint[1]} L ${endPoint[0]} ${endPoint[1]}`,\n \"stroke-width\": traceWidth\n ? (traceWidth * Math.abs(transform.a)).toString()\n : \"0.3\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"shape-rendering\": \"crispEdges\",\n },\n })\n }\n return svgObjects\n}\n","/**\n * TODO use @tscircuit/pcb-colors when it's published\n */\nexport const LAYER_NAME_TO_COLOR = {\n top: \"rgb(200, 52, 52)\",\n bottom: \"rgb(77, 127, 196)\",\n}\n\nexport function layerNameToColor(layerName: string) {\n return (\n LAYER_NAME_TO_COLOR[layerName as keyof typeof LAYER_NAME_TO_COLOR] ??\n \"white\"\n )\n}\n","import type { PCBSMTPad } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { layerNameToColor } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromSmtPad(\n pad: PCBSMTPad,\n transform: Matrix,\n): any {\n const [x, y] = applyToPoint(transform, [pad.x, pad.y])\n\n if (pad.shape === \"rect\") {\n const width = pad.width * Math.abs(transform.a)\n const height = pad.height * Math.abs(transform.d)\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-pad\",\n fill: layerNameToColor(pad.layer),\n x: (x - width / 2).toString(),\n y: (y - height / 2).toString(),\n width: width.toString(),\n height: height.toString(),\n },\n },\n ]\n }\n // TODO implement smtpad circles/ovals etc.\n return []\n}\n","import type { PCBBoard, Point } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbBoard(\n pcbBoard: PCBBoard,\n transform: Matrix,\n): SvgObject[] {\n const { width, height, center, outline } = pcbBoard\n\n let path: string\n if (outline && Array.isArray(outline) && outline.length >= 3) {\n path = outline\n .map((point: Point, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n } else {\n const halfWidth = width / 2\n const halfHeight = height / 2\n\n const topLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y - halfHeight,\n ])\n const topRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y - halfHeight,\n ])\n const bottomRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y + halfHeight,\n ])\n const bottomLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y + halfHeight,\n ])\n\n path =\n `M ${topLeft[0]} ${topLeft[1]} ` +\n `L ${topRight[0]} ${topRight[1]} ` +\n `L ${bottomRight[0]} ${bottomRight[1]} ` +\n `L ${bottomLeft[0]} ${bottomLeft[1]}`\n }\n\n path += \" Z\"\n\n return [\n {\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-board\",\n d: path,\n stroke: \"rgba(255, 255, 255, 0.5)\",\n \"stroke-width\": (0.1 * Math.abs(transform.a)).toString(),\n },\n },\n ]\n}\n","import type { PCBVia } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbVia(hole: PCBVia, transform: any): any {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n },\n ],\n }\n}\n","import type { PCBHole } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { HOLE_COLOR } from \"../colors\"\n\nexport function createSvgObjectsFromPcbHole(\n hole: PCBHole,\n transform: Matrix,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.hole_shape === \"circle\" || hole.hole_shape === \"square\") {\n const scaledDiameter = hole.hole_diameter * Math.abs(transform.a)\n const radius = scaledDiameter / 2\n\n if (hole.hole_shape === \"circle\") {\n return [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n r: radius.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n // Square hole\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n x: (x - radius).toString(),\n y: (y - radius).toString(),\n width: scaledDiameter.toString(),\n height: scaledDiameter.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n if (hole.hole_shape === \"oval\") {\n const scaledWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHeight = hole.hole_height * Math.abs(transform.a)\n const rx = scaledWidth / 2\n const ry = scaledHeight / 2\n\n return [\n {\n name: \"ellipse\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n rx: rx.toString(),\n ry: ry.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n\n return []\n}\n","export const HOLE_COLOR = \"#FF26E2\"\n","// Kicad-2020 color scheme\nexport const colorMap = {\n \"3d_viewer\": {\n background_bottom: \"rgb(102, 102, 128)\",\n background_top: \"rgb(204, 204, 230)\",\n board: \"rgb(51, 43, 23)\",\n copper: \"rgb(179, 156, 0)\",\n silkscreen_bottom: \"rgb(230, 230, 230)\",\n silkscreen_top: \"rgb(230, 230, 230)\",\n soldermask: \"rgb(20, 51, 36)\",\n solderpaste: \"rgb(128, 128, 128)\",\n },\n board: {\n anchor: \"rgb(255, 38, 226)\",\n aux_items: \"rgb(255, 255, 255)\",\n b_adhes: \"rgb(0, 0, 132)\",\n b_crtyd: \"rgb(255, 38, 226)\",\n b_fab: \"rgb(88, 93, 132)\",\n b_mask: \"rgba(2, 255, 238, 0.400)\",\n b_paste: \"rgb(0, 194, 194)\",\n b_silks: \"rgb(232, 178, 167)\",\n background: \"rgb(0, 16, 35)\",\n cmts_user: \"rgb(89, 148, 220)\",\n copper: {\n b: \"rgb(77, 127, 196)\",\n f: \"rgb(200, 52, 52)\",\n in1: \"rgb(127, 200, 127)\",\n in10: \"rgb(237, 124, 51)\",\n in11: \"rgb(91, 195, 235)\",\n in12: \"rgb(247, 111, 142)\",\n in13: \"rgb(167, 165, 198)\",\n in14: \"rgb(40, 204, 217)\",\n in15: \"rgb(232, 178, 167)\",\n in16: \"rgb(242, 237, 161)\",\n in17: \"rgb(237, 124, 51)\",\n in18: \"rgb(91, 195, 235)\",\n in19: \"rgb(247, 111, 142)\",\n in2: \"rgb(206, 125, 44)\",\n in20: \"rgb(167, 165, 198)\",\n in21: \"rgb(40, 204, 217)\",\n in22: \"rgb(232, 178, 167)\",\n in23: \"rgb(242, 237, 161)\",\n in24: \"rgb(237, 124, 51)\",\n in25: \"rgb(91, 195, 235)\",\n in26: \"rgb(247, 111, 142)\",\n in27: \"rgb(167, 165, 198)\",\n in28: \"rgb(40, 204, 217)\",\n in29: \"rgb(232, 178, 167)\",\n in3: \"rgb(79, 203, 203)\",\n in30: \"rgb(242, 237, 161)\",\n in4: \"rgb(219, 98, 139)\",\n in5: \"rgb(167, 165, 198)\",\n in6: \"rgb(40, 204, 217)\",\n in7: \"rgb(232, 178, 167)\",\n in8: \"rgb(242, 237, 161)\",\n in9: \"rgb(141, 203, 129)\",\n },\n cursor: \"rgb(255, 255, 255)\",\n drc: \"rgb(194, 194, 194)\",\n drc_error: \"rgba(215, 91, 107, 0.800)\",\n drc_exclusion: \"rgb(255, 255, 255)\",\n drc_warning: \"rgba(255, 208, 66, 0.902)\",\n dwgs_user: \"rgb(194, 194, 194)\",\n eco1_user: \"rgb(180, 219, 210)\",\n eco2_user: \"rgb(216, 200, 82)\",\n edge_cuts: \"rgb(208, 210, 205)\",\n f_adhes: \"rgb(132, 0, 132)\",\n f_crtyd: \"rgb(255, 0, 245)\",\n f_fab: \"rgb(175, 175, 175)\",\n f_mask: \"rgba(216, 100, 255, 0.400)\",\n f_paste: \"rgba(180, 160, 154, 0.902)\",\n f_silks: \"rgb(242, 237, 161)\",\n footprint_text_back: \"rgb(0, 0, 132)\",\n footprint_text_front: \"rgb(194, 194, 194)\",\n footprint_text_invisible: \"rgb(132, 132, 132)\",\n grid: \"rgb(132, 132, 132)\",\n grid_axes: \"rgb(194, 194, 194)\",\n margin: \"rgb(255, 38, 226)\",\n microvia: \"rgb(0, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n pad_back: \"rgb(77, 127, 196)\",\n pad_front: \"rgb(200, 52, 52)\",\n pad_plated_hole: \"rgb(194, 194, 0)\",\n pad_through_hole: \"rgb(227, 183, 46)\",\n plated_hole: \"rgb(26, 196, 210)\",\n ratsnest: \"rgba(245, 255, 213, 0.702)\",\n select_overlay: \"rgb(4, 255, 67)\",\n through_via: \"rgb(236, 236, 236)\",\n user_1: \"rgb(194, 194, 194)\",\n user_2: \"rgb(89, 148, 220)\",\n user_3: \"rgb(180, 219, 210)\",\n user_4: \"rgb(216, 200, 82)\",\n user_5: \"rgb(194, 194, 194)\",\n user_6: \"rgb(89, 148, 220)\",\n user_7: \"rgb(180, 219, 210)\",\n user_8: \"rgb(216, 200, 82)\",\n user_9: \"rgb(232, 178, 167)\",\n via_blind_buried: \"rgb(187, 151, 38)\",\n via_hole: \"rgb(227, 183, 46)\",\n via_micro: \"rgb(0, 132, 132)\",\n via_through: \"rgb(236, 236, 236)\",\n worksheet: \"rgb(200, 114, 171)\",\n },\n gerbview: {\n axes: \"rgb(0, 0, 132)\",\n background: \"rgb(0, 0, 0)\",\n dcodes: \"rgb(255, 255, 255)\",\n grid: \"rgb(132, 132, 132)\",\n layers: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n ],\n negative_objects: \"rgb(132, 132, 132)\",\n worksheet: \"rgb(0, 0, 132)\",\n },\n meta: {\n filename: \"kicad_2020\",\n name: \"KiCad 2020\",\n version: 2,\n },\n palette: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n ],\n schematic: {\n aux_items: \"rgb(46, 46, 46)\",\n background: \"rgb(245, 241, 237)\",\n brightened: \"rgb(255, 0, 255)\",\n bus: \"rgb(0, 0, 132)\",\n bus_junction: \"rgb(0, 0, 132)\",\n component_body: \"rgb(255, 255, 194)\",\n component_outline: \"rgb(132, 0, 0)\",\n cursor: \"rgb(15, 15, 15)\",\n erc_error: \"rgba(230, 9, 13, 0.800)\",\n erc_warning: \"rgba(209, 146, 0, 0.800)\",\n fields: \"rgb(132, 0, 132)\",\n grid: \"rgb(181, 181, 181)\",\n grid_axes: \"rgb(0, 0, 132)\",\n hidden: \"rgb(194, 194, 194)\",\n junction: \"rgb(0, 150, 0)\",\n label_global: \"rgb(132, 0, 0)\",\n label_hier: \"rgb(114, 86, 0)\",\n label_local: \"rgb(15, 15, 15)\",\n net_name: \"rgb(132, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n note: \"rgb(0, 0, 194)\",\n override_item_colors: false,\n pin: \"rgb(132, 0, 0)\",\n pin_name: \"rgb(0, 100, 100)\",\n pin_number: \"rgb(169, 0, 0)\",\n reference: \"rgb(0, 100, 100)\",\n shadow: \"rgba(102, 179, 255, 0.800)\",\n sheet: \"rgb(132, 0, 0)\",\n sheet_background: \"rgba(253, 255, 231, 0.000)\",\n sheet_fields: \"rgb(132, 0, 132)\",\n sheet_filename: \"rgb(114, 86, 0)\",\n sheet_label: \"rgb(0, 100, 100)\",\n sheet_name: \"rgb(0, 100, 100)\",\n value: \"rgb(0, 100, 100)\",\n wire: \"rgb(0, 150, 0)\",\n wire_crossing: \"rgb(30, 180, 30)\",\n worksheet: \"rgb(132, 0, 0)\",\n },\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { stringify } from \"svgson\"\nimport {\n applyToPoint,\n compose,\n scale,\n translate,\n fromTriangles,\n type Matrix,\n fromTwoMovingPoints,\n} from \"transformation-matrix\"\nimport { drawSchematicGrid } from \"./draw-schematic-grid\"\nimport { drawSchematicLabeledPoints } from \"./draw-schematic-labeled-points\"\nimport { getSchematicBoundsFromCircuitJson } from \"./get-schematic-bounds-from-circuit-json\"\nimport { createSvgObjectsFromSchematicComponent } from \"./svg-object-fns/create-svg-objects-from-sch-component\"\nimport { createSvgObjectsFromSchDebugObject } from \"./svg-object-fns/create-svg-objects-from-sch-debug-object\"\nimport { createSchematicTrace } from \"./svg-object-fns/create-svg-objects-from-sch-trace\"\nimport { createSvgObjectsForSchNetLabel } from \"./svg-object-fns/create-svg-objects-for-sch-net-label\"\n\ninterface Options {\n width?: number\n height?: number\n grid?: boolean | { cellSize?: number; labelCells?: boolean }\n labeledPoints?: Array<{ x: number; y: number; label: string }>\n}\n\nexport function convertCircuitJsonToSchematicSvg(\n circuitJson: AnyCircuitElement[],\n options?: Options,\n): string {\n // Get bounds with padding\n const realBounds = getSchematicBoundsFromCircuitJson(circuitJson)\n const realWidth = realBounds.maxX - realBounds.minX\n const realHeight = realBounds.maxY - realBounds.minY\n\n const svgWidth = options?.width ?? 1200\n const svgHeight = options?.height ?? 600\n\n // Compute the padding such that we maintain the same aspect ratio\n const circuitAspectRatio = realWidth / realHeight\n const containerAspectRatio = svgWidth / svgHeight\n\n let screenPaddingPx: { x: number; y: number }\n if (circuitAspectRatio > containerAspectRatio) {\n // Circuit is wider than container - fit to width\n const newHeight = svgWidth / circuitAspectRatio\n screenPaddingPx = {\n x: 0,\n y: (svgHeight - newHeight) / 2,\n }\n } else {\n // Circuit is taller than container - fit to height\n const newWidth = svgHeight * circuitAspectRatio\n screenPaddingPx = {\n x: (svgWidth - newWidth) / 2,\n y: 0,\n }\n }\n\n // Calculate projection using REAL points and SCREEN points\n // We're saying to map the real bounds to the screen bounds by giving 3 points\n // for each coordinate space\n const transform = fromTriangles(\n [\n { x: realBounds.minX, y: realBounds.maxY },\n { x: realBounds.maxX, y: realBounds.maxY },\n { x: realBounds.maxX, y: realBounds.minY },\n ],\n [\n { x: screenPaddingPx.x, y: screenPaddingPx.y },\n { x: svgWidth - screenPaddingPx.x, y: screenPaddingPx.y },\n { x: svgWidth - screenPaddingPx.x, y: svgHeight - screenPaddingPx.y },\n ],\n )\n const svgChildren: SvgObject[] = []\n\n // Add background rectangle\n svgChildren.push({\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n children: [],\n value: \"\",\n })\n\n // Add grid if enabled\n if (options?.grid) {\n const gridConfig = typeof options.grid === \"object\" ? options.grid : {}\n svgChildren.push(\n drawSchematicGrid({ bounds: realBounds, transform, ...gridConfig }),\n )\n }\n\n const schDebugObjectSvgs: SvgObject[] = []\n const schComponentSvgs: SvgObject[] = []\n const schTraceSvgs: SvgObject[] = []\n const schNetLabel: SvgObject[] = []\n\n for (const elm of circuitJson) {\n if (elm.type === \"schematic_debug_object\") {\n schDebugObjectSvgs.push(\n ...createSvgObjectsFromSchDebugObject(elm, transform),\n )\n } else if (elm.type === \"schematic_component\") {\n schComponentSvgs.push(\n ...createSvgObjectsFromSchematicComponent({\n component: elm,\n transform,\n circuitJson,\n }),\n )\n } else if (elm.type === \"schematic_trace\") {\n schTraceSvgs.push(...createSchematicTrace(elm, transform))\n } else if (elm.type === \"schematic_net_label\") {\n schNetLabel.push(...createSvgObjectsForSchNetLabel(elm, transform))\n }\n }\n\n // Add elements in correct order\n svgChildren.push(\n ...schDebugObjectSvgs,\n ...schComponentSvgs,\n ...schTraceSvgs,\n ...schNetLabel,\n )\n\n // Add labeled points if provided\n if (options?.labeledPoints) {\n svgChildren.push(\n drawSchematicLabeledPoints({\n points: options.labeledPoints,\n transform,\n }),\n )\n }\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n style: `background-color: ${colorMap.schematic.background}`,\n },\n children: [\n // Add styles\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n\n // DO NOT USE THESE CLASSES!!!!\n // PUT STYLES IN THE SVG OBJECTS THEMSELVES\n value: `\n .boundary { fill: ${colorMap.schematic.background}; }\n .schematic-boundary { fill: none; stroke: #fff; }\n .component { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .chip { fill: ${colorMap.schematic.component_body}; stroke: ${colorMap.schematic.component_outline}; }\n .component-pin { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .trace { stroke: ${colorMap.schematic.wire}; }\n .text { font-family: sans-serif; fill: ${colorMap.schematic.wire}; }\n .pin-number { fill: ${colorMap.schematic.pin_number}; }\n .port-label { fill: ${colorMap.schematic.reference}; }\n .component-name { fill: ${colorMap.schematic.reference}; }\n `,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ...svgChildren,\n ],\n value: \"\",\n }\n\n return stringify(svgObject)\n}\n\n/**\n * @deprecated use `convertCircuitJsonToSchematicSvg` instead\n */\nexport const circuitJsonToSchematicSvg = convertCircuitJsonToSchematicSvg\n","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function drawSchematicGrid(params: {\n bounds: {\n minX: number\n minY: number\n maxX: number\n maxY: number\n }\n transform: Matrix\n cellSize?: number\n labelCells?: boolean\n}): SvgObject {\n const { minX, minY, maxX, maxY } = params.bounds\n const cellSize = params.cellSize ?? 1\n const labelCells = params.labelCells ?? false\n const gridLines: any[] = []\n\n // Helper function to transform points\n const transformPoint = (x: number, y: number) => {\n const [transformedX, transformedY] = applyToPoint(params.transform, [x, y])\n return { x: transformedX, y: transformedY }\n }\n\n // Vertical lines\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n const start = transformPoint(x, minY)\n const end = transformPoint(x, maxY)\n\n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Horizontal lines\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const start = transformPoint(minX, y)\n const end = transformPoint(maxX, y)\n\n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Add cell labels if enabled\n if (labelCells) {\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const point = transformPoint(x, y)\n\n gridLines.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: (point.x - 2.5).toString(),\n y: (point.y - 5).toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": (\n (cellSize / 5) *\n Math.abs(params.transform.a)\n ).toString(),\n \"fill-opacity\": \"0.5\",\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": \"sans-serif\",\n },\n children: [\n {\n type: \"text\",\n value: `${x},${y}`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n }\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"grid\" },\n children: gridLines,\n }\n}\n","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\ninterface LabeledPoint {\n x: number\n y: number\n label?: string\n}\n\nexport function drawSchematicLabeledPoints(params: {\n points: LabeledPoint[]\n transform: Matrix\n}): SvgObject {\n const { points, transform } = params\n const labeledPointsGroup: any[] = []\n\n for (const point of points) {\n // Transform offset points for X marker\n const [x1, y1] = applyToPoint(transform, [point.x - 0.1, point.y - 0.1])\n const [x2, y2] = applyToPoint(transform, [point.x + 0.1, point.y + 0.1])\n const [x3, y3] = applyToPoint(transform, [point.x - 0.1, point.y + 0.1])\n const [x4, y4] = applyToPoint(transform, [point.x + 0.1, point.y - 0.1])\n\n // Add X marker\n labeledPointsGroup.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M${x1},${y1} L${x2},${y2} M${x3},${y3} L${x4},${y4}`,\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-opacity\": \"0.7\",\n },\n })\n\n // Transform label position\n const [labelX, labelY] = applyToPoint(transform, [\n point.x + 0.15,\n point.y - 0.15,\n ])\n\n // Add label\n labeledPointsGroup.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: labelX.toString(),\n y: labelY.toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": (0.1 * Math.abs(transform.a)).toString(),\n \"fill-opacity\": \"0.7\",\n \"text-anchor\": \"start\",\n \"font-family\": \"sans-serif\",\n \"dominant-baseline\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: point.label || `(${point.x},${point.y})`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"labeled-points\" },\n children: labeledPointsGroup,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\ninterface Bounds {\n minX: number\n minY: number\n maxX: number\n maxY: number\n}\n\nexport function getSchematicBoundsFromCircuitJson(\n soup: AnyCircuitElement[],\n padding = 0.5,\n): Bounds {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n const portSize = 0.2\n\n // Find the bounds\n for (const item of soup) {\n if (item.type === \"schematic_component\") {\n updateBounds(item.center, item.size, item.rotation || 0)\n } else if (item.type === \"schematic_port\") {\n updateBounds(item.center, { width: portSize, height: portSize }, 0)\n } else if (item.type === \"schematic_debug_object\") {\n if (item.shape === \"rect\") {\n updateBounds(item.center, item.size, 0)\n } else if (item.shape === \"line\") {\n updateBounds(item.start, { width: 0.1, height: 0.1 }, 0)\n updateBounds(item.end, { width: 0.1, height: 0.1 }, 0)\n }\n } else if (item.type === \"schematic_net_label\") {\n updateBounds(item.center, { width: 1, height: 1 }, 0)\n }\n }\n\n // Add padding to bounds\n minX -= padding\n minY -= padding\n maxX += padding\n maxY += padding\n\n return { minX, minY, maxX, maxY }\n\n function updateBounds(center: any, size: any, rotation: number) {\n const corners = [\n { x: -size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: size.height / 2 },\n { x: -size.width / 2, y: size.height / 2 },\n ]\n\n for (const corner of corners) {\n const rotatedX =\n corner.x * Math.cos(rotation) - corner.y * Math.sin(rotation) + center.x\n const rotatedY =\n corner.x * Math.sin(rotation) + corner.y * Math.cos(rotation) + center.y\n minX = Math.min(minX, rotatedX)\n minY = Math.min(minY, rotatedY)\n maxX = Math.max(maxX, rotatedX)\n maxY = Math.max(maxY, rotatedY)\n }\n }\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSvg, symbols, type SchSymbol } from \"schematic-symbols\"\nimport { parseSync } from \"svgson\"\nimport {\n applyToPoint,\n compose,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { matchSchPortsToSymbolPorts } from \"lib/utils/match-sch-ports-with-symbol-ports\"\nimport { pointPairsToMatrix } from \"lib/utils/point-pairs-to-matrix\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport type { TextPrimitive } from \"schematic-symbols\"\n\nconst ninePointAnchorToTextAnchor: Record<\n TextPrimitive[\"anchor\"],\n \"middle\" | \"start\" | \"end\"\n> = {\n top_left: \"start\",\n top_right: \"end\",\n middle_left: \"start\",\n middle_right: \"end\",\n bottom_left: \"start\",\n bottom_right: \"end\",\n center: \"middle\",\n middle_top: \"middle\",\n middle_bottom: \"middle\",\n}\n\nconst ninePointAnchorToDominantBaseline: Record<\n TextPrimitive[\"anchor\"],\n \"auto\" | \"hanging\" | \"middle\"\n> = {\n top_left: \"auto\",\n top_right: \"auto\",\n bottom_left: \"hanging\",\n bottom_right: \"hanging\",\n center: \"auto\",\n middle_left: \"middle\",\n middle_right: \"middle\",\n middle_top: \"auto\",\n middle_bottom: \"hanging\",\n}\n\nexport const createSvgObjectsFromSchematicComponentWithSymbol = ({\n component: schComponent,\n transform: realToScreenTransform,\n circuitJson,\n}: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n\n const symbol: SchSymbol = (symbols as any)[schComponent.symbol_name!]\n\n if (!symbol) return []\n\n const schPorts = su(circuitJson as any).schematic_port.list({\n schematic_component_id: schComponent.schematic_component_id,\n }) as SchematicPort[]\n\n const srcComponent = su(circuitJson as any).source_component.get(\n schComponent.source_component_id,\n )\n // Match schPorts to symbol ports using angle from schematic component center\n const schPortsWithSymbolPorts = matchSchPortsToSymbolPorts({\n schPorts,\n symbol,\n schComponent,\n })\n\n if (!schPortsWithSymbolPorts[0]) return []\n\n const transformFromSymbolToReal = pointPairsToMatrix(\n schPortsWithSymbolPorts[1]?.symbolPort ?? symbol.center,\n schPortsWithSymbolPorts[1]?.schPort.center ?? schComponent.center,\n schPortsWithSymbolPorts[0].symbolPort,\n schPortsWithSymbolPorts[0].schPort.center,\n )\n\n const paths = symbol.primitives.filter((p) => p.type === \"path\")\n const texts = symbol.primitives.filter((p) => p.type === \"text\")\n const circles = symbol.primitives.filter((p) => p.type === \"circle\")\n const boxes = symbol.primitives.filter((p) => p.type === \"box\")\n\n for (const path of paths) {\n const { points, color, closed, fill } = path\n svgObjects.push({\n type: \"element\",\n name: \"path\",\n attributes: {\n d:\n points\n .map((p, i) => {\n const [x, y] = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n [p.x, p.y],\n )\n return `${i === 0 ? \"M\" : \"L\"} ${x} ${y}`\n })\n .join(\" \") + (closed ? \" Z\" : \"\"),\n stroke: colorMap.schematic.component_outline,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(realToScreenTransform)}px`,\n },\n value: \"\",\n children: [],\n })\n }\n\n for (const text of texts) {\n const screenTextPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n text,\n )\n let textValue = \"\"\n if (text.text === \"{REF}\") {\n textValue = srcComponent?.name ?? \"\"\n } else if (text.text === \"{VAL}\") {\n textValue = schComponent.symbol_display_value ?? \"\"\n }\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: screenTextPos.x.toString(),\n y: screenTextPos.y.toString(),\n \"dominant-baseline\": ninePointAnchorToDominantBaseline[text.anchor],\n \"text-anchor\": ninePointAnchorToTextAnchor[text.anchor],\n \"font-family\": \"sans-serif\",\n \"font-size\": `${getSchScreenFontSize(realToScreenTransform, \"reference_designator\")}px`,\n },\n value: \"\",\n children: [\n {\n type: \"text\",\n value: textValue,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n\n // Draw Boxes\n\n for (const box of boxes) {\n const screenBoxPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n box,\n )\n const symbolToScreenScale = compose(\n realToScreenTransform,\n transformFromSymbolToReal,\n ).a\n\n svgObjects.push({\n name: \"rect\",\n type: \"element\",\n attributes: {\n x: screenBoxPos.x.toString(),\n y: screenBoxPos.y.toString(),\n width: (box.width * symbolToScreenScale).toString(),\n height: (box.height * symbolToScreenScale).toString(),\n fill: \"red\",\n },\n value: \"\",\n children: [],\n })\n }\n\n // Draw Ports for debugging\n for (const port of symbol.ports) {\n const screenPortPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n port,\n )\n svgObjects.push({\n type: \"element\",\n name: \"circle\",\n attributes: {\n cx: screenPortPos.x.toString(),\n cy: screenPortPos.y.toString(),\n r: `${realToScreenTransform.a * 0.02}px`,\n fill: \"none\",\n stroke: colorMap.schematic.component_outline,\n },\n value: \"\",\n children: [],\n })\n }\n\n return svgObjects\n}\n","import type { Matrix } from \"transformation-matrix\"\n\n// 0.02mm -> 2px\nexport const getSchStrokeSize = (transform: Matrix) => {\n return Math.abs(transform.a) * 0.02\n}\n","import type { SchematicComponent, SchematicPort } from \"circuit-json\"\nimport type { SchSymbol } from \"schematic-symbols\"\n\n// export const matchSchPortsToSymbolPorts = ({\n// schPorts,\n// symbol,\n// schComponent,\n// }: {\n// schPorts: SchematicPort[]\n// schComponent: SchematicComponent\n// symbol: SchSymbol\n// }): Array<{\n// schPort: SchematicPort\n// symbolPort: SchSymbol[\"ports\"][number]\n// }> => {\n// // schPorts is Array<{ center: { x: number; y: number } }>\n// // schComponent.center is { x: number; y: number }\n// // symbol.ports is Array<{ x: number; y: number }>\n// // symbol.center is { x: number; y: number }\n// // Use the angles from the schComponent center to the schPorts to match with the angles from the symbol center to the symbol ports\n// // If a port isn't matched because there are more schPorts than symbolPorts (or vice versa), then the unmatched ports should be ignored (not returned)\n// }\n\n// Helper function to calculate smallest angular difference accounting for wraparound\nconst getAngularDifference = (angle1: number, angle2: number): number => {\n // Convert from [-π, π] to [0, 2π] for easier comparison\n const a1 = angle1 < 0 ? angle1 + 2 * Math.PI : angle1\n const a2 = angle2 < 0 ? angle2 + 2 * Math.PI : angle2\n\n // Calculate direct difference\n let diff = Math.abs(a1 - a2)\n // If the difference is greater than π, then the smaller angle is going the other way around\n if (diff > Math.PI) {\n diff = 2 * Math.PI - diff\n }\n return diff\n}\n\nexport const matchSchPortsToSymbolPorts = ({\n schPorts,\n symbol,\n schComponent,\n}: {\n schPorts: SchematicPort[]\n schComponent: SchematicComponent\n symbol: SchSymbol\n}): Array<{\n schPort: SchematicPort\n symbolPort: SchSymbol[\"ports\"][number]\n}> => {\n // Calculate angles for schematic ports\n const schPortAngles = schPorts.map((port) => {\n const dx = port.center.x - schComponent.center.x\n const dy = port.center.y - schComponent.center.y\n return {\n port,\n angle: Math.atan2(dy, dx),\n }\n })\n\n // Calculate angles for symbol ports\n const symbolPortAngles = symbol.ports.map((port) => {\n const dx = port.x - symbol.center.x\n const dy = port.y - symbol.center.y\n return {\n port,\n angle: Math.atan2(dy, dx),\n }\n })\n\n // Sort both arrays by angle to help with initial matching\n // Note: The sorting is less critical now that we handle wraparound properly\n schPortAngles.sort((a, b) => a.angle - b.angle)\n symbolPortAngles.sort((a, b) => a.angle - b.angle)\n\n const matches: Array<{\n schPort: SchematicPort\n symbolPort: SchSymbol[\"ports\"][number]\n }> = []\n\n // Keep track of used symbol ports to avoid duplicate matches\n const usedSymbolPorts = new Set<SchSymbol[\"ports\"][number]>()\n\n // For each schematic port, find the best matching symbol port\n for (const schPortAngle of schPortAngles) {\n let bestMatch: {\n symbolPort: SchSymbol[\"ports\"][number]\n angleDiff: number\n } | null = null\n\n // Compare against all available symbol ports\n for (const symbolPortAngle of symbolPortAngles) {\n // Skip if this symbol port is already matched\n if (usedSymbolPorts.has(symbolPortAngle.port)) continue\n\n const angleDiff = getAngularDifference(\n schPortAngle.angle,\n symbolPortAngle.angle,\n )\n\n if (bestMatch === null || angleDiff < bestMatch.angleDiff) {\n bestMatch = {\n symbolPort: symbolPortAngle.port,\n angleDiff,\n }\n }\n }\n\n // If we found a match and the angular difference is reasonable (e.g., less than 45 degrees)\n if (bestMatch && bestMatch.angleDiff < Math.PI / 4) {\n matches.push({\n schPort: schPortAngle.port,\n symbolPort: bestMatch.symbolPort,\n })\n usedSymbolPorts.add(bestMatch.symbolPort)\n }\n }\n\n return matches\n}\n","import { type Matrix, compose, scale, translate } from \"transformation-matrix\"\n\ntype Point = { x: number; y: number }\n\nexport function pointPairsToMatrix(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n): Matrix {\n // Calculate the translation based on the first point pair (A -> A')\n const tx = a2.x - a1.x\n const ty = a2.y - a1.y\n\n // Calculate scaling factors using the distances between points\n const originalDistance = Math.sqrt((b1.x - a1.x) ** 2 + (b1.y - a1.y) ** 2)\n const transformedDistance = Math.sqrt((b2.x - a2.x) ** 2 + (b2.y - a2.y) ** 2)\n\n const a = transformedDistance / originalDistance\n\n // Create and compose the transformations\n const translateMatrix = translate(tx, ty)\n const scaleMatrix = scale(a, a)\n\n return compose(translateMatrix, scaleMatrix)\n}\n","import type { Matrix } from \"transformation-matrix\"\nimport { applyToPoint } from \"transformation-matrix\"\n\ntype SchTextType =\n | \"pin_number\"\n | \"reference_designator\"\n | \"manufacturer_number\"\n | \"net_label\"\n\nexport const getSchMmFontSize = (textType: SchTextType) => {\n return textType === \"pin_number\" ? 0.15 : 0.18\n}\n\nexport const getSchScreenFontSize = (\n transform: Matrix,\n textType: SchTextType,\n) => {\n return Math.abs(transform.a) * getSchMmFontSize(textType)\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n SourceSimpleChip,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSvg, symbols } from \"schematic-symbols\"\nimport { parseSync } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { createSvgObjectsFromSchematicComponentWithSymbol } from \"./create-svg-objects-from-sch-component-with-symbol\"\nimport { createSvgObjectsFromSchPortOnBox } from \"./create-svg-objects-from-sch-port-on-box\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\n\nexport const createSvgObjectsFromSchematicComponentWithBox = ({\n component: schComponent,\n transform,\n circuitJson,\n}: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const srcComponent = su(circuitJson as any).source_component.get(\n schComponent.source_component_id,\n )\n const svgObjects: SvgObject[] = []\n\n const componentScreenTopLeft = applyToPoint(transform, {\n x: schComponent.center.x - schComponent.size.width / 2,\n y: schComponent.center.y + schComponent.size.height / 2,\n })\n const componentScreenBottomRight = applyToPoint(transform, {\n x: schComponent.center.x + schComponent.size.width / 2,\n y: schComponent.center.y - schComponent.size.height / 2,\n })\n const componentScreenWidth =\n componentScreenBottomRight.x - componentScreenTopLeft.x\n const componentScreenHeight =\n componentScreenBottomRight.y - componentScreenTopLeft.y\n\n // Add basic rectangle for component body\n svgObjects.push({\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n class: \"component chip\",\n x: componentScreenTopLeft.x.toString(),\n y: componentScreenTopLeft.y.toString(),\n width: componentScreenWidth.toString(),\n height: componentScreenHeight.toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n children: [],\n })\n // Calculate position for top center of component\n const screenManufacturerNumberPos = applyToPoint(transform, {\n x: schComponent.center.x + schComponent.size.width / 2,\n y: schComponent.center.y + schComponent.size.height / 2 + 0.5, // Above the component top edge\n })\n const fontSizePx = getSchScreenFontSize(transform, \"manufacturer_number\")\n\n // Add manufacturer number and component name text\n if (srcComponent?.manufacturer_part_number) {\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: screenManufacturerNumberPos.x.toString(),\n y: screenManufacturerNumberPos.y.toString(),\n \"font-family\": \"sans-serif\",\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${fontSizePx}px`,\n },\n children: [\n {\n type: \"text\",\n value: srcComponent.manufacturer_part_number,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // Component name below manufacturer number\n if (srcComponent?.name) {\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: screenManufacturerNumberPos.x.toString(),\n y: (screenManufacturerNumberPos.y + fontSizePx * 1.1).toString(),\n \"font-family\": \"sans-serif\",\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${fontSizePx}px`,\n },\n children: [\n {\n type: \"text\",\n value: srcComponent.name || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // // Process ports\n const schematicPorts = su(circuitJson as any).schematic_port.list({\n schematic_component_id: schComponent.schematic_component_id,\n }) as SchematicPort[]\n\n for (const schPort of schematicPorts) {\n svgObjects.push(\n ...createSvgObjectsFromSchPortOnBox({\n schPort,\n schComponent,\n transform,\n circuitJson,\n }),\n )\n }\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { createSvgObjectsForSchPortBoxLine } from \"./create-svg-objects-for-sch-port-box-line\"\nimport { createSvgObjectsForSchPortPinNumberText } from \"./create-svg-objects-for-sch-port-pin-number-text\"\nimport { createSvgObjectsForSchPortPinLabel } from \"./create-svg-objects-for-sch-port-pin-label\"\n\nexport const createSvgObjectsFromSchPortOnBox = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n svgObjects.push(...createSvgObjectsForSchPortBoxLine(params))\n svgObjects.push(...createSvgObjectsForSchPortPinNumberText(params))\n svgObjects.push(...createSvgObjectsForSchPortPinLabel(params))\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\n\nconst PIN_CIRCLE_RADIUS_MM = 0.02\n\n/**\n * The schematic port box line is the line and circle that goes from the edge\n * of the component box to the port.\n */\nexport const createSvgObjectsForSchPortBoxLine = ({\n schPort,\n schComponent,\n transform,\n circuitJson,\n}: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n\n const srcPort = su(circuitJson as any).source_port.get(schPort.source_port_id)\n\n const realEdgePos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n // schPort.distance_from_component_edge is currently calculated incorrectly\n // in core\n const realPinLineLength = schPort.distance_from_component_edge ?? 0.4\n\n switch (schPort.side_of_component) {\n case \"left\":\n realEdgePos.x += realPinLineLength\n break\n case \"right\":\n realEdgePos.x -= realPinLineLength\n break\n case \"top\":\n realEdgePos.y -= realPinLineLength\n break\n case \"bottom\":\n realEdgePos.y += realPinLineLength\n break\n }\n\n const screenSchPortPos = applyToPoint(transform, schPort.center)\n const screenRealEdgePos = applyToPoint(transform, realEdgePos)\n\n // Subtract the pin circle radius from the pin line length to get the end\n const realLineEnd = { ...schPort.center }\n\n switch (schPort.side_of_component) {\n case \"left\":\n realLineEnd.x += PIN_CIRCLE_RADIUS_MM\n break\n case \"right\":\n realLineEnd.x -= PIN_CIRCLE_RADIUS_MM\n break\n case \"top\":\n realLineEnd.y -= PIN_CIRCLE_RADIUS_MM\n break\n case \"bottom\":\n realLineEnd.y += PIN_CIRCLE_RADIUS_MM\n break\n }\n const screenLineEnd = applyToPoint(transform, realLineEnd)\n\n // Add port line\n svgObjects.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n x1: screenLineEnd.x.toString(),\n y1: screenLineEnd.y.toString(),\n x2: screenRealEdgePos.x.toString(),\n y2: screenRealEdgePos.y.toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n // Add port circle\n svgObjects.push({\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n cx: screenSchPortPos.x.toString(),\n cy: screenSchPortPos.y.toString(),\n r: (Math.abs(transform.a) * PIN_CIRCLE_RADIUS_MM).toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n return svgObjects\n}\n","/**\n * Given a side, gives you the unit vector you would move in if you were coming\n * towards that edge from the outside. This is the same as the unit vector from\n * a port to the edge of a schematic box. This function assumes cartesian\n * coordinates (Y positive is up)\n */\nexport const getUnitVectorFromOutsideToEdge = (\n side: \"top\" | \"bottom\" | \"left\" | \"right\",\n) => {\n switch (side) {\n case \"top\":\n return { x: 0, y: -1 }\n case \"bottom\":\n return { x: 0, y: 1 }\n case \"left\":\n return { x: 1, y: 0 }\n case \"right\":\n return { x: -1, y: 0 }\n }\n throw new Error(`Invalid side: ${side}`)\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport const createSvgObjectsForSchPortPinNumberText = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n const realPinNumberPos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n if (!schPort.side_of_component) return []\n const vecToEdge = getUnitVectorFromOutsideToEdge(schPort.side_of_component)\n\n const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4\n\n // Move the pin number halfway to the edge of the box component so it sits\n // between the edge and the port, exactly in the middle\n realPinNumberPos.x += (vecToEdge.x * realPinEdgeDistance) / 2\n realPinNumberPos.y += (vecToEdge.y * realPinEdgeDistance) / 2\n\n // Transform the pin position from local to global coordinates\n const screenPinNumberTextPos = applyToPoint(transform, realPinNumberPos)\n\n if (\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ) {\n // Move the pin number text to the left a bit so it doesn't hit the port line\n screenPinNumberTextPos.x -= 2 //px\n } else {\n // Move the pin number text up a bit so it doesn't hit the port line\n screenPinNumberTextPos.y -= 2 //px\n }\n\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"pin-number\",\n x: screenPinNumberTextPos.x.toString(),\n y: screenPinNumberTextPos.y.toString(),\n style: \"font-family: sans-serif;\",\n fill: colorMap.schematic.pin_number,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${getSchScreenFontSize(transform, \"pin_number\")}px`,\n transform:\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ? `rotate(-90 ${screenPinNumberTextPos.x} ${screenPinNumberTextPos.y})`\n : \"\",\n },\n children: [\n {\n type: \"text\",\n value: schPort.pin_number?.toString() || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nconst LABEL_DIST_FROM_EDGE_MM = 0.1\n\nexport const createSvgObjectsForSchPortPinLabel = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n const realPinNumberPos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n if (!schPort.side_of_component) return []\n const vecToEdge = getUnitVectorFromOutsideToEdge(schPort.side_of_component)\n\n const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4\n\n // Move the pin number halfway to the edge of the box component so it sits\n // between the edge and the port, exactly in the middle\n realPinNumberPos.x +=\n vecToEdge.x * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM)\n realPinNumberPos.y +=\n vecToEdge.y * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM)\n\n // Transform the pin position from local to global coordinates\n const screenPinNumberTextPos = applyToPoint(transform, realPinNumberPos)\n\n const label =\n schPort.display_pin_label ??\n schComponent.port_labels?.[`pin${schPort.pin_number}`]\n\n if (!label) return []\n\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"pin-number\",\n x: screenPinNumberTextPos.x.toString(),\n y: screenPinNumberTextPos.y.toString(),\n style: \"font-family: sans-serif;\",\n fill: colorMap.schematic.pin_number,\n \"text-anchor\":\n schPort.side_of_component === \"left\" ||\n schPort.side_of_component === \"bottom\"\n ? \"start\"\n : \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-size\": `${getSchScreenFontSize(transform, \"pin_number\")}px`,\n transform:\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ? `rotate(-90 ${screenPinNumberTextPos.x} ${screenPinNumberTextPos.y})`\n : \"\",\n },\n children: [\n {\n type: \"text\",\n value: label || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","import type { AnyCircuitElement, SchematicComponent } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { createSvgObjectsFromSchematicComponentWithSymbol } from \"./create-svg-objects-from-sch-component-with-symbol\"\nimport { createSvgObjectsFromSchematicComponentWithBox } from \"./create-svg-objects-from-sch-component-with-box\"\nimport type { Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromSchematicComponent(params: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] {\n const { component } = params\n\n if (component.symbol_name) {\n return createSvgObjectsFromSchematicComponentWithSymbol(params)\n }\n\n return createSvgObjectsFromSchematicComponentWithBox(params)\n}\n","import type { SchematicDebugObject } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromSchDebugObject(\n debugObject: SchematicDebugObject,\n transform: Matrix,\n): SvgObject[] {\n if (debugObject.shape === \"rect\") {\n // Transform all corners\n let [screenLeft, screenTop] = applyToPoint(transform, [\n debugObject.center.x - debugObject.size.width / 2,\n debugObject.center.y - debugObject.size.height / 2,\n ])\n let [screenRight, screenBottom] = applyToPoint(transform, [\n debugObject.center.x + debugObject.size.width / 2,\n debugObject.center.y + debugObject.size.height / 2,\n ])\n ;[screenTop, screenBottom] = [\n Math.min(screenTop, screenBottom),\n Math.max(screenTop, screenBottom),\n ]\n\n // Calculate screen width and height\n const width = Math.abs(screenRight - screenLeft)\n const height = Math.abs(screenBottom - screenTop)\n\n const [screenCenterX, screenCenterY] = applyToPoint(transform, [\n debugObject.center.x,\n debugObject.center.y,\n ])\n\n return [\n {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenLeft.toString(),\n y: screenTop.toString(),\n width: width.toString(),\n height: height.toString(),\n fill: \"none\",\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenCenterX.toString(),\n y: (screenCenterY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n if (debugObject.shape === \"line\") {\n // Transform start and end points - flip Y coordinates\n const [screenStartX, screenStartY] = applyToPoint(transform, [\n debugObject.start.x,\n debugObject.start.y,\n ])\n const [screenEndX, screenEndY] = applyToPoint(transform, [\n debugObject.end.x,\n debugObject.end.y,\n ])\n\n // Calculate midpoint for label\n const screenMidX = (screenStartX + screenEndX) / 2\n const screenMidY = (screenStartY + screenEndY) / 2\n\n return [\n {\n name: \"line\",\n type: \"element\",\n value: \"\",\n attributes: {\n x1: screenStartX.toString(),\n y1: screenStartY.toString(),\n x2: screenEndX.toString(),\n y2: screenEndY.toString(),\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenMidX.toString(),\n y: (screenMidY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n return []\n}\n","import type { SchematicTrace } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSchematicTrace(\n trace: SchematicTrace,\n transform: Matrix,\n): SvgObject[] {\n const edges = trace.edges\n if (edges.length === 0) return []\n const svgObjects: SvgObject[] = []\n\n let path = \"\"\n\n // Process edges into an SVG path\n for (let edgeIndex = 0; edgeIndex < edges.length; edgeIndex++) {\n const edge = edges[edgeIndex]!\n\n if (edge.is_crossing) continue\n\n // Transform the points using the matrix\n const [screenFromX, screenFromY] = applyToPoint(transform, [\n edge.from.x,\n edge.from.y,\n ])\n const [screenToX, screenToY] = applyToPoint(transform, [\n edge.to.x,\n edge.to.y,\n ])\n\n // Regular straight line for non-crossing traces\n if (edgeIndex === 0 || edges[edgeIndex - 1]?.is_crossing) {\n path += `M ${screenFromX} ${screenFromY} L ${screenToX} ${screenToY}`\n } else {\n path += ` L ${screenToX} ${screenToY}`\n }\n }\n\n // Process wire crossings with little \"hops\" or arcs\n for (const edge of edges) {\n if (!edge.is_crossing) continue\n\n // Transform the points using the matrix\n const [screenFromX, screenFromY] = applyToPoint(transform, [\n edge.from.x,\n edge.from.y,\n ])\n const [screenToX, screenToY] = applyToPoint(transform, [\n edge.to.x,\n edge.to.y,\n ])\n // For crossing traces, create a small arc/hop\n const midX = (screenFromX + screenToX) / 2\n const midY = (screenFromY + screenToY) / 2\n\n // Calculate perpendicular offset for the arc\n const dx = screenToX - screenFromX\n const dy = screenToY - screenFromY\n const len = Math.sqrt(dx * dx + dy * dy)\n const hopHeight = len * 0.7\n\n // Perpendicular vector\n const perpX = (-dy / len) * hopHeight\n const perpY = (dx / len) * hopHeight\n\n // Control point for the quadratic curve\n const controlX = midX + perpX\n const controlY = midY - Math.abs(perpY)\n\n // Arc Shadow\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M ${screenFromX} ${screenFromY} Q ${controlX} ${controlY} ${screenToX} ${screenToY}`,\n stroke: colorMap.schematic.background,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform) + 1.5}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M ${screenFromX} ${screenFromY} Q ${controlX} ${controlY} ${screenToX} ${screenToY}`,\n stroke: colorMap.schematic.wire,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n }\n\n if (path) {\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"trace\",\n d: path,\n stroke: colorMap.schematic.wire,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n }\n\n // Add junction circles\n if (trace.junctions) {\n for (const junction of trace.junctions) {\n const [screenX, screenY] = applyToPoint(transform, [\n junction.x,\n junction.y,\n ])\n svgObjects.push({\n name: \"circle\",\n type: \"element\",\n attributes: {\n cx: screenX.toString(),\n cy: screenY.toString(),\n r: (Math.abs(transform.a) * 0.03).toString(),\n fill: colorMap.schematic.junction,\n },\n value: \"\",\n children: [],\n })\n }\n }\n\n return svgObjects\n}\n","import type { AnyCircuitElement, SchematicNetLabel } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport {\n getSchMmFontSize,\n getSchScreenFontSize,\n} from \"lib/utils/get-sch-font-size\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { getUnitVectorFromEdgeToOutside } from \"lib/utils/get-unit-vector-from-edge-to-outside\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport {\n applyToPoint,\n compose,\n rotate,\n scale,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport { estimateTextWidth } from \"../estimate-text-width\"\n\n/**\n * Arrow point width as a fraction of font size (Font Size Ratio)\n */\nconst ARROW_POINT_WIDTH_FSR = 0.3\n\n/**\n * End padding as a fraction of font size (Font Size Ratio)\n */\nconst END_PADDING_FSR = 0.3\nconst END_PADDING_EXTRA_PER_CHARACTER_FSR = 0.06\n\nexport const createSvgObjectsForSchNetLabel = (\n schNetLabel: SchematicNetLabel,\n realToScreenTransform: Matrix,\n): SvgObject[] => {\n if (!schNetLabel.text) return []\n const svgObjects: SvgObject[] = []\n\n const fontSizePx = getSchScreenFontSize(realToScreenTransform, \"net_label\")\n const fontSizeMm = getSchMmFontSize(\"net_label\")\n const textWidthFSR = estimateTextWidth(schNetLabel.text || \"\")\n\n // Transform the center position to screen coordinates\n const screenCenter = applyToPoint(realToScreenTransform, schNetLabel.center)\n\n const realTextGrowthVec = getUnitVectorFromOutsideToEdge(\n schNetLabel.anchor_side,\n )\n\n const screenTextGrowthVec = { ...realTextGrowthVec }\n screenTextGrowthVec.y *= -1 // Invert y direction because anchor_side is pre-transform\n\n const fullWidthFsr =\n textWidthFSR +\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n END_PADDING_FSR\n const screenAnchorPosition = schNetLabel.anchor_position\n ? applyToPoint(realToScreenTransform, schNetLabel.anchor_position)\n : {\n x:\n screenCenter.x -\n (screenTextGrowthVec.x * fullWidthFsr * fontSizePx) / 2,\n y:\n screenCenter.y -\n (screenTextGrowthVec.y * fullWidthFsr * fontSizePx) / 2,\n }\n const realAnchorPosition = schNetLabel.anchor_position ?? {\n x:\n schNetLabel.center.x -\n (realTextGrowthVec.x * fullWidthFsr * fontSizeMm) / 2,\n y:\n schNetLabel.center.y -\n (realTextGrowthVec.y * fullWidthFsr * fontSizeMm) / 2,\n }\n\n // Get rotation angle based on anchor_side\n const pathRotation = {\n left: 0,\n top: -90,\n bottom: 90,\n right: 180,\n }[schNetLabel.anchor_side]\n\n // Calculate the points for the outline\n const screenOutlinePoints: Array<{ x: number; y: number }> = [\n // Arrow point in font-relative coordinates\n {\n x: 0,\n y: 0,\n },\n // Top left corner in font-relative coordinates\n {\n x: ARROW_POINT_WIDTH_FSR,\n y: 0.6,\n },\n // Top right corner in font-relative coordinates\n {\n x:\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_FSR +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n textWidthFSR,\n y: 0.6,\n },\n // Bottom right corner in font-relative coordinates\n {\n x:\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_FSR +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n textWidthFSR,\n y: -0.6,\n },\n // Bottom left corner in font-relative coordinates\n {\n x: ARROW_POINT_WIDTH_FSR,\n y: -0.6,\n },\n ].map((fontRelativePoint) =>\n applyToPoint(\n compose(\n realToScreenTransform,\n translate(realAnchorPosition.x, realAnchorPosition.y),\n scale(fontSizeMm),\n rotate((pathRotation / 180) * Math.PI),\n ),\n fontRelativePoint,\n ),\n )\n\n // Create the label path\n const pathD = `\n M ${screenOutlinePoints[0]!.x},${screenOutlinePoints[0]!.y}\n L ${screenOutlinePoints[1]!.x},${screenOutlinePoints[1]!.y}\n L ${screenOutlinePoints[2]!.x},${screenOutlinePoints[2]!.y}\n L ${screenOutlinePoints[3]!.x},${screenOutlinePoints[3]!.y}\n L ${screenOutlinePoints[4]!.x},${screenOutlinePoints[4]!.y}\n Z\n `\n\n // Add the label container path\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"net-label\",\n d: pathD,\n fill: \"white\",\n stroke: colorMap.schematic.label_global,\n \"stroke-width\": `${getSchStrokeSize(realToScreenTransform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n const screenTextPos = {\n x: screenAnchorPosition.x + screenTextGrowthVec.x * fontSizePx * 0.5,\n y: screenAnchorPosition.y + screenTextGrowthVec.y * fontSizePx * 0.5,\n }\n\n const textAnchor = {\n left: \"start\",\n top: \"start\",\n bottom: \"start\",\n right: \"end\",\n }[schNetLabel.anchor_side]\n\n const textTransformString = {\n left: \"\",\n right: \"\",\n top: `rotate(90 ${screenTextPos.x} ${screenTextPos.y})`,\n bottom: `rotate(-90 ${screenTextPos.x} ${screenTextPos.y})`,\n }[schNetLabel.anchor_side]\n\n // Add the label text\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"net-label-text\",\n x: screenTextPos.x.toString(),\n y: screenTextPos.y.toString(),\n fill: colorMap.schematic.label_global,\n \"text-anchor\": textAnchor,\n \"dominant-baseline\": \"central\",\n \"font-family\": \"sans-serif\",\n \"font-variant-numeric\": \"tabular-nums\",\n \"font-size\": `${fontSizePx}px`,\n transform: textTransformString,\n },\n children: [\n {\n type: \"text\",\n value: schNetLabel.text || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","// https://claude.ai/share/5e327d90-627f-48d5-9a51-ba6117479007\nexport const arialTextMetrics = {\n \"0\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"1\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -3,\n right: 9,\n },\n \"2\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"3\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"4\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n \"5\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"6\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"7\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"8\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"9\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \" \": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 0,\n },\n \"!\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n '\"': {\n width: 9,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"#\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 13,\n },\n $: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"%\": {\n width: 21,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 20,\n },\n \"&\": {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 15,\n },\n \"'\": {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 3,\n },\n \"(\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \")\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"*\": {\n width: 9,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 8,\n },\n \"+\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \",\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"-\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \".\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"/\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 7,\n },\n \":\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \";\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"<\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \"=\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \">\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \"?\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"@\": {\n width: 24,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 23,\n },\n A: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n B: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n C: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 16,\n },\n D: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 16,\n },\n E: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n F: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 14,\n },\n G: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 17,\n },\n H: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n I: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n J: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 10,\n },\n K: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 16,\n },\n L: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n M: {\n width: 20,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 18,\n },\n N: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n O: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 18,\n },\n P: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n Q: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 18,\n },\n R: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 17,\n },\n S: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 15,\n },\n T: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 14,\n },\n U: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n V: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n W: {\n width: 23,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 22,\n },\n X: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n Y: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n Z: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 14,\n },\n \"[\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 6,\n },\n \"\\\\\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 7,\n },\n \"]\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 5,\n },\n \"^\": {\n width: 11,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 11,\n },\n _: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 14,\n },\n \"`\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 5,\n },\n a: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n b: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n c: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n d: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n e: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n f: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 8,\n },\n g: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n h: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n i: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n j: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 1,\n right: 4,\n },\n k: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n l: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n m: {\n width: 20,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 18,\n },\n n: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n o: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n p: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n q: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n r: {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 8,\n },\n s: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 11,\n },\n t: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 6,\n },\n u: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n v: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n w: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 17,\n },\n x: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n y: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n z: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 11,\n },\n \"{\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"|\": {\n width: 6,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n \"}\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"~\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n}\n","import { arialTextMetrics } from \"./arial-text-metrics\"\n\nexport const estimateTextWidth = (text: string): number => {\n if (!text) return 0\n\n let totalWidth = 0\n for (const char of text) {\n const metrics = arialTextMetrics[char as keyof typeof arialTextMetrics]\n if (metrics) {\n totalWidth += metrics.width\n } else {\n // Default width for unknown characters\n totalWidth += arialTextMetrics[\"?\"].width\n }\n }\n\n // Return width normalized to font size 1\n return totalWidth / 27 // Normalize by font height from metrics\n}\n"],"mappings":"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","names":["applyToPoint","compose","translate","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","rotate","translate","matrixToString","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","translate","applyToPoint","stringify","applyToPoint","applyToPoint","applyToPoint","compose","compose","scale","translate","applyToPoint","compose","su","applyToPoint","applyToPoint","su","su","applyToPoint","applyToPoint","applyToPoint","su","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","rotate","scale","translate","applyToPoint","compose","translate","scale","rotate","stringify"]}
|
|
1
|
+
{"version":3,"sources":["../lib/pcb/convert-circuit-json-to-pcb-svg.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-trace-error.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-plated-hole.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-text.ts","../lib/utils/pairs.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-trace.ts","../lib/pcb/layer-name-to-color.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-smt-pads.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-board.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-via.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-hole.ts","../lib/pcb/colors.ts","../lib/utils/colors.ts","../lib/sch/convert-circuit-json-to-schematic-svg.ts","../lib/sch/draw-schematic-grid.ts","../lib/sch/draw-schematic-labeled-points.ts","../lib/sch/get-schematic-bounds-from-circuit-json.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component-with-symbol.ts","../lib/utils/get-sch-stroke-size.ts","../lib/utils/match-sch-ports-with-symbol-ports.ts","../lib/utils/point-pairs-to-matrix.ts","../lib/utils/get-sch-font-size.ts","../lib/sch/svg-object-fns/create-svg-error-text.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component-with-box.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-port-on-box.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-box-line.ts","../lib/utils/get-unit-vector-from-outside-to-edge.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-number-text.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-port-pin-label.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-debug-object.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-trace.ts","../lib/sch/svg-object-fns/create-svg-objects-for-sch-net-label.ts","../lib/sch/arial-text-metrics.ts","../lib/sch/estimate-text-width.ts"],"sourcesContent":["import type { Point, AnyCircuitElement } from \"circuit-json\"\nimport { type INode as SvgObject, stringify } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n scale,\n translate,\n} from \"transformation-matrix\"\nimport { createSvgObjectsFromPcbTraceError } from \"./svg-object-fns/create-svg-objects-from-pcb-trace-error\"\nimport { createSvgObjectsFromPcbFabricationNotePath } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path\"\nimport { createSvgObjectsFromPcbFabricationNoteText } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text\"\nimport { createSvgObjectsFromPcbPlatedHole } from \"./svg-object-fns/create-svg-objects-from-pcb-plated-hole\"\nimport { createSvgObjectsFromPcbSilkscreenPath } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-path\"\nimport { createSvgObjectsFromPcbSilkscreenText } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-text\"\nimport { createSvgObjectsFromPcbTrace } from \"./svg-object-fns/create-svg-objects-from-pcb-trace\"\nimport { createSvgObjectsFromSmtPad } from \"./svg-object-fns/create-svg-objects-from-smt-pads\"\nimport { createSvgObjectsFromPcbBoard } from \"./svg-object-fns/create-svg-objects-from-pcb-board\"\nimport { createSvgObjectsFromPcbVia } from \"./svg-object-fns/create-svg-objects-from-pcb-via\"\nimport { createSvgObjectsFromPcbHole } from \"./svg-object-fns/create-svg-objects-from-pcb-hole\"\n\nconst OBJECT_ORDER: AnyCircuitElement[\"type\"][] = [\n \"pcb_trace_error\",\n \"pcb_plated_hole\",\n \"pcb_fabrication_note_text\",\n \"pcb_fabrication_note_path\",\n \"pcb_silkscreen_text\",\n \"pcb_silkscreen_path\",\n \"pcb_via\",\n \"pcb_trace\",\n \"pcb_smtpad\",\n \"pcb_component\",\n \"pcb_board\",\n]\n\ninterface PointObjectNotation {\n x: number\n y: number\n}\n\ninterface Options {\n width?: number\n height?: number\n shouldDrawErrors?: boolean\n}\n\nexport function convertCircuitJsonToPcbSvg(\n soup: AnyCircuitElement[],\n options?: Options,\n): string {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n // Process all elements to determine bounds\n for (const item of soup) {\n if (item.type === \"pcb_board\") {\n if (\n item.outline &&\n Array.isArray(item.outline) &&\n item.outline.length >= 3\n )\n updateBoundsToIncludeOutline(item.outline)\n else if (\"center\" in item && \"width\" in item && \"height\" in item)\n updateBounds(item.center, item.width, item.height)\n } else if (\"x\" in item && \"y\" in item) {\n updateBounds({ x: item.x, y: item.y }, 0, 0)\n } else if (\"route\" in item) {\n updateTraceBounds(item.route)\n }\n }\n\n const padding = 1 // Reduced padding for tighter boundary\n const circuitWidth = maxX - minX + 2 * padding\n const circuitHeight = maxY - minY + 2 * padding\n\n const svgWidth = options?.width ?? 800\n const svgHeight = options?.height ?? 600\n const paths: PointObjectNotation[][] = []\n for (const item of soup) {\n if (\"route\" in item && item.route !== undefined) {\n paths.push(item.route as PointObjectNotation[])\n }\n }\n\n // Calculate scale factor to fit the circuit within the SVG, maintaining aspect ratio\n const scaleX = svgWidth / circuitWidth\n const scaleY = svgHeight / circuitHeight\n const scaleFactor = Math.min(scaleX, scaleY)\n\n // Calculate centering offsets\n const offsetX = (svgWidth - circuitWidth * scaleFactor) / 2\n const offsetY = (svgHeight - circuitHeight * scaleFactor) / 2\n\n const transform = compose(\n translate(\n offsetX - minX * scaleFactor + padding * scaleFactor,\n svgHeight - offsetY + minY * scaleFactor - padding * scaleFactor,\n ),\n scale(scaleFactor, -scaleFactor), // Flip in y-direction\n )\n\n const svgObjects = soup\n .sort(\n (a, b) =>\n (OBJECT_ORDER.indexOf(b.type) ?? 9999) -\n (OBJECT_ORDER.indexOf(a.type) ?? 9999),\n )\n .flatMap((item) =>\n createSvgObjects(item, transform, soup, options?.shouldDrawErrors),\n )\n\n let strokeWidth = String(0.05 * scaleFactor)\n\n for (const element of soup) {\n if (\"stroke_width\" in element) {\n strokeWidth = String(scaleFactor * element.stroke_width)\n break\n }\n }\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n value: \"\",\n children: [\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n value: `\n .boundary { fill: #000; }\n .pcb-board { fill: none; }\n .pcb-trace { fill: none; }\n .pcb-hole-outer { fill: rgb(200, 52, 52); }\n .pcb-hole-inner { fill: rgb(255, 38, 226); }\n .pcb-pad { }\n .pcb-boundary { fill: none; stroke: #fff; stroke-width: 0.3; }\n .pcb-silkscreen { fill: none; }\n .pcb-silkscreen-top { stroke: #f2eda1; }\n .pcb-silkscreen-bottom { stroke: #f2eda1; }\n .pcb-silkscreen-text { fill: #f2eda1; }\n `,\n },\n ],\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n },\n createSvgObjectFromPcbBoundary(transform, minX, minY, maxX, maxY),\n ...svgObjects,\n ].filter((child): child is SvgObject => child !== null),\n }\n\n try {\n return stringify(svgObject as SvgObject)\n } catch (error) {\n console.error(\"Error stringifying SVG object:\", error)\n throw error\n }\n\n function updateBounds(center: any, width: any, height: any) {\n const halfWidth = width / 2\n const halfHeight = height / 2\n minX = Math.min(minX, center.x - halfWidth)\n minY = Math.min(minY, center.y - halfHeight)\n maxX = Math.max(maxX, center.x + halfWidth)\n maxY = Math.max(maxY, center.y + halfHeight)\n }\n\n function updateBoundsToIncludeOutline(outline: Point[]) {\n for (const point of outline) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n\n function updateTraceBounds(route: any[]) {\n for (const point of route) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n}\n\nfunction createSvgObjects(\n elm: AnyCircuitElement,\n transform: Matrix,\n soup: AnyCircuitElement[],\n shouldDrawErrors?: boolean,\n): SvgObject[] {\n switch (elm.type) {\n case \"pcb_trace_error\":\n return createSvgObjectsFromPcbTraceError(\n elm,\n transform,\n soup,\n shouldDrawErrors,\n ).filter(Boolean)\n case \"pcb_component\":\n return [createSvgObjectsFromPcbComponent(elm, transform)].filter(Boolean)\n case \"pcb_trace\":\n return createSvgObjectsFromPcbTrace(elm, transform)\n case \"pcb_plated_hole\":\n return createSvgObjectsFromPcbPlatedHole(elm, transform).filter(Boolean)\n case \"pcb_hole\":\n return createSvgObjectsFromPcbHole(elm, transform)\n case \"pcb_smtpad\":\n return createSvgObjectsFromSmtPad(elm, transform)\n case \"pcb_silkscreen_text\":\n return createSvgObjectsFromPcbSilkscreenText(elm, transform)\n case \"pcb_fabrication_note_path\":\n return createSvgObjectsFromPcbFabricationNotePath(elm, transform)\n case \"pcb_fabrication_note_text\":\n return createSvgObjectsFromPcbFabricationNoteText(elm, transform)\n case \"pcb_silkscreen_path\":\n return createSvgObjectsFromPcbSilkscreenPath(elm, transform)\n case \"pcb_board\":\n return createSvgObjectsFromPcbBoard(elm, transform)\n case \"pcb_via\":\n return createSvgObjectsFromPcbVia(elm, transform)\n default:\n return []\n }\n}\n\nfunction createSvgObjectsFromPcbComponent(component: any, transform: any): any {\n const { center, width, height, rotation = 0 } = component\n const [x, y] = applyToPoint(transform, [center.x, center.y])\n const scaledWidth = width * Math.abs(transform.a)\n const scaledHeight = height * Math.abs(transform.d)\n const transformStr = `translate(${x}, ${y}) rotate(${-rotation}) scale(1, -1)`\n\n return {\n name: \"g\",\n type: \"element\",\n attributes: { transform: transformStr },\n children: [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component-outline\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n ],\n }\n}\n\nfunction createSvgObjectFromPcbBoundary(\n transform: any,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n): SvgObject {\n const [x1, y1] = applyToPoint(transform, [minX, minY])\n const [x2, y2] = applyToPoint(transform, [maxX, maxY])\n const width = Math.abs(x2 - x1)\n const height = Math.abs(y2 - y1)\n const x = Math.min(x1, x2)\n const y = Math.min(y1, y2)\n return {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-boundary\",\n x: x.toString(),\n y: y.toString(),\n width: width.toString(),\n height: height.toString(),\n },\n }\n}\n\n/**\n * @deprecated use `convertCircuitJsonToPcbSvg` instead\n */\nexport const circuitJsonToPcbSvg = convertCircuitJsonToPcbSvg\n","import type { PcbTraceError, PcbPort, AnyCircuitElement } from \"circuit-json\"\nimport type { SvgObject } from \"../../../lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbTraceError(\n pcbTraceError: PcbTraceError,\n transform: Matrix,\n circuitJson: AnyCircuitElement[],\n shouldDrawErrors?: boolean,\n): SvgObject[] {\n if (!shouldDrawErrors) return []\n const { pcb_port_ids } = pcbTraceError\n\n const port1 = circuitJson.find(\n (el): el is PcbPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[0],\n )\n const port2 = circuitJson.find(\n (el): el is PcbPort =>\n el.type === \"pcb_port\" && el.pcb_port_id === pcb_port_ids?.[1],\n )\n\n if (!port1 || !port2) return []\n\n const screenPort1 = applyToPoint(transform, {\n x: port1.x,\n y: port1.y,\n })\n const screenPort2 = applyToPoint(transform, {\n x: port2.x,\n y: port2.y,\n })\n\n const errorCenter = {\n x: (screenPort1.x + screenPort2.x) / 2,\n y: (screenPort1.y + screenPort2.y) / 2,\n }\n\n if (\n isNaN(screenPort1.x) ||\n isNaN(screenPort1.y) ||\n isNaN(screenPort2.x) ||\n isNaN(screenPort2.y) ||\n isNaN(errorCenter.x) ||\n isNaN(errorCenter.y)\n ) {\n return []\n }\n\n const svgObjects: SvgObject[] = [\n {\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: screenPort1.x.toString(),\n y1: screenPort1.y.toString(),\n x2: errorCenter.x.toString(),\n y2: errorCenter.y.toString(),\n stroke: \"red\",\n \"stroke-width\": \"1.5\",\n \"stroke-dasharray\": \"2,2\",\n },\n children: [],\n value: \"\",\n },\n {\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: errorCenter.x.toString(),\n y1: errorCenter.y.toString(),\n x2: screenPort2.x.toString(),\n y2: screenPort2.y.toString(),\n stroke: \"red\",\n \"stroke-width\": \"1.5\",\n \"stroke-dasharray\": \"2,2\",\n },\n children: [],\n value: \"\",\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n x: (errorCenter.x - 5).toString(),\n y: (errorCenter.y - 5).toString(),\n width: \"10\",\n height: \"10\",\n fill: \"red\",\n transform: `rotate(45 ${errorCenter.x} ${errorCenter.y})`,\n },\n children: [],\n value: \"\",\n },\n {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: errorCenter.x.toString(),\n y: (errorCenter.y - 15).toString(),\n fill: \"red\",\n \"font-family\": \"sans-serif\",\n \"font-size\": \"12\",\n \"text-anchor\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: pcbTraceError.message || \"Pcb Trace Error\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n },\n ]\n\n return svgObjects\n}\n","import type { PcbSilkscreenPath, PcbFabricationNotePath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbFabricationNotePath(\n fabNotePath: PcbFabricationNotePath,\n transform: Matrix,\n): SvgObject[] {\n if (!fabNotePath.route || !Array.isArray(fabNotePath.route)) return []\n\n // Close the path if the first and last points are the same\n const firstPoint = fabNotePath.route[0]\n const lastPoint = fabNotePath.route[fabNotePath.route.length - 1]\n const isClosed =\n firstPoint!.x === lastPoint!.x && firstPoint!.y === lastPoint!.y\n\n const path =\n fabNotePath.route\n .slice(0, isClosed ? -1 : undefined)\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \") + (isClosed ? \" Z\" : \"\")\n\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-fabrication-note-path\",\n stroke: fabNotePath.color || \"rgba(255,255,255,0.5)\",\n fill: \"none\",\n d: path,\n \"stroke-width\": (\n fabNotePath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": fabNotePath.pcb_component_id,\n \"data-pcb-fabrication-note-path-id\":\n fabNotePath.pcb_fabrication_note_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbFabricationNoteText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { toString as matrixToString } from \"transformation-matrix\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbFabricationNoteText(\n pcbFabNoteText: PcbFabricationNoteText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n anchor_alignment,\n text,\n font_size = 1,\n layer = \"top\",\n color,\n } = pcbFabNoteText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY), // TODO do anchor_alignment\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: \"pcb-fabrication-note-text\",\n fill: color || \"rgba(255,255,255,0.5)\",\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","import type { PCBPlatedHole } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbPlatedHole(\n hole: PCBPlatedHole,\n transform: any,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.shape === \"pill\") {\n const scaledOuterWidth = hole.outer_width * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_height * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_height * Math.abs(transform.a)\n\n const outerRadiusX = scaledOuterWidth / 2\n const outerRadiusY = scaledOuterHeight / 2\n const innerRadiusX = scaledHoleWidth / 2\n const innerRadiusY = scaledHoleHeight / 2\n const straightLength = scaledOuterHeight - scaledOuterWidth\n\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n // Outer pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n d:\n `M${x - outerRadiusX},${y - straightLength / 2} ` +\n `v${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 ${scaledOuterWidth},0 ` +\n `v-${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 -${scaledOuterWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n // Inner pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n d:\n `M${x - innerRadiusX},${y - (scaledHoleHeight - scaledHoleWidth) / 2} ` +\n `v${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 ${scaledHoleWidth},0 ` +\n `v-${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 -${scaledHoleWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n // Fallback to circular hole if not pill-shaped\n if (hole.shape === \"circle\") {\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n return []\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbSilkscreenPath(\n silkscreenPath: PcbSilkscreenPath,\n transform: Matrix,\n): SvgObject[] {\n if (!silkscreenPath.route || !Array.isArray(silkscreenPath.route)) return []\n\n let path = silkscreenPath.route\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n\n // Close the path if the first and last points match\n const firstPoint = silkscreenPath.route[0]\n const lastPoint = silkscreenPath.route[silkscreenPath.route.length - 1]\n if (\n firstPoint &&\n lastPoint &&\n firstPoint.x === lastPoint.x &&\n firstPoint.y === lastPoint.y\n ) {\n path += \" Z\"\n }\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: `pcb-silkscreen pcb-silkscreen-${silkscreenPath.layer}`,\n d: path,\n \"stroke-width\": (\n silkscreenPath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": silkscreenPath.pcb_component_id,\n \"data-pcb-silkscreen-path-id\": silkscreenPath.pcb_silkscreen_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n toString as matrixToString,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbSilkscreenText(\n pcbSilkscreenText: PcbSilkscreenText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n text,\n font_size = 1,\n layer = \"top\",\n } = pcbSilkscreenText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY),\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: `pcb-silkscreen-text pcb-silkscreen-${layer}`,\n \"data-pcb-silkscreen-text-id\": pcbSilkscreenText.pcb_component_id,\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","/**\n * Return pairs of adjacent elements in an array.\n */\nexport function pairs<T>(arr: Array<T>): Array<[T, T]> {\n const result: Array<[T, T]> = []\n for (let i = 0; i < arr.length - 1; i++) {\n result.push([arr[i]!, arr[i + 1]!])\n }\n return result\n}\n","import type { PCBTrace } from \"circuit-json\"\nimport { pairs } from \"lib/utils/pairs\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { LAYER_NAME_TO_COLOR } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromPcbTrace(\n trace: PCBTrace,\n transform: Matrix,\n): SvgObject[] {\n if (!trace.route || !Array.isArray(trace.route) || trace.route.length < 2)\n return []\n\n const segments = pairs(trace.route)\n const svgObjects: SvgObject[] = []\n\n for (const [start, end] of segments) {\n const startPoint = applyToPoint(transform, [start.x, start.y])\n const endPoint = applyToPoint(transform, [end.x, end.y])\n\n const layer =\n \"layer\" in start ? start.layer : \"layer\" in end ? end.layer : null\n if (!layer) continue\n\n const layerColor =\n LAYER_NAME_TO_COLOR[layer as keyof typeof LAYER_NAME_TO_COLOR] ?? \"white\"\n\n const traceWidth =\n \"width\" in start ? start.width : \"width\" in end ? end.width : null\n\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-trace\",\n stroke: layerColor,\n d: `M ${startPoint[0]} ${startPoint[1]} L ${endPoint[0]} ${endPoint[1]}`,\n \"stroke-width\": traceWidth\n ? (traceWidth * Math.abs(transform.a)).toString()\n : \"0.3\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"shape-rendering\": \"crispEdges\",\n },\n })\n }\n return svgObjects\n}\n","/**\n * TODO use @tscircuit/pcb-colors when it's published\n */\nexport const LAYER_NAME_TO_COLOR = {\n top: \"rgb(200, 52, 52)\",\n bottom: \"rgb(77, 127, 196)\",\n}\n\nexport function layerNameToColor(layerName: string) {\n return (\n LAYER_NAME_TO_COLOR[layerName as keyof typeof LAYER_NAME_TO_COLOR] ??\n \"white\"\n )\n}\n","import type { PCBSMTPad } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { layerNameToColor } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromSmtPad(\n pad: PCBSMTPad,\n transform: Matrix,\n): any {\n const [x, y] = applyToPoint(transform, [pad.x, pad.y])\n\n if (pad.shape === \"rect\") {\n const width = pad.width * Math.abs(transform.a)\n const height = pad.height * Math.abs(transform.d)\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-pad\",\n fill: layerNameToColor(pad.layer),\n x: (x - width / 2).toString(),\n y: (y - height / 2).toString(),\n width: width.toString(),\n height: height.toString(),\n },\n },\n ]\n }\n // TODO implement smtpad circles/ovals etc.\n return []\n}\n","import type { PCBBoard, Point } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbBoard(\n pcbBoard: PCBBoard,\n transform: Matrix,\n): SvgObject[] {\n const { width, height, center, outline } = pcbBoard\n\n let path: string\n if (outline && Array.isArray(outline) && outline.length >= 3) {\n path = outline\n .map((point: Point, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n } else {\n const halfWidth = width / 2\n const halfHeight = height / 2\n\n const topLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y - halfHeight,\n ])\n const topRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y - halfHeight,\n ])\n const bottomRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y + halfHeight,\n ])\n const bottomLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y + halfHeight,\n ])\n\n path =\n `M ${topLeft[0]} ${topLeft[1]} ` +\n `L ${topRight[0]} ${topRight[1]} ` +\n `L ${bottomRight[0]} ${bottomRight[1]} ` +\n `L ${bottomLeft[0]} ${bottomLeft[1]}`\n }\n\n path += \" Z\"\n\n return [\n {\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-board\",\n d: path,\n stroke: \"rgba(255, 255, 255, 0.5)\",\n \"stroke-width\": (0.1 * Math.abs(transform.a)).toString(),\n },\n },\n ]\n}\n","import type { PCBVia } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbVia(hole: PCBVia, transform: any): any {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n },\n ],\n }\n}\n","import type { PCBHole } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { HOLE_COLOR } from \"../colors\"\n\nexport function createSvgObjectsFromPcbHole(\n hole: PCBHole,\n transform: Matrix,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.hole_shape === \"circle\" || hole.hole_shape === \"square\") {\n const scaledDiameter = hole.hole_diameter * Math.abs(transform.a)\n const radius = scaledDiameter / 2\n\n if (hole.hole_shape === \"circle\") {\n return [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n r: radius.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n // Square hole\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n x: (x - radius).toString(),\n y: (y - radius).toString(),\n width: scaledDiameter.toString(),\n height: scaledDiameter.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n if (hole.hole_shape === \"oval\") {\n const scaledWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHeight = hole.hole_height * Math.abs(transform.a)\n const rx = scaledWidth / 2\n const ry = scaledHeight / 2\n\n return [\n {\n name: \"ellipse\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n rx: rx.toString(),\n ry: ry.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n\n return []\n}\n","export const HOLE_COLOR = \"#FF26E2\"\n","// Kicad-2020 color scheme\nexport const colorMap = {\n \"3d_viewer\": {\n background_bottom: \"rgb(102, 102, 128)\",\n background_top: \"rgb(204, 204, 230)\",\n board: \"rgb(51, 43, 23)\",\n copper: \"rgb(179, 156, 0)\",\n silkscreen_bottom: \"rgb(230, 230, 230)\",\n silkscreen_top: \"rgb(230, 230, 230)\",\n soldermask: \"rgb(20, 51, 36)\",\n solderpaste: \"rgb(128, 128, 128)\",\n },\n board: {\n anchor: \"rgb(255, 38, 226)\",\n aux_items: \"rgb(255, 255, 255)\",\n b_adhes: \"rgb(0, 0, 132)\",\n b_crtyd: \"rgb(255, 38, 226)\",\n b_fab: \"rgb(88, 93, 132)\",\n b_mask: \"rgba(2, 255, 238, 0.400)\",\n b_paste: \"rgb(0, 194, 194)\",\n b_silks: \"rgb(232, 178, 167)\",\n background: \"rgb(0, 16, 35)\",\n cmts_user: \"rgb(89, 148, 220)\",\n copper: {\n b: \"rgb(77, 127, 196)\",\n f: \"rgb(200, 52, 52)\",\n in1: \"rgb(127, 200, 127)\",\n in10: \"rgb(237, 124, 51)\",\n in11: \"rgb(91, 195, 235)\",\n in12: \"rgb(247, 111, 142)\",\n in13: \"rgb(167, 165, 198)\",\n in14: \"rgb(40, 204, 217)\",\n in15: \"rgb(232, 178, 167)\",\n in16: \"rgb(242, 237, 161)\",\n in17: \"rgb(237, 124, 51)\",\n in18: \"rgb(91, 195, 235)\",\n in19: \"rgb(247, 111, 142)\",\n in2: \"rgb(206, 125, 44)\",\n in20: \"rgb(167, 165, 198)\",\n in21: \"rgb(40, 204, 217)\",\n in22: \"rgb(232, 178, 167)\",\n in23: \"rgb(242, 237, 161)\",\n in24: \"rgb(237, 124, 51)\",\n in25: \"rgb(91, 195, 235)\",\n in26: \"rgb(247, 111, 142)\",\n in27: \"rgb(167, 165, 198)\",\n in28: \"rgb(40, 204, 217)\",\n in29: \"rgb(232, 178, 167)\",\n in3: \"rgb(79, 203, 203)\",\n in30: \"rgb(242, 237, 161)\",\n in4: \"rgb(219, 98, 139)\",\n in5: \"rgb(167, 165, 198)\",\n in6: \"rgb(40, 204, 217)\",\n in7: \"rgb(232, 178, 167)\",\n in8: \"rgb(242, 237, 161)\",\n in9: \"rgb(141, 203, 129)\",\n },\n cursor: \"rgb(255, 255, 255)\",\n drc: \"rgb(194, 194, 194)\",\n drc_error: \"rgba(215, 91, 107, 0.800)\",\n drc_exclusion: \"rgb(255, 255, 255)\",\n drc_warning: \"rgba(255, 208, 66, 0.902)\",\n dwgs_user: \"rgb(194, 194, 194)\",\n eco1_user: \"rgb(180, 219, 210)\",\n eco2_user: \"rgb(216, 200, 82)\",\n edge_cuts: \"rgb(208, 210, 205)\",\n f_adhes: \"rgb(132, 0, 132)\",\n f_crtyd: \"rgb(255, 0, 245)\",\n f_fab: \"rgb(175, 175, 175)\",\n f_mask: \"rgba(216, 100, 255, 0.400)\",\n f_paste: \"rgba(180, 160, 154, 0.902)\",\n f_silks: \"rgb(242, 237, 161)\",\n footprint_text_back: \"rgb(0, 0, 132)\",\n footprint_text_front: \"rgb(194, 194, 194)\",\n footprint_text_invisible: \"rgb(132, 132, 132)\",\n grid: \"rgb(132, 132, 132)\",\n grid_axes: \"rgb(194, 194, 194)\",\n margin: \"rgb(255, 38, 226)\",\n microvia: \"rgb(0, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n pad_back: \"rgb(77, 127, 196)\",\n pad_front: \"rgb(200, 52, 52)\",\n pad_plated_hole: \"rgb(194, 194, 0)\",\n pad_through_hole: \"rgb(227, 183, 46)\",\n plated_hole: \"rgb(26, 196, 210)\",\n ratsnest: \"rgba(245, 255, 213, 0.702)\",\n select_overlay: \"rgb(4, 255, 67)\",\n through_via: \"rgb(236, 236, 236)\",\n user_1: \"rgb(194, 194, 194)\",\n user_2: \"rgb(89, 148, 220)\",\n user_3: \"rgb(180, 219, 210)\",\n user_4: \"rgb(216, 200, 82)\",\n user_5: \"rgb(194, 194, 194)\",\n user_6: \"rgb(89, 148, 220)\",\n user_7: \"rgb(180, 219, 210)\",\n user_8: \"rgb(216, 200, 82)\",\n user_9: \"rgb(232, 178, 167)\",\n via_blind_buried: \"rgb(187, 151, 38)\",\n via_hole: \"rgb(227, 183, 46)\",\n via_micro: \"rgb(0, 132, 132)\",\n via_through: \"rgb(236, 236, 236)\",\n worksheet: \"rgb(200, 114, 171)\",\n },\n gerbview: {\n axes: \"rgb(0, 0, 132)\",\n background: \"rgb(0, 0, 0)\",\n dcodes: \"rgb(255, 255, 255)\",\n grid: \"rgb(132, 132, 132)\",\n layers: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n ],\n negative_objects: \"rgb(132, 132, 132)\",\n worksheet: \"rgb(0, 0, 132)\",\n },\n meta: {\n filename: \"kicad_2020\",\n name: \"KiCad 2020\",\n version: 2,\n },\n palette: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n ],\n schematic: {\n aux_items: \"rgb(46, 46, 46)\",\n background: \"rgb(245, 241, 237)\",\n brightened: \"rgb(255, 0, 255)\",\n bus: \"rgb(0, 0, 132)\",\n bus_junction: \"rgb(0, 0, 132)\",\n component_body: \"rgb(255, 255, 194)\",\n component_outline: \"rgb(132, 0, 0)\",\n cursor: \"rgb(15, 15, 15)\",\n erc_error: \"rgba(230, 9, 13, 0.800)\",\n erc_warning: \"rgba(209, 146, 0, 0.800)\",\n fields: \"rgb(132, 0, 132)\",\n grid: \"rgb(181, 181, 181)\",\n grid_axes: \"rgb(0, 0, 132)\",\n hidden: \"rgb(194, 194, 194)\",\n junction: \"rgb(0, 150, 0)\",\n label_global: \"rgb(132, 0, 0)\",\n label_hier: \"rgb(114, 86, 0)\",\n label_local: \"rgb(15, 15, 15)\",\n net_name: \"rgb(132, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n note: \"rgb(0, 0, 194)\",\n override_item_colors: false,\n pin: \"rgb(132, 0, 0)\",\n pin_name: \"rgb(0, 100, 100)\",\n pin_number: \"rgb(169, 0, 0)\",\n reference: \"rgb(0, 100, 100)\",\n shadow: \"rgba(102, 179, 255, 0.800)\",\n sheet: \"rgb(132, 0, 0)\",\n sheet_background: \"rgba(253, 255, 231, 0.000)\",\n sheet_fields: \"rgb(132, 0, 132)\",\n sheet_filename: \"rgb(114, 86, 0)\",\n sheet_label: \"rgb(0, 100, 100)\",\n sheet_name: \"rgb(0, 100, 100)\",\n value: \"rgb(0, 100, 100)\",\n wire: \"rgb(0, 150, 0)\",\n wire_crossing: \"rgb(30, 180, 30)\",\n worksheet: \"rgb(132, 0, 0)\",\n },\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { stringify } from \"svgson\"\nimport {\n applyToPoint,\n compose,\n scale,\n translate,\n fromTriangles,\n type Matrix,\n fromTwoMovingPoints,\n} from \"transformation-matrix\"\nimport { drawSchematicGrid } from \"./draw-schematic-grid\"\nimport { drawSchematicLabeledPoints } from \"./draw-schematic-labeled-points\"\nimport { getSchematicBoundsFromCircuitJson } from \"./get-schematic-bounds-from-circuit-json\"\nimport { createSvgObjectsFromSchematicComponent } from \"./svg-object-fns/create-svg-objects-from-sch-component\"\nimport { createSvgObjectsFromSchDebugObject } from \"./svg-object-fns/create-svg-objects-from-sch-debug-object\"\nimport { createSchematicTrace } from \"./svg-object-fns/create-svg-objects-from-sch-trace\"\nimport { createSvgObjectsForSchNetLabel } from \"./svg-object-fns/create-svg-objects-for-sch-net-label\"\n\ninterface Options {\n width?: number\n height?: number\n grid?: boolean | { cellSize?: number; labelCells?: boolean }\n labeledPoints?: Array<{ x: number; y: number; label: string }>\n}\n\nexport function convertCircuitJsonToSchematicSvg(\n circuitJson: AnyCircuitElement[],\n options?: Options,\n): string {\n // Get bounds with padding\n const realBounds = getSchematicBoundsFromCircuitJson(circuitJson)\n const realWidth = realBounds.maxX - realBounds.minX\n const realHeight = realBounds.maxY - realBounds.minY\n\n const svgWidth = options?.width ?? 1200\n const svgHeight = options?.height ?? 600\n\n // Compute the padding such that we maintain the same aspect ratio\n const circuitAspectRatio = realWidth / realHeight\n const containerAspectRatio = svgWidth / svgHeight\n\n let screenPaddingPx: { x: number; y: number }\n if (circuitAspectRatio > containerAspectRatio) {\n // Circuit is wider than container - fit to width\n const newHeight = svgWidth / circuitAspectRatio\n screenPaddingPx = {\n x: 0,\n y: (svgHeight - newHeight) / 2,\n }\n } else {\n // Circuit is taller than container - fit to height\n const newWidth = svgHeight * circuitAspectRatio\n screenPaddingPx = {\n x: (svgWidth - newWidth) / 2,\n y: 0,\n }\n }\n\n // Calculate projection using REAL points and SCREEN points\n // We're saying to map the real bounds to the screen bounds by giving 3 points\n // for each coordinate space\n const transform = fromTriangles(\n [\n { x: realBounds.minX, y: realBounds.maxY },\n { x: realBounds.maxX, y: realBounds.maxY },\n { x: realBounds.maxX, y: realBounds.minY },\n ],\n [\n { x: screenPaddingPx.x, y: screenPaddingPx.y },\n { x: svgWidth - screenPaddingPx.x, y: screenPaddingPx.y },\n { x: svgWidth - screenPaddingPx.x, y: svgHeight - screenPaddingPx.y },\n ],\n )\n const svgChildren: SvgObject[] = []\n\n // Add background rectangle\n svgChildren.push({\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n children: [],\n value: \"\",\n })\n\n // Add grid if enabled\n if (options?.grid) {\n const gridConfig = typeof options.grid === \"object\" ? options.grid : {}\n svgChildren.push(\n drawSchematicGrid({ bounds: realBounds, transform, ...gridConfig }),\n )\n }\n\n const schDebugObjectSvgs: SvgObject[] = []\n const schComponentSvgs: SvgObject[] = []\n const schTraceSvgs: SvgObject[] = []\n const schNetLabel: SvgObject[] = []\n\n for (const elm of circuitJson) {\n if (elm.type === \"schematic_debug_object\") {\n schDebugObjectSvgs.push(\n ...createSvgObjectsFromSchDebugObject(elm, transform),\n )\n } else if (elm.type === \"schematic_component\") {\n schComponentSvgs.push(\n ...createSvgObjectsFromSchematicComponent({\n component: elm,\n transform,\n circuitJson,\n }),\n )\n } else if (elm.type === \"schematic_trace\") {\n schTraceSvgs.push(...createSchematicTrace(elm, transform))\n } else if (elm.type === \"schematic_net_label\") {\n schNetLabel.push(...createSvgObjectsForSchNetLabel(elm, transform))\n }\n }\n\n // Add elements in correct order\n svgChildren.push(\n ...schDebugObjectSvgs,\n ...schComponentSvgs,\n ...schTraceSvgs,\n ...schNetLabel,\n )\n\n // Add labeled points if provided\n if (options?.labeledPoints) {\n svgChildren.push(\n drawSchematicLabeledPoints({\n points: options.labeledPoints,\n transform,\n }),\n )\n }\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n style: `background-color: ${colorMap.schematic.background}`,\n },\n children: [\n // Add styles\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n\n // DO NOT USE THESE CLASSES!!!!\n // PUT STYLES IN THE SVG OBJECTS THEMSELVES\n value: `\n .boundary { fill: ${colorMap.schematic.background}; }\n .schematic-boundary { fill: none; stroke: #fff; }\n .component { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .chip { fill: ${colorMap.schematic.component_body}; stroke: ${colorMap.schematic.component_outline}; }\n .component-pin { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .trace { stroke: ${colorMap.schematic.wire}; }\n .text { font-family: sans-serif; fill: ${colorMap.schematic.wire}; }\n .pin-number { fill: ${colorMap.schematic.pin_number}; }\n .port-label { fill: ${colorMap.schematic.reference}; }\n .component-name { fill: ${colorMap.schematic.reference}; }\n `,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ...svgChildren,\n ],\n value: \"\",\n }\n\n return stringify(svgObject)\n}\n\n/**\n * @deprecated use `convertCircuitJsonToSchematicSvg` instead\n */\nexport const circuitJsonToSchematicSvg = convertCircuitJsonToSchematicSvg\n","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function drawSchematicGrid(params: {\n bounds: {\n minX: number\n minY: number\n maxX: number\n maxY: number\n }\n transform: Matrix\n cellSize?: number\n labelCells?: boolean\n}): SvgObject {\n const { minX, minY, maxX, maxY } = params.bounds\n const cellSize = params.cellSize ?? 1\n const labelCells = params.labelCells ?? false\n const gridLines: any[] = []\n\n // Helper function to transform points\n const transformPoint = (x: number, y: number) => {\n const [transformedX, transformedY] = applyToPoint(params.transform, [x, y])\n return { x: transformedX, y: transformedY }\n }\n\n // Vertical lines\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n const start = transformPoint(x, minY)\n const end = transformPoint(x, maxY)\n\n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Horizontal lines\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const start = transformPoint(minX, y)\n const end = transformPoint(maxX, y)\n\n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Add cell labels if enabled\n if (labelCells) {\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const point = transformPoint(x, y)\n\n gridLines.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: (point.x - 2.5).toString(),\n y: (point.y - 5).toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": (\n (cellSize / 5) *\n Math.abs(params.transform.a)\n ).toString(),\n \"fill-opacity\": \"0.5\",\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": \"sans-serif\",\n },\n children: [\n {\n type: \"text\",\n value: `${x},${y}`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n }\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"grid\" },\n children: gridLines,\n }\n}\n","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\ninterface LabeledPoint {\n x: number\n y: number\n label?: string\n}\n\nexport function drawSchematicLabeledPoints(params: {\n points: LabeledPoint[]\n transform: Matrix\n}): SvgObject {\n const { points, transform } = params\n const labeledPointsGroup: any[] = []\n\n for (const point of points) {\n // Transform offset points for X marker\n const [x1, y1] = applyToPoint(transform, [point.x - 0.1, point.y - 0.1])\n const [x2, y2] = applyToPoint(transform, [point.x + 0.1, point.y + 0.1])\n const [x3, y3] = applyToPoint(transform, [point.x - 0.1, point.y + 0.1])\n const [x4, y4] = applyToPoint(transform, [point.x + 0.1, point.y - 0.1])\n\n // Add X marker\n labeledPointsGroup.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M${x1},${y1} L${x2},${y2} M${x3},${y3} L${x4},${y4}`,\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-opacity\": \"0.7\",\n },\n })\n\n // Transform label position\n const [labelX, labelY] = applyToPoint(transform, [\n point.x + 0.15,\n point.y - 0.15,\n ])\n\n // Add label\n labeledPointsGroup.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: labelX.toString(),\n y: labelY.toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": (0.1 * Math.abs(transform.a)).toString(),\n \"fill-opacity\": \"0.7\",\n \"text-anchor\": \"start\",\n \"font-family\": \"sans-serif\",\n \"dominant-baseline\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: point.label || `(${point.x},${point.y})`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"labeled-points\" },\n children: labeledPointsGroup,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\ninterface Bounds {\n minX: number\n minY: number\n maxX: number\n maxY: number\n}\n\nexport function getSchematicBoundsFromCircuitJson(\n soup: AnyCircuitElement[],\n padding = 0.5,\n): Bounds {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n const portSize = 0.2\n\n // Find the bounds\n for (const item of soup) {\n if (item.type === \"schematic_component\") {\n updateBounds(item.center, item.size, item.rotation || 0)\n } else if (item.type === \"schematic_port\") {\n updateBounds(item.center, { width: portSize, height: portSize }, 0)\n } else if (item.type === \"schematic_debug_object\") {\n if (item.shape === \"rect\") {\n updateBounds(item.center, item.size, 0)\n } else if (item.shape === \"line\") {\n updateBounds(item.start, { width: 0.1, height: 0.1 }, 0)\n updateBounds(item.end, { width: 0.1, height: 0.1 }, 0)\n }\n } else if (item.type === \"schematic_net_label\") {\n updateBounds(item.center, { width: 1, height: 1 }, 0)\n }\n }\n\n // Add padding to bounds\n minX -= padding\n minY -= padding\n maxX += padding\n maxY += padding\n\n return { minX, minY, maxX, maxY }\n\n function updateBounds(center: any, size: any, rotation: number) {\n const corners = [\n { x: -size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: size.height / 2 },\n { x: -size.width / 2, y: size.height / 2 },\n ]\n\n for (const corner of corners) {\n const rotatedX =\n corner.x * Math.cos(rotation) - corner.y * Math.sin(rotation) + center.x\n const rotatedY =\n corner.x * Math.sin(rotation) + corner.y * Math.cos(rotation) + center.y\n minX = Math.min(minX, rotatedX)\n minY = Math.min(minY, rotatedY)\n maxX = Math.max(maxX, rotatedX)\n maxY = Math.max(maxY, rotatedY)\n }\n }\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSvg, symbols, type SchSymbol } from \"schematic-symbols\"\nimport { parseSync } from \"svgson\"\nimport {\n applyToPoint,\n compose,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { matchSchPortsToSymbolPorts } from \"lib/utils/match-sch-ports-with-symbol-ports\"\nimport { pointPairsToMatrix } from \"lib/utils/point-pairs-to-matrix\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport type { TextPrimitive } from \"schematic-symbols\"\nimport { createSvgSchErrorText } from \"./create-svg-error-text\"\n\nconst ninePointAnchorToTextAnchor: Record<\n TextPrimitive[\"anchor\"],\n \"middle\" | \"start\" | \"end\"\n> = {\n top_left: \"start\",\n top_right: \"end\",\n middle_left: \"start\",\n middle_right: \"end\",\n bottom_left: \"start\",\n bottom_right: \"end\",\n center: \"middle\",\n middle_top: \"middle\",\n middle_bottom: \"middle\",\n}\n\nconst ninePointAnchorToDominantBaseline: Record<\n TextPrimitive[\"anchor\"],\n \"auto\" | \"hanging\" | \"middle\"\n> = {\n top_left: \"auto\",\n top_right: \"auto\",\n bottom_left: \"hanging\",\n bottom_right: \"hanging\",\n center: \"auto\",\n middle_left: \"middle\",\n middle_right: \"middle\",\n middle_top: \"auto\",\n middle_bottom: \"hanging\",\n}\n\nexport const createSvgObjectsFromSchematicComponentWithSymbol = ({\n component: schComponent,\n transform: realToScreenTransform,\n circuitJson,\n}: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n\n const symbol: SchSymbol = (symbols as any)[schComponent.symbol_name!]\n\n if (!symbol) {\n return [\n createSvgSchErrorText({\n text: `Symbol not found: ${schComponent.symbol_name}`,\n realCenter: schComponent.center,\n realToScreenTransform,\n }),\n ]\n }\n\n const schPorts = su(circuitJson as any).schematic_port.list({\n schematic_component_id: schComponent.schematic_component_id,\n }) as SchematicPort[]\n\n const srcComponent = su(circuitJson as any).source_component.get(\n schComponent.source_component_id,\n )\n // Match schPorts to symbol ports using angle from schematic component center\n const schPortsWithSymbolPorts = matchSchPortsToSymbolPorts({\n schPorts,\n symbol,\n schComponent,\n })\n\n if (!schPortsWithSymbolPorts[0]) {\n return [\n createSvgSchErrorText({\n text: `Could not match ports for symbol ${schComponent.symbol_name}`,\n realCenter: schComponent.center,\n realToScreenTransform,\n }),\n ]\n }\n\n const transformFromSymbolToReal = pointPairsToMatrix(\n schPortsWithSymbolPorts[1]?.symbolPort ?? symbol.center,\n schPortsWithSymbolPorts[1]?.schPort.center ?? schComponent.center,\n schPortsWithSymbolPorts[0].symbolPort,\n schPortsWithSymbolPorts[0].schPort.center,\n )\n\n const paths = symbol.primitives.filter((p) => p.type === \"path\")\n const texts = symbol.primitives.filter((p) => p.type === \"text\")\n const circles = symbol.primitives.filter((p) => p.type === \"circle\")\n const boxes = symbol.primitives.filter((p) => p.type === \"box\")\n\n for (const path of paths) {\n const { points, color, closed, fill } = path\n svgObjects.push({\n type: \"element\",\n name: \"path\",\n attributes: {\n d:\n points\n .map((p, i) => {\n const [x, y] = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n [p.x, p.y],\n )\n return `${i === 0 ? \"M\" : \"L\"} ${x} ${y}`\n })\n .join(\" \") + (closed ? \" Z\" : \"\"),\n stroke: colorMap.schematic.component_outline,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(realToScreenTransform)}px`,\n },\n value: \"\",\n children: [],\n })\n }\n\n for (const text of texts) {\n const screenTextPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n text,\n )\n let textValue = \"\"\n if (text.text === \"{REF}\") {\n textValue = srcComponent?.name ?? \"\"\n } else if (text.text === \"{VAL}\") {\n textValue = schComponent.symbol_display_value ?? \"\"\n }\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: screenTextPos.x.toString(),\n y: screenTextPos.y.toString(),\n \"dominant-baseline\": ninePointAnchorToDominantBaseline[text.anchor],\n \"text-anchor\": ninePointAnchorToTextAnchor[text.anchor],\n \"font-family\": \"sans-serif\",\n \"font-size\": `${getSchScreenFontSize(realToScreenTransform, \"reference_designator\")}px`,\n },\n value: \"\",\n children: [\n {\n type: \"text\",\n value: textValue,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n\n // Draw Boxes\n\n for (const box of boxes) {\n const screenBoxPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n box,\n )\n const symbolToScreenScale = compose(\n realToScreenTransform,\n transformFromSymbolToReal,\n ).a\n\n svgObjects.push({\n name: \"rect\",\n type: \"element\",\n attributes: {\n x: screenBoxPos.x.toString(),\n y: screenBoxPos.y.toString(),\n width: (box.width * symbolToScreenScale).toString(),\n height: (box.height * symbolToScreenScale).toString(),\n fill: \"red\",\n },\n value: \"\",\n children: [],\n })\n }\n\n // Draw Ports for debugging\n for (const port of symbol.ports) {\n const screenPortPos = applyToPoint(\n compose(realToScreenTransform, transformFromSymbolToReal),\n port,\n )\n svgObjects.push({\n type: \"element\",\n name: \"circle\",\n attributes: {\n cx: screenPortPos.x.toString(),\n cy: screenPortPos.y.toString(),\n r: `${realToScreenTransform.a * 0.02}px`,\n fill: \"none\",\n stroke: colorMap.schematic.component_outline,\n },\n value: \"\",\n children: [],\n })\n }\n\n return svgObjects\n}\n","import type { Matrix } from \"transformation-matrix\"\n\n// 0.02mm -> 2px\nexport const getSchStrokeSize = (transform: Matrix) => {\n return Math.abs(transform.a) * 0.02\n}\n","import type { SchematicComponent, SchematicPort } from \"circuit-json\"\nimport type { SchSymbol } from \"schematic-symbols\"\n\n// export const matchSchPortsToSymbolPorts = ({\n// schPorts,\n// symbol,\n// schComponent,\n// }: {\n// schPorts: SchematicPort[]\n// schComponent: SchematicComponent\n// symbol: SchSymbol\n// }): Array<{\n// schPort: SchematicPort\n// symbolPort: SchSymbol[\"ports\"][number]\n// }> => {\n// // schPorts is Array<{ center: { x: number; y: number } }>\n// // schComponent.center is { x: number; y: number }\n// // symbol.ports is Array<{ x: number; y: number }>\n// // symbol.center is { x: number; y: number }\n// // Use the angles from the schComponent center to the schPorts to match with the angles from the symbol center to the symbol ports\n// // If a port isn't matched because there are more schPorts than symbolPorts (or vice versa), then the unmatched ports should be ignored (not returned)\n// }\n\n// Helper function to calculate smallest angular difference accounting for wraparound\nconst getAngularDifference = (angle1: number, angle2: number): number => {\n // Convert from [-π, π] to [0, 2π] for easier comparison\n const a1 = angle1 < 0 ? angle1 + 2 * Math.PI : angle1\n const a2 = angle2 < 0 ? angle2 + 2 * Math.PI : angle2\n\n // Calculate direct difference\n let diff = Math.abs(a1 - a2)\n // If the difference is greater than π, then the smaller angle is going the other way around\n if (diff > Math.PI) {\n diff = 2 * Math.PI - diff\n }\n return diff\n}\n\nexport const matchSchPortsToSymbolPorts = ({\n schPorts,\n symbol,\n schComponent,\n}: {\n schPorts: SchematicPort[]\n schComponent: SchematicComponent\n symbol: SchSymbol\n}): Array<{\n schPort: SchematicPort\n symbolPort: SchSymbol[\"ports\"][number]\n}> => {\n // Calculate angles for schematic ports\n const schPortAngles = schPorts.map((port) => {\n const dx = port.center.x - schComponent.center.x\n const dy = port.center.y - schComponent.center.y\n return {\n port,\n angle: Math.atan2(dy, dx),\n }\n })\n\n // Calculate angles for symbol ports\n const symbolPortAngles = symbol.ports.map((port) => {\n const dx = port.x - symbol.center.x\n const dy = port.y - symbol.center.y\n return {\n port,\n angle: Math.atan2(dy, dx),\n }\n })\n\n // Sort both arrays by angle to help with initial matching\n // Note: The sorting is less critical now that we handle wraparound properly\n schPortAngles.sort((a, b) => a.angle - b.angle)\n symbolPortAngles.sort((a, b) => a.angle - b.angle)\n\n const matches: Array<{\n schPort: SchematicPort\n symbolPort: SchSymbol[\"ports\"][number]\n }> = []\n\n // Keep track of used symbol ports to avoid duplicate matches\n const usedSymbolPorts = new Set<SchSymbol[\"ports\"][number]>()\n\n // For each schematic port, find the best matching symbol port\n for (const schPortAngle of schPortAngles) {\n let bestMatch: {\n symbolPort: SchSymbol[\"ports\"][number]\n angleDiff: number\n } | null = null\n\n // Compare against all available symbol ports\n for (const symbolPortAngle of symbolPortAngles) {\n // Skip if this symbol port is already matched\n if (usedSymbolPorts.has(symbolPortAngle.port)) continue\n\n const angleDiff = getAngularDifference(\n schPortAngle.angle,\n symbolPortAngle.angle,\n )\n\n if (bestMatch === null || angleDiff < bestMatch.angleDiff) {\n bestMatch = {\n symbolPort: symbolPortAngle.port,\n angleDiff,\n }\n }\n }\n\n // If we found a match and the angular difference is reasonable (e.g., less than 45 degrees)\n if (bestMatch && bestMatch.angleDiff < Math.PI / 4) {\n matches.push({\n schPort: schPortAngle.port,\n symbolPort: bestMatch.symbolPort,\n })\n usedSymbolPorts.add(bestMatch.symbolPort)\n }\n }\n\n return matches\n}\n","import { type Matrix, compose, scale, translate } from \"transformation-matrix\"\n\ntype Point = { x: number; y: number }\n\nexport function pointPairsToMatrix(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n): Matrix {\n // Calculate the translation based on the first point pair (A -> A')\n const tx = a2.x - a1.x\n const ty = a2.y - a1.y\n\n // Calculate scaling factors using the distances between points\n const originalDistance = Math.sqrt((b1.x - a1.x) ** 2 + (b1.y - a1.y) ** 2)\n const transformedDistance = Math.sqrt((b2.x - a2.x) ** 2 + (b2.y - a2.y) ** 2)\n\n const a = transformedDistance / originalDistance\n\n // Create and compose the transformations\n const translateMatrix = translate(tx, ty)\n const scaleMatrix = scale(a, a)\n\n return compose(translateMatrix, scaleMatrix)\n}\n","import type { Matrix } from \"transformation-matrix\"\nimport { applyToPoint } from \"transformation-matrix\"\n\ntype SchTextType =\n | \"pin_number\"\n | \"reference_designator\"\n | \"manufacturer_number\"\n | \"net_label\"\n | \"error\"\n\nexport const getSchMmFontSize = (textType: SchTextType) => {\n return textType === \"error\" ? 0.05 : textType === \"pin_number\" ? 0.15 : 0.18\n}\n\nexport const getSchScreenFontSize = (\n transform: Matrix,\n textType: SchTextType,\n) => {\n return Math.abs(transform.a) * getSchMmFontSize(textType)\n}\n","import type { SvgObject } from \"lib/svg-object\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport { applyToPoint, type Point, type Matrix } from \"transformation-matrix\"\n\nexport const createSvgSchErrorText = ({\n text,\n realCenter,\n realToScreenTransform,\n}: {\n text: string\n realCenter: { x: number; y: number }\n realToScreenTransform: Matrix\n}): SvgObject => {\n const screenCenter = applyToPoint(realToScreenTransform, realCenter)\n\n return {\n type: \"element\",\n name: \"text\",\n value: \"\",\n attributes: {\n x: screenCenter.x.toString(),\n y: screenCenter.y.toString(),\n fill: \"red\",\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": \"sans-serif\",\n \"font-size\": `${getSchScreenFontSize(realToScreenTransform, \"error\")}px`,\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n }\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n SourceSimpleChip,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSvg, symbols } from \"schematic-symbols\"\nimport { parseSync } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { createSvgObjectsFromSchematicComponentWithSymbol } from \"./create-svg-objects-from-sch-component-with-symbol\"\nimport { createSvgObjectsFromSchPortOnBox } from \"./create-svg-objects-from-sch-port-on-box\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\n\nexport const createSvgObjectsFromSchematicComponentWithBox = ({\n component: schComponent,\n transform,\n circuitJson,\n}: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const srcComponent = su(circuitJson as any).source_component.get(\n schComponent.source_component_id,\n )\n const svgObjects: SvgObject[] = []\n\n const componentScreenTopLeft = applyToPoint(transform, {\n x: schComponent.center.x - schComponent.size.width / 2,\n y: schComponent.center.y + schComponent.size.height / 2,\n })\n const componentScreenBottomRight = applyToPoint(transform, {\n x: schComponent.center.x + schComponent.size.width / 2,\n y: schComponent.center.y - schComponent.size.height / 2,\n })\n const componentScreenWidth =\n componentScreenBottomRight.x - componentScreenTopLeft.x\n const componentScreenHeight =\n componentScreenBottomRight.y - componentScreenTopLeft.y\n\n // Add basic rectangle for component body\n svgObjects.push({\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n class: \"component chip\",\n x: componentScreenTopLeft.x.toString(),\n y: componentScreenTopLeft.y.toString(),\n width: componentScreenWidth.toString(),\n height: componentScreenHeight.toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n children: [],\n })\n // Calculate position for top center of component\n const screenManufacturerNumberPos = applyToPoint(transform, {\n x: schComponent.center.x + schComponent.size.width / 2,\n y: schComponent.center.y + schComponent.size.height / 2 + 0.5, // Above the component top edge\n })\n const fontSizePx = getSchScreenFontSize(transform, \"manufacturer_number\")\n\n // Add manufacturer number and component name text\n if (srcComponent?.manufacturer_part_number) {\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: screenManufacturerNumberPos.x.toString(),\n y: screenManufacturerNumberPos.y.toString(),\n \"font-family\": \"sans-serif\",\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${fontSizePx}px`,\n },\n children: [\n {\n type: \"text\",\n value: srcComponent.manufacturer_part_number,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // Component name below manufacturer number\n if (srcComponent?.name) {\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: screenManufacturerNumberPos.x.toString(),\n y: (screenManufacturerNumberPos.y + fontSizePx * 1.1).toString(),\n \"font-family\": \"sans-serif\",\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${fontSizePx}px`,\n },\n children: [\n {\n type: \"text\",\n value: srcComponent.name || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // // Process ports\n const schematicPorts = su(circuitJson as any).schematic_port.list({\n schematic_component_id: schComponent.schematic_component_id,\n }) as SchematicPort[]\n\n for (const schPort of schematicPorts) {\n svgObjects.push(\n ...createSvgObjectsFromSchPortOnBox({\n schPort,\n schComponent,\n transform,\n circuitJson,\n }),\n )\n }\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { createSvgObjectsForSchPortBoxLine } from \"./create-svg-objects-for-sch-port-box-line\"\nimport { createSvgObjectsForSchPortPinNumberText } from \"./create-svg-objects-for-sch-port-pin-number-text\"\nimport { createSvgObjectsForSchPortPinLabel } from \"./create-svg-objects-for-sch-port-pin-label\"\n\nexport const createSvgObjectsFromSchPortOnBox = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n svgObjects.push(...createSvgObjectsForSchPortBoxLine(params))\n svgObjects.push(...createSvgObjectsForSchPortPinNumberText(params))\n svgObjects.push(...createSvgObjectsForSchPortPinLabel(params))\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { su } from \"@tscircuit/soup-util\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\n\nconst PIN_CIRCLE_RADIUS_MM = 0.02\n\n/**\n * The schematic port box line is the line and circle that goes from the edge\n * of the component box to the port.\n */\nexport const createSvgObjectsForSchPortBoxLine = ({\n schPort,\n schComponent,\n transform,\n circuitJson,\n}: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n\n const srcPort = su(circuitJson as any).source_port.get(schPort.source_port_id)\n\n const realEdgePos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n // schPort.distance_from_component_edge is currently calculated incorrectly\n // in core\n const realPinLineLength = schPort.distance_from_component_edge ?? 0.4\n\n switch (schPort.side_of_component) {\n case \"left\":\n realEdgePos.x += realPinLineLength\n break\n case \"right\":\n realEdgePos.x -= realPinLineLength\n break\n case \"top\":\n realEdgePos.y -= realPinLineLength\n break\n case \"bottom\":\n realEdgePos.y += realPinLineLength\n break\n }\n\n const screenSchPortPos = applyToPoint(transform, schPort.center)\n const screenRealEdgePos = applyToPoint(transform, realEdgePos)\n\n // Subtract the pin circle radius from the pin line length to get the end\n const realLineEnd = { ...schPort.center }\n\n switch (schPort.side_of_component) {\n case \"left\":\n realLineEnd.x += PIN_CIRCLE_RADIUS_MM\n break\n case \"right\":\n realLineEnd.x -= PIN_CIRCLE_RADIUS_MM\n break\n case \"top\":\n realLineEnd.y -= PIN_CIRCLE_RADIUS_MM\n break\n case \"bottom\":\n realLineEnd.y += PIN_CIRCLE_RADIUS_MM\n break\n }\n const screenLineEnd = applyToPoint(transform, realLineEnd)\n\n // Add port line\n svgObjects.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n x1: screenLineEnd.x.toString(),\n y1: screenLineEnd.y.toString(),\n x2: screenRealEdgePos.x.toString(),\n y2: screenRealEdgePos.y.toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n // Add port circle\n svgObjects.push({\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n cx: screenSchPortPos.x.toString(),\n cy: screenSchPortPos.y.toString(),\n r: (Math.abs(transform.a) * PIN_CIRCLE_RADIUS_MM).toString(),\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n return svgObjects\n}\n","/**\n * Given a side, gives you the unit vector you would move in if you were coming\n * towards that edge from the outside. This is the same as the unit vector from\n * a port to the edge of a schematic box. This function assumes cartesian\n * coordinates (Y positive is up)\n */\nexport const getUnitVectorFromOutsideToEdge = (\n side: \"top\" | \"bottom\" | \"left\" | \"right\",\n) => {\n switch (side) {\n case \"top\":\n return { x: 0, y: -1 }\n case \"bottom\":\n return { x: 0, y: 1 }\n case \"left\":\n return { x: 1, y: 0 }\n case \"right\":\n return { x: -1, y: 0 }\n }\n throw new Error(`Invalid side: ${side}`)\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport const createSvgObjectsForSchPortPinNumberText = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n const realPinNumberPos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n if (!schPort.side_of_component) return []\n const vecToEdge = getUnitVectorFromOutsideToEdge(schPort.side_of_component)\n\n const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4\n\n // Move the pin number halfway to the edge of the box component so it sits\n // between the edge and the port, exactly in the middle\n realPinNumberPos.x += (vecToEdge.x * realPinEdgeDistance) / 2\n realPinNumberPos.y += (vecToEdge.y * realPinEdgeDistance) / 2\n\n // Transform the pin position from local to global coordinates\n const screenPinNumberTextPos = applyToPoint(transform, realPinNumberPos)\n\n if (\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ) {\n // Move the pin number text to the left a bit so it doesn't hit the port line\n screenPinNumberTextPos.x -= 2 //px\n } else {\n // Move the pin number text up a bit so it doesn't hit the port line\n screenPinNumberTextPos.y -= 2 //px\n }\n\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"pin-number\",\n x: screenPinNumberTextPos.x.toString(),\n y: screenPinNumberTextPos.y.toString(),\n style: \"font-family: sans-serif;\",\n fill: colorMap.schematic.pin_number,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"auto\",\n \"font-size\": `${getSchScreenFontSize(transform, \"pin_number\")}px`,\n transform:\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ? `rotate(-90 ${screenPinNumberTextPos.x} ${screenPinNumberTextPos.y})`\n : \"\",\n },\n children: [\n {\n type: \"text\",\n value: schPort.pin_number?.toString() || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","import type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchScreenFontSize } from \"lib/utils/get-sch-font-size\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nconst LABEL_DIST_FROM_EDGE_MM = 0.1\n\nexport const createSvgObjectsForSchPortPinLabel = (params: {\n schPort: SchematicPort\n schComponent: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] => {\n const svgObjects: SvgObject[] = []\n const { schPort, schComponent, transform, circuitJson } = params\n\n const realPinNumberPos = {\n x: schPort.center.x,\n y: schPort.center.y,\n }\n\n if (!schPort.side_of_component) return []\n const vecToEdge = getUnitVectorFromOutsideToEdge(schPort.side_of_component)\n\n const realPinEdgeDistance = schPort.distance_from_component_edge ?? 0.4\n\n // Move the pin number halfway to the edge of the box component so it sits\n // between the edge and the port, exactly in the middle\n realPinNumberPos.x +=\n vecToEdge.x * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM)\n realPinNumberPos.y +=\n vecToEdge.y * (realPinEdgeDistance + LABEL_DIST_FROM_EDGE_MM)\n\n // Transform the pin position from local to global coordinates\n const screenPinNumberTextPos = applyToPoint(transform, realPinNumberPos)\n\n const label =\n schPort.display_pin_label ??\n schComponent.port_labels?.[`pin${schPort.pin_number}`]\n\n if (!label) return []\n\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"pin-number\",\n x: screenPinNumberTextPos.x.toString(),\n y: screenPinNumberTextPos.y.toString(),\n style: \"font-family: sans-serif;\",\n fill: colorMap.schematic.pin_number,\n \"text-anchor\":\n schPort.side_of_component === \"left\" ||\n schPort.side_of_component === \"bottom\"\n ? \"start\"\n : \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-size\": `${getSchScreenFontSize(transform, \"pin_number\")}px`,\n transform:\n schPort.side_of_component === \"top\" ||\n schPort.side_of_component === \"bottom\"\n ? `rotate(-90 ${screenPinNumberTextPos.x} ${screenPinNumberTextPos.y})`\n : \"\",\n },\n children: [\n {\n type: \"text\",\n value: label || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","import type { AnyCircuitElement, SchematicComponent } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { createSvgObjectsFromSchematicComponentWithSymbol } from \"./create-svg-objects-from-sch-component-with-symbol\"\nimport { createSvgObjectsFromSchematicComponentWithBox } from \"./create-svg-objects-from-sch-component-with-box\"\nimport type { Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromSchematicComponent(params: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] {\n const { component } = params\n\n if (component.symbol_name) {\n return createSvgObjectsFromSchematicComponentWithSymbol(params)\n }\n\n return createSvgObjectsFromSchematicComponentWithBox(params)\n}\n","import type { SchematicDebugObject } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromSchDebugObject(\n debugObject: SchematicDebugObject,\n transform: Matrix,\n): SvgObject[] {\n if (debugObject.shape === \"rect\") {\n // Transform all corners\n let [screenLeft, screenTop] = applyToPoint(transform, [\n debugObject.center.x - debugObject.size.width / 2,\n debugObject.center.y - debugObject.size.height / 2,\n ])\n let [screenRight, screenBottom] = applyToPoint(transform, [\n debugObject.center.x + debugObject.size.width / 2,\n debugObject.center.y + debugObject.size.height / 2,\n ])\n ;[screenTop, screenBottom] = [\n Math.min(screenTop, screenBottom),\n Math.max(screenTop, screenBottom),\n ]\n\n // Calculate screen width and height\n const width = Math.abs(screenRight - screenLeft)\n const height = Math.abs(screenBottom - screenTop)\n\n const [screenCenterX, screenCenterY] = applyToPoint(transform, [\n debugObject.center.x,\n debugObject.center.y,\n ])\n\n return [\n {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenLeft.toString(),\n y: screenTop.toString(),\n width: width.toString(),\n height: height.toString(),\n fill: \"none\",\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenCenterX.toString(),\n y: (screenCenterY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n if (debugObject.shape === \"line\") {\n // Transform start and end points - flip Y coordinates\n const [screenStartX, screenStartY] = applyToPoint(transform, [\n debugObject.start.x,\n debugObject.start.y,\n ])\n const [screenEndX, screenEndY] = applyToPoint(transform, [\n debugObject.end.x,\n debugObject.end.y,\n ])\n\n // Calculate midpoint for label\n const screenMidX = (screenStartX + screenEndX) / 2\n const screenMidY = (screenStartY + screenEndY) / 2\n\n return [\n {\n name: \"line\",\n type: \"element\",\n value: \"\",\n attributes: {\n x1: screenStartX.toString(),\n y1: screenStartY.toString(),\n x2: screenEndX.toString(),\n y2: screenEndY.toString(),\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenMidX.toString(),\n y: (screenMidY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n return []\n}\n","import type { SchematicTrace } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSchematicTrace(\n trace: SchematicTrace,\n transform: Matrix,\n): SvgObject[] {\n const edges = trace.edges\n if (edges.length === 0) return []\n const svgObjects: SvgObject[] = []\n\n let path = \"\"\n\n // Process edges into an SVG path\n for (let edgeIndex = 0; edgeIndex < edges.length; edgeIndex++) {\n const edge = edges[edgeIndex]!\n\n if (edge.is_crossing) continue\n\n // Transform the points using the matrix\n const [screenFromX, screenFromY] = applyToPoint(transform, [\n edge.from.x,\n edge.from.y,\n ])\n const [screenToX, screenToY] = applyToPoint(transform, [\n edge.to.x,\n edge.to.y,\n ])\n\n // Regular straight line for non-crossing traces\n if (edgeIndex === 0 || edges[edgeIndex - 1]?.is_crossing) {\n path += `M ${screenFromX} ${screenFromY} L ${screenToX} ${screenToY}`\n } else {\n path += ` L ${screenToX} ${screenToY}`\n }\n }\n\n // Process wire crossings with little \"hops\" or arcs\n for (const edge of edges) {\n if (!edge.is_crossing) continue\n\n // Transform the points using the matrix\n const [screenFromX, screenFromY] = applyToPoint(transform, [\n edge.from.x,\n edge.from.y,\n ])\n const [screenToX, screenToY] = applyToPoint(transform, [\n edge.to.x,\n edge.to.y,\n ])\n // For crossing traces, create a small arc/hop\n const midX = (screenFromX + screenToX) / 2\n const midY = (screenFromY + screenToY) / 2\n\n // Calculate perpendicular offset for the arc\n const dx = screenToX - screenFromX\n const dy = screenToY - screenFromY\n const len = Math.sqrt(dx * dx + dy * dy)\n const hopHeight = len * 0.7\n\n // Perpendicular vector\n const perpX = (-dy / len) * hopHeight\n const perpY = (dx / len) * hopHeight\n\n // Control point for the quadratic curve\n const controlX = midX + perpX\n const controlY = midY - Math.abs(perpY)\n\n // Arc Shadow\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M ${screenFromX} ${screenFromY} Q ${controlX} ${controlY} ${screenToX} ${screenToY}`,\n stroke: colorMap.schematic.background,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform) + 1.5}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M ${screenFromX} ${screenFromY} Q ${controlX} ${controlY} ${screenToX} ${screenToY}`,\n stroke: colorMap.schematic.wire,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n }\n\n if (path) {\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"trace\",\n d: path,\n stroke: colorMap.schematic.wire,\n fill: \"none\",\n \"stroke-width\": `${getSchStrokeSize(transform)}px`,\n \"stroke-linecap\": \"round\",\n },\n value: \"\",\n children: [],\n })\n }\n\n // Add junction circles\n if (trace.junctions) {\n for (const junction of trace.junctions) {\n const [screenX, screenY] = applyToPoint(transform, [\n junction.x,\n junction.y,\n ])\n svgObjects.push({\n name: \"circle\",\n type: \"element\",\n attributes: {\n cx: screenX.toString(),\n cy: screenY.toString(),\n r: (Math.abs(transform.a) * 0.03).toString(),\n fill: colorMap.schematic.junction,\n },\n value: \"\",\n children: [],\n })\n }\n }\n\n return svgObjects\n}\n","import type { AnyCircuitElement, SchematicNetLabel } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport {\n getSchMmFontSize,\n getSchScreenFontSize,\n} from \"lib/utils/get-sch-font-size\"\nimport { getSchStrokeSize } from \"lib/utils/get-sch-stroke-size\"\nimport { getUnitVectorFromEdgeToOutside } from \"lib/utils/get-unit-vector-from-edge-to-outside\"\nimport { getUnitVectorFromOutsideToEdge } from \"lib/utils/get-unit-vector-from-outside-to-edge\"\nimport {\n applyToPoint,\n compose,\n rotate,\n scale,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport { estimateTextWidth } from \"../estimate-text-width\"\n\n/**\n * Arrow point width as a fraction of font size (Font Size Ratio)\n */\nconst ARROW_POINT_WIDTH_FSR = 0.3\n\n/**\n * End padding as a fraction of font size (Font Size Ratio)\n */\nconst END_PADDING_FSR = 0.3\nconst END_PADDING_EXTRA_PER_CHARACTER_FSR = 0.06\n\nexport const createSvgObjectsForSchNetLabel = (\n schNetLabel: SchematicNetLabel,\n realToScreenTransform: Matrix,\n): SvgObject[] => {\n if (!schNetLabel.text) return []\n const svgObjects: SvgObject[] = []\n\n const fontSizePx = getSchScreenFontSize(realToScreenTransform, \"net_label\")\n const fontSizeMm = getSchMmFontSize(\"net_label\")\n const textWidthFSR = estimateTextWidth(schNetLabel.text || \"\")\n\n // Transform the center position to screen coordinates\n const screenCenter = applyToPoint(realToScreenTransform, schNetLabel.center)\n\n const realTextGrowthVec = getUnitVectorFromOutsideToEdge(\n schNetLabel.anchor_side,\n )\n\n const screenTextGrowthVec = { ...realTextGrowthVec }\n screenTextGrowthVec.y *= -1 // Invert y direction because anchor_side is pre-transform\n\n const fullWidthFsr =\n textWidthFSR +\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n END_PADDING_FSR\n const screenAnchorPosition = schNetLabel.anchor_position\n ? applyToPoint(realToScreenTransform, schNetLabel.anchor_position)\n : {\n x:\n screenCenter.x -\n (screenTextGrowthVec.x * fullWidthFsr * fontSizePx) / 2,\n y:\n screenCenter.y -\n (screenTextGrowthVec.y * fullWidthFsr * fontSizePx) / 2,\n }\n const realAnchorPosition = schNetLabel.anchor_position ?? {\n x:\n schNetLabel.center.x -\n (realTextGrowthVec.x * fullWidthFsr * fontSizeMm) / 2,\n y:\n schNetLabel.center.y -\n (realTextGrowthVec.y * fullWidthFsr * fontSizeMm) / 2,\n }\n\n // Get rotation angle based on anchor_side\n const pathRotation = {\n left: 0,\n top: 90,\n bottom: -90,\n right: 180,\n }[schNetLabel.anchor_side]\n\n // Calculate the points for the outline\n const screenOutlinePoints: Array<{ x: number; y: number }> = [\n // Arrow point in font-relative coordinates\n {\n x: 0,\n y: 0,\n },\n // Top left corner in font-relative coordinates\n {\n x: ARROW_POINT_WIDTH_FSR,\n y: 0.6,\n },\n // Top right corner in font-relative coordinates\n {\n x:\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_FSR +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n textWidthFSR,\n y: 0.6,\n },\n // Bottom right corner in font-relative coordinates\n {\n x:\n ARROW_POINT_WIDTH_FSR * 2 +\n END_PADDING_FSR +\n END_PADDING_EXTRA_PER_CHARACTER_FSR * schNetLabel.text.length +\n textWidthFSR,\n y: -0.6,\n },\n // Bottom left corner in font-relative coordinates\n {\n x: ARROW_POINT_WIDTH_FSR,\n y: -0.6,\n },\n ].map((fontRelativePoint) =>\n applyToPoint(\n compose(\n realToScreenTransform,\n translate(realAnchorPosition.x, realAnchorPosition.y),\n scale(fontSizeMm),\n rotate((pathRotation / 180) * Math.PI),\n ),\n fontRelativePoint,\n ),\n )\n\n // Create the label path\n const pathD = `\n M ${screenOutlinePoints[0]!.x},${screenOutlinePoints[0]!.y}\n L ${screenOutlinePoints[1]!.x},${screenOutlinePoints[1]!.y}\n L ${screenOutlinePoints[2]!.x},${screenOutlinePoints[2]!.y}\n L ${screenOutlinePoints[3]!.x},${screenOutlinePoints[3]!.y}\n L ${screenOutlinePoints[4]!.x},${screenOutlinePoints[4]!.y}\n Z\n `\n\n // Add the label container path\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"net-label\",\n d: pathD,\n fill: \"white\",\n stroke: colorMap.schematic.label_global,\n \"stroke-width\": `${getSchStrokeSize(realToScreenTransform)}px`,\n },\n value: \"\",\n children: [],\n })\n\n const screenTextPos = {\n x: screenAnchorPosition.x + screenTextGrowthVec.x * fontSizePx * 0.5,\n y: screenAnchorPosition.y - screenTextGrowthVec.y * fontSizePx * 0.5,\n }\n\n const textAnchor = {\n left: \"start\",\n top: \"start\",\n bottom: \"start\",\n right: \"end\",\n }[schNetLabel.anchor_side]\n\n const textTransformString = {\n left: \"\",\n right: \"\",\n top: `rotate(-90 ${screenTextPos.x} ${screenTextPos.y})`,\n bottom: `rotate(90 ${screenTextPos.x} ${screenTextPos.y})`,\n }[schNetLabel.anchor_side]\n\n // Add the label text\n svgObjects.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"net-label-text\",\n x: screenTextPos.x.toString(),\n y: screenTextPos.y.toString(),\n fill: colorMap.schematic.label_global,\n \"text-anchor\": textAnchor,\n \"dominant-baseline\": \"central\",\n \"font-family\": \"sans-serif\",\n \"font-variant-numeric\": \"tabular-nums\",\n \"font-size\": `${fontSizePx}px`,\n transform: textTransformString,\n },\n children: [\n {\n type: \"text\",\n value: schNetLabel.text || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n return svgObjects\n}\n","// https://claude.ai/share/5e327d90-627f-48d5-9a51-ba6117479007\nexport const arialTextMetrics = {\n \"0\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"1\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -3,\n right: 9,\n },\n \"2\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"3\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"4\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n \"5\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"6\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"7\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"8\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"9\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \" \": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 0,\n },\n \"!\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n '\"': {\n width: 9,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"#\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 13,\n },\n $: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"%\": {\n width: 21,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 20,\n },\n \"&\": {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 15,\n },\n \"'\": {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 3,\n },\n \"(\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \")\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"*\": {\n width: 9,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 8,\n },\n \"+\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \",\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"-\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \".\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"/\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 7,\n },\n \":\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \";\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n \"<\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \"=\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \">\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n \"?\": {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n \"@\": {\n width: 24,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 23,\n },\n A: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n B: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n C: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 16,\n },\n D: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 16,\n },\n E: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n F: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 14,\n },\n G: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 17,\n },\n H: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n I: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 5,\n },\n J: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 10,\n },\n K: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 16,\n },\n L: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n M: {\n width: 20,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 18,\n },\n N: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n O: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 18,\n },\n P: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n Q: {\n width: 19,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 18,\n },\n R: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 17,\n },\n S: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 15,\n },\n T: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 14,\n },\n U: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 15,\n },\n V: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n W: {\n width: 23,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 22,\n },\n X: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n Y: {\n width: 16,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 16,\n },\n Z: {\n width: 15,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 14,\n },\n \"[\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 6,\n },\n \"\\\\\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 7,\n },\n \"]\": {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 5,\n },\n \"^\": {\n width: 11,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 11,\n },\n _: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 14,\n },\n \"`\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 5,\n },\n a: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n b: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n c: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n d: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n e: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n f: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 8,\n },\n g: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n h: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n i: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n j: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 1,\n right: 4,\n },\n k: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n l: {\n width: 5,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n m: {\n width: 20,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 18,\n },\n n: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n o: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n p: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n q: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 12,\n },\n r: {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 8,\n },\n s: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 11,\n },\n t: {\n width: 7,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 6,\n },\n u: {\n width: 13,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 12,\n },\n v: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n w: {\n width: 17,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 17,\n },\n x: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n y: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 12,\n },\n z: {\n width: 12,\n height: 27,\n ascent: 22,\n descent: 5,\n left: 0,\n right: 11,\n },\n \"{\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"|\": {\n width: 6,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -2,\n right: 4,\n },\n \"}\": {\n width: 8,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 7,\n },\n \"~\": {\n width: 14,\n height: 27,\n ascent: 22,\n descent: 5,\n left: -1,\n right: 13,\n },\n}\n","import { arialTextMetrics } from \"./arial-text-metrics\"\n\nexport const estimateTextWidth = (text: string): number => {\n if (!text) return 0\n\n let totalWidth = 0\n for (const char of text) {\n const metrics = arialTextMetrics[char as keyof typeof arialTextMetrics]\n if (metrics) {\n totalWidth += metrics.width\n } else {\n // Default width for unknown characters\n totalWidth += arialTextMetrics[\"?\"].width\n }\n }\n\n // Return width normalized to font size 1\n return totalWidth / 27 // Normalize by font height from metrics\n}\n"],"mappings":"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","names":["applyToPoint","compose","translate","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","rotate","translate","matrixToString","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","translate","applyToPoint","stringify","applyToPoint","applyToPoint","applyToPoint","compose","compose","scale","translate","applyToPoint","applyToPoint","compose","su","applyToPoint","applyToPoint","su","su","applyToPoint","applyToPoint","applyToPoint","su","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","rotate","scale","translate","applyToPoint","compose","translate","scale","rotate","stringify"]}
|