circuit-json-to-gerber 0.0.51 → 0.0.52
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/{chunk-FNNZTRYF.js → chunk-2BRTOVCJ.js} +94 -32
- package/dist/chunk-2BRTOVCJ.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-FNNZTRYF.js.map +0 -1
|
@@ -1129,11 +1129,24 @@ function getAllTraceWidths(soup) {
|
|
|
1129
1129
|
}
|
|
1130
1130
|
return {
|
|
1131
1131
|
top: Array.from(widths.top || []),
|
|
1132
|
+
inner1: Array.from(widths.inner1 || []),
|
|
1133
|
+
inner2: Array.from(widths.inner2 || []),
|
|
1134
|
+
inner3: Array.from(widths.inner3 || []),
|
|
1135
|
+
inner4: Array.from(widths.inner4 || []),
|
|
1136
|
+
inner5: Array.from(widths.inner5 || []),
|
|
1137
|
+
inner6: Array.from(widths.inner6 || []),
|
|
1132
1138
|
bottom: Array.from(widths.bottom || [])
|
|
1133
1139
|
};
|
|
1134
1140
|
}
|
|
1135
1141
|
|
|
1136
1142
|
// src/gerber/convert-soup-to-gerber-commands/defineAperturesForLayer.ts
|
|
1143
|
+
var getLayerRefFromGerberLayerName = (glayer_name) => {
|
|
1144
|
+
if (glayer_name.startsWith("F_")) return "top";
|
|
1145
|
+
if (glayer_name.startsWith("B_")) return "bottom";
|
|
1146
|
+
const innerLayerMatch = glayer_name.match(/^In([1-6])_/);
|
|
1147
|
+
if (innerLayerMatch) return `inner${innerLayerMatch[1]}`;
|
|
1148
|
+
throw new Error(`Could not infer layer ref from ${glayer_name}`);
|
|
1149
|
+
};
|
|
1137
1150
|
function defineAperturesForLayer({
|
|
1138
1151
|
glayer,
|
|
1139
1152
|
soup,
|
|
@@ -1155,7 +1168,8 @@ function defineAperturesForLayer({
|
|
|
1155
1168
|
...gerberBuilder().add("comment", { comment: "aperture START LIST" }).build()
|
|
1156
1169
|
);
|
|
1157
1170
|
const traceWidths = getAllTraceWidths(soup);
|
|
1158
|
-
|
|
1171
|
+
const layerRef = getLayerRefFromGerberLayerName(glayer_name);
|
|
1172
|
+
for (const width of traceWidths[layerRef]) {
|
|
1159
1173
|
glayer.push(
|
|
1160
1174
|
...gerberBuilder().add("define_aperture_template", {
|
|
1161
1175
|
aperture_number: getNextApertureNumber(),
|
|
@@ -1164,10 +1178,7 @@ function defineAperturesForLayer({
|
|
|
1164
1178
|
}).build()
|
|
1165
1179
|
);
|
|
1166
1180
|
}
|
|
1167
|
-
const apertureConfigs = getAllApertureTemplateConfigsForLayer(
|
|
1168
|
-
soup,
|
|
1169
|
-
glayer_name.startsWith("F_") ? "top" : "bottom"
|
|
1170
|
-
);
|
|
1181
|
+
const apertureConfigs = getAllApertureTemplateConfigsForLayer(soup, layerRef);
|
|
1171
1182
|
for (const apertureConfig of apertureConfigs) {
|
|
1172
1183
|
glayer.push(
|
|
1173
1184
|
...gerberBuilder().add("define_aperture_template", {
|
|
@@ -1422,7 +1433,7 @@ var findApertureNumber = (glayer, search_params) => {
|
|
|
1422
1433
|
// package.json
|
|
1423
1434
|
var package_default = {
|
|
1424
1435
|
name: "circuit-json-to-gerber",
|
|
1425
|
-
version: "0.0.
|
|
1436
|
+
version: "0.0.51",
|
|
1426
1437
|
main: "dist/index.js",
|
|
1427
1438
|
type: "module",
|
|
1428
1439
|
scripts: {
|
|
@@ -1473,7 +1484,6 @@ var package_default = {
|
|
|
1473
1484
|
// src/gerber/convert-soup-to-gerber-commands/getCommandHeaders.ts
|
|
1474
1485
|
var layerAndTypeToFileFunction = {
|
|
1475
1486
|
"top-copper": "Copper,L1,Top",
|
|
1476
|
-
"bottom-copper": "Copper,L2,Bot",
|
|
1477
1487
|
"top-soldermask": "Soldermask,Top",
|
|
1478
1488
|
"bottom-soldermask": "Soldermask,Bot",
|
|
1479
1489
|
"top-silkscreen": "Legend,Top",
|
|
@@ -1481,10 +1491,22 @@ var layerAndTypeToFileFunction = {
|
|
|
1481
1491
|
"top-paste": "Paste,Top",
|
|
1482
1492
|
"bottom-paste": "Paste,Bot",
|
|
1483
1493
|
edgecut: "Profile,NP"
|
|
1484
|
-
|
|
1494
|
+
};
|
|
1495
|
+
var getCopperLayerNumber = (layer, total_layer_count) => {
|
|
1496
|
+
if (layer === "top") return 1;
|
|
1497
|
+
if (layer === "bottom") return total_layer_count;
|
|
1498
|
+
return Number(layer.replace("inner", "")) + 1;
|
|
1485
1499
|
};
|
|
1486
1500
|
var getCommandHeaders = (opts) => {
|
|
1487
|
-
const
|
|
1501
|
+
const total_layer_count = opts.total_layer_count ?? 2;
|
|
1502
|
+
let file_function;
|
|
1503
|
+
if (opts.layer_type === "copper" && opts.layer !== "edgecut") {
|
|
1504
|
+
const layerNumber = getCopperLayerNumber(opts.layer, total_layer_count);
|
|
1505
|
+
const layerPosition = opts.layer === "top" ? "Top" : opts.layer === "bottom" ? "Bot" : "Inr";
|
|
1506
|
+
file_function = `Copper,L${layerNumber},${layerPosition}`;
|
|
1507
|
+
} else {
|
|
1508
|
+
file_function = layerAndTypeToFileFunction[opts.layer_type ? `${opts.layer}-${opts.layer_type}` : opts.layer];
|
|
1509
|
+
}
|
|
1488
1510
|
return gerberBuilder().add("add_attribute_on_file", {
|
|
1489
1511
|
attribute_name: "GenerationSoftware",
|
|
1490
1512
|
attribute_value: `tscircuit,circuit-json-to-gerber,${package_default.version}`
|
|
@@ -1517,7 +1539,13 @@ var getCommandHeaders = (opts) => {
|
|
|
1517
1539
|
// src/gerber/convert-soup-to-gerber-commands/getGerberLayerName.ts
|
|
1518
1540
|
var layerRefToGerberPrefix = {
|
|
1519
1541
|
top: "F_",
|
|
1520
|
-
bottom: "B_"
|
|
1542
|
+
bottom: "B_",
|
|
1543
|
+
inner1: "In1_",
|
|
1544
|
+
inner2: "In2_",
|
|
1545
|
+
inner3: "In3_",
|
|
1546
|
+
inner4: "In4_",
|
|
1547
|
+
inner5: "In5_",
|
|
1548
|
+
inner6: "In6_"
|
|
1521
1549
|
};
|
|
1522
1550
|
var layerTypeToGerberSuffix = {
|
|
1523
1551
|
copper: "Cu",
|
|
@@ -1528,6 +1556,9 @@ var layerTypeToGerberSuffix = {
|
|
|
1528
1556
|
};
|
|
1529
1557
|
var getGerberLayerName = (layer_ref, layer_type) => {
|
|
1530
1558
|
if (layer_ref === "edgecut") return "Edge_Cuts";
|
|
1559
|
+
if (layer_ref.startsWith("inner") && layer_type !== "copper") {
|
|
1560
|
+
throw new Error(`Inner layer ${layer_ref} only supports copper gerbers`);
|
|
1561
|
+
}
|
|
1531
1562
|
return `${layerRefToGerberPrefix[layer_ref]}${layerTypeToGerberSuffix[layer_type]}`;
|
|
1532
1563
|
};
|
|
1533
1564
|
|
|
@@ -1540,13 +1571,30 @@ import {
|
|
|
1540
1571
|
rotate,
|
|
1541
1572
|
translate
|
|
1542
1573
|
} from "transformation-matrix";
|
|
1574
|
+
var getLayerCount = (soup) => {
|
|
1575
|
+
const board = soup.find((element) => element.type === "pcb_board");
|
|
1576
|
+
const numLayers = board?.num_layers ?? 2;
|
|
1577
|
+
return Math.max(2, Math.min(8, numLayers));
|
|
1578
|
+
};
|
|
1579
|
+
var getInnerLayerRefs = (layerCount) => Array.from({ length: layerCount - 2 }, (_, i) => `inner${i + 1}`);
|
|
1580
|
+
var getGerberInnerLayerName = (layerRef) => {
|
|
1581
|
+
if (!layerRef.startsWith("inner")) {
|
|
1582
|
+
throw new Error(`Expected inner layer, got ${layerRef}`);
|
|
1583
|
+
}
|
|
1584
|
+
return `In${layerRef.replace("inner", "")}_Cu`;
|
|
1585
|
+
};
|
|
1543
1586
|
var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
1544
1587
|
opts.flip_y_axis ??= false;
|
|
1545
1588
|
const hasPanel = soup.some((e) => e.type === "pcb_panel");
|
|
1589
|
+
const layerCount = getLayerCount(soup);
|
|
1590
|
+
const innerLayerRefs = getInnerLayerRefs(layerCount);
|
|
1591
|
+
const copperLayerRefs = ["top", ...innerLayerRefs, "bottom"];
|
|
1592
|
+
const outerLayerRefs = ["top", "bottom"];
|
|
1546
1593
|
const glayers = {
|
|
1547
1594
|
F_Cu: getCommandHeaders({
|
|
1548
1595
|
layer: "top",
|
|
1549
|
-
layer_type: "copper"
|
|
1596
|
+
layer_type: "copper",
|
|
1597
|
+
total_layer_count: layerCount
|
|
1550
1598
|
}),
|
|
1551
1599
|
F_SilkScreen: getCommandHeaders({
|
|
1552
1600
|
layer: "top",
|
|
@@ -1562,7 +1610,8 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
1562
1610
|
}),
|
|
1563
1611
|
B_Cu: getCommandHeaders({
|
|
1564
1612
|
layer: "bottom",
|
|
1565
|
-
layer_type: "copper"
|
|
1613
|
+
layer_type: "copper",
|
|
1614
|
+
total_layer_count: layerCount
|
|
1566
1615
|
}),
|
|
1567
1616
|
B_SilkScreen: getCommandHeaders({
|
|
1568
1617
|
layer: "bottom",
|
|
@@ -1580,15 +1629,25 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
1580
1629
|
layer: "edgecut"
|
|
1581
1630
|
})
|
|
1582
1631
|
};
|
|
1632
|
+
for (const innerLayerRef of innerLayerRefs) {
|
|
1633
|
+
glayers[getGerberInnerLayerName(innerLayerRef)] = getCommandHeaders({
|
|
1634
|
+
layer: innerLayerRef,
|
|
1635
|
+
layer_type: "copper",
|
|
1636
|
+
total_layer_count: layerCount
|
|
1637
|
+
});
|
|
1638
|
+
}
|
|
1639
|
+
const copperGerberLayerNames = copperLayerRefs.map(
|
|
1640
|
+
(layerRef) => getGerberLayerName(layerRef, "copper")
|
|
1641
|
+
);
|
|
1642
|
+
const outerGerberLayerNames = outerLayerRefs.flatMap((layerRef) => [
|
|
1643
|
+
getGerberLayerName(layerRef, "soldermask"),
|
|
1644
|
+
getGerberLayerName(layerRef, "paste"),
|
|
1645
|
+
getGerberLayerName(layerRef, "silkscreen")
|
|
1646
|
+
]);
|
|
1583
1647
|
for (const glayer_name of [
|
|
1584
1648
|
"F_Cu",
|
|
1585
|
-
"
|
|
1586
|
-
|
|
1587
|
-
"B_Mask",
|
|
1588
|
-
"F_Paste",
|
|
1589
|
-
"B_Paste",
|
|
1590
|
-
"F_SilkScreen",
|
|
1591
|
-
"B_SilkScreen"
|
|
1649
|
+
...copperGerberLayerNames.filter((name) => name !== "F_Cu"),
|
|
1650
|
+
...outerGerberLayerNames
|
|
1592
1651
|
]) {
|
|
1593
1652
|
const glayer = glayers[glayer_name];
|
|
1594
1653
|
defineCommonMacros(glayer);
|
|
@@ -1845,7 +1904,7 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
1845
1904
|
});
|
|
1846
1905
|
return { vertices: new_vertices };
|
|
1847
1906
|
};
|
|
1848
|
-
for (const layer of
|
|
1907
|
+
for (const layer of copperLayerRefs) {
|
|
1849
1908
|
for (const element of soup) {
|
|
1850
1909
|
if (element.type === "pcb_copper_pour" && layer === element.layer) {
|
|
1851
1910
|
const copper_glayer = glayers[getGerberLayerName(layer, "copper")];
|
|
@@ -1945,7 +2004,7 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
1945
2004
|
}
|
|
1946
2005
|
}
|
|
1947
2006
|
}
|
|
1948
|
-
for (const layer of [
|
|
2007
|
+
for (const layer of [...copperLayerRefs, "edgecut"]) {
|
|
1949
2008
|
for (const element of soup) {
|
|
1950
2009
|
if (element.type === "pcb_trace") {
|
|
1951
2010
|
const { route } = element;
|
|
@@ -1963,7 +2022,7 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
1963
2022
|
}
|
|
1964
2023
|
}
|
|
1965
2024
|
}
|
|
1966
|
-
} else if (element.type === "pcb_silkscreen_path") {
|
|
2025
|
+
} else if (element.type === "pcb_silkscreen_path" && outerLayerRefs.includes(layer)) {
|
|
1967
2026
|
if (element.layer === layer) {
|
|
1968
2027
|
const glayer = glayers[getGerberLayerName(layer, "silkscreen")];
|
|
1969
2028
|
const apertureConfig = getApertureConfigFromPcbSilkscreenPath(element);
|
|
@@ -1984,7 +2043,7 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
1984
2043
|
}
|
|
1985
2044
|
glayer.push(...gerber.build());
|
|
1986
2045
|
}
|
|
1987
|
-
} else if (element.type === "pcb_silkscreen_text" && layer
|
|
2046
|
+
} else if (element.type === "pcb_silkscreen_text" && outerLayerRefs.includes(layer)) {
|
|
1988
2047
|
renderVectorText(
|
|
1989
2048
|
element,
|
|
1990
2049
|
layer,
|
|
@@ -1999,7 +2058,7 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
1999
2058
|
getApertureConfigFromPcbCopperText
|
|
2000
2059
|
);
|
|
2001
2060
|
} else if (element.type === "pcb_smtpad" && element.shape !== "polygon") {
|
|
2002
|
-
if (element.layer === layer) {
|
|
2061
|
+
if (element.layer === layer && outerLayerRefs.includes(layer)) {
|
|
2003
2062
|
for (const glayer of [
|
|
2004
2063
|
glayers[getGerberLayerName(layer, "copper")],
|
|
2005
2064
|
glayers[getGerberLayerName(layer, "soldermask")]
|
|
@@ -2022,7 +2081,7 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
2022
2081
|
}
|
|
2023
2082
|
}
|
|
2024
2083
|
} else if (element.type === "pcb_smtpad" && element.shape === "polygon") {
|
|
2025
|
-
if (element.layer === layer) {
|
|
2084
|
+
if (element.layer === layer && outerLayerRefs.includes(layer)) {
|
|
2026
2085
|
const layers_to_add_to = [
|
|
2027
2086
|
glayers[getGerberLayerName(layer, "copper")]
|
|
2028
2087
|
];
|
|
@@ -2055,7 +2114,7 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
2055
2114
|
}
|
|
2056
2115
|
}
|
|
2057
2116
|
} else if (element.type === "pcb_solder_paste") {
|
|
2058
|
-
if (element.layer === layer) {
|
|
2117
|
+
if (element.layer === layer && outerLayerRefs.includes(layer)) {
|
|
2059
2118
|
const glayer = glayers[getGerberLayerName(layer, "paste")];
|
|
2060
2119
|
const aperture_number = findApertureNumber(
|
|
2061
2120
|
glayer,
|
|
@@ -2076,10 +2135,13 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
2076
2135
|
}
|
|
2077
2136
|
} else if (element.type === "pcb_plated_hole") {
|
|
2078
2137
|
if (element.layers.includes(layer)) {
|
|
2079
|
-
|
|
2080
|
-
glayers[getGerberLayerName(layer, "copper")]
|
|
2081
|
-
|
|
2082
|
-
|
|
2138
|
+
const layersToAddTo = [
|
|
2139
|
+
glayers[getGerberLayerName(layer, "copper")]
|
|
2140
|
+
];
|
|
2141
|
+
if (outerLayerRefs.includes(layer)) {
|
|
2142
|
+
layersToAddTo.push(glayers[getGerberLayerName(layer, "soldermask")]);
|
|
2143
|
+
}
|
|
2144
|
+
for (const glayer of layersToAddTo) {
|
|
2083
2145
|
const holeW = "hole_width" in element && typeof element.hole_width === "number" ? element.hole_width : 0;
|
|
2084
2146
|
const holeH = "hole_height" in element && typeof element.hole_height === "number" ? element.hole_height : 0;
|
|
2085
2147
|
const padWidthCandidates = [holeW];
|
|
@@ -2184,7 +2246,7 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
2184
2246
|
}
|
|
2185
2247
|
}
|
|
2186
2248
|
} else if (element.type === "pcb_hole") {
|
|
2187
|
-
if (layer
|
|
2249
|
+
if (outerLayerRefs.includes(layer)) {
|
|
2188
2250
|
for (const glayer of [
|
|
2189
2251
|
glayers[getGerberLayerName(layer, "soldermask")]
|
|
2190
2252
|
]) {
|
|
@@ -2445,4 +2507,4 @@ export {
|
|
|
2445
2507
|
stringifyGerberCommands,
|
|
2446
2508
|
convertSoupToGerberCommands
|
|
2447
2509
|
};
|
|
2448
|
-
//# sourceMappingURL=chunk-
|
|
2510
|
+
//# sourceMappingURL=chunk-2BRTOVCJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/excellon-drill/commands/FMAT.ts","../src/excellon-drill/define-excellon-drill-command.ts","../src/excellon-drill/commands/G00.ts","../src/excellon-drill/commands/G01.ts","../src/excellon-drill/commands/G05.ts","../src/excellon-drill/commands/G85.ts","../src/excellon-drill/commands/G90.ts","../src/excellon-drill/commands/M15.ts","../src/excellon-drill/commands/M16.ts","../src/excellon-drill/commands/M30.ts","../src/excellon-drill/commands/M48.ts","../src/excellon-drill/commands/M95.ts","../src/excellon-drill/commands/define_tool.ts","../src/excellon-drill/commands/drill_at.ts","../src/excellon-drill/commands/header_attribute.ts","../src/excellon-drill/commands/header_comment.ts","../src/excellon-drill/commands/rewind.ts","../src/excellon-drill/commands/unit_format.ts","../src/excellon-drill/commands/use_tool.ts","../src/excellon-drill/commands/aper_function_header.ts","../src/excellon-drill/commands/percent_sign.ts","../src/excellon-drill/any-excellon-drill-command-map.ts","../src/excellon-drill/stringify-excellon-drill.ts","../src/excellon-drill/excellon-drill-builder.ts","../src/excellon-drill/convert-soup-to-excellon-drill-commands.ts","../src/gerber/commands/add_attribute_on_aperture.ts","../src/gerber/define-gerber-command.ts","../src/gerber/commands/add_attribute_on_file.ts","../src/gerber/commands/add_attribute_on_object.ts","../src/gerber/commands/aperture_block.ts","../src/gerber/commands/comment.ts","../src/gerber/commands/create_arc.ts","../src/gerber/commands/define_aperture.ts","../src/gerber/commands/define_macro_aperture_template.ts","../src/gerber/commands/delete_attribute.ts","../src/gerber/commands/end_of_file.ts","../src/gerber/commands/end_region_statement.ts","../src/gerber/commands/flash_operation.ts","../src/gerber/stringify-gerber/get-gerber-coordinate-with-padding.ts","../src/gerber/commands/load_mirroring.ts","../src/gerber/commands/load_polarity.ts","../src/gerber/commands/load_rotation.ts","../src/gerber/commands/load_scaling.ts","../src/gerber/commands/move_operation.ts","../src/gerber/commands/plot_operation.ts","../src/gerber/commands/set_coordinate_format.ts","../src/gerber/commands/set_current_aperture_d_code.ts","../src/gerber/commands/set_movement_mode_to_clockwise_circular.ts","../src/gerber/commands/set_movement_mode_to_counterclockwise_circular.ts","../src/gerber/commands/set_movement_mode_to_linear.ts","../src/gerber/commands/set_unit.ts","../src/gerber/commands/start_region_statement.ts","../src/gerber/commands/step_and_repeat.ts","../src/gerber/commands/format_specification.ts","../src/gerber/commands/set_layer_polarity.ts","../src/gerber/commands/define_aperture_template.ts","../src/gerber/commands/select_aperture.ts","../src/gerber/any_gerber_command.ts","../src/gerber/gerber-builder.ts","../src/gerber/stringify-gerber/stringify-gerber-command.ts","../src/gerber/stringify-gerber/stringify-gerber-command-layers.ts","../src/gerber/stringify-gerber/stringify-gerber-commands.ts","../src/gerber/utils/pairs.ts","../src/gerber/convert-soup-to-gerber-commands/define-common-macros.ts","../src/gerber/convert-soup-to-gerber-commands/defineAperturesForLayer.ts","../src/gerber/convert-soup-to-gerber-commands/getAllTraceWidths.ts","../src/gerber/convert-soup-to-gerber-commands/findApertureNumber.ts","../package.json","../src/gerber/convert-soup-to-gerber-commands/getCommandHeaders.ts","../src/gerber/convert-soup-to-gerber-commands/getGerberLayerName.ts","../src/gerber/convert-soup-to-gerber-commands/index.ts"],"sourcesContent":["import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const FMAT = defineExcellonDrillCommand({\n command_code: \"FMAT\",\n schema: z.object({\n command_code: z.literal(\"FMAT\").default(\"FMAT\"),\n format: z.number(),\n }),\n stringify: (c) => `FMAT,${c.format}`,\n})\n","import type { AnyZodObject, z } from \"zod\"\n\nexport interface ExcellonDrillCommandDef<\n K extends string,\n T extends AnyZodObject | z.ZodIntersection<any, any>,\n> {\n command_code: K\n schema: T\n stringify: (c: z.infer<T>) => string\n}\n\nexport const defineExcellonDrillCommand = <\n K extends string,\n T extends AnyZodObject | z.ZodIntersection<any, any>,\n>({\n command_code,\n schema,\n stringify,\n}: {\n command_code: K\n schema: T\n stringify: (c: z.infer<T>) => string\n}): ExcellonDrillCommandDef<K, T> => {\n return {\n command_code,\n schema,\n stringify,\n }\n}\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\n/**\n * Rapid move without drilling\n */\nexport const G00 = defineExcellonDrillCommand({\n command_code: \"G00\",\n schema: z.object({\n command_code: z.literal(\"G00\").default(\"G00\"),\n }),\n stringify: () => \"G00\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\n/**\n * Linear move with drilling\n */\nexport const G01 = defineExcellonDrillCommand({\n command_code: \"G01\",\n schema: z.object({\n command_code: z.literal(\"G01\").default(\"G01\"),\n }),\n stringify: () => \"G01\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const G05 = defineExcellonDrillCommand({\n command_code: \"G05\",\n schema: z.object({\n command_code: z.literal(\"G05\").default(\"G05\"),\n }),\n stringify: () => \"G05\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const G85 = defineExcellonDrillCommand({\n command_code: \"G85\",\n schema: z.object({\n command_code: z.literal(\"G85\").default(\"G85\"),\n x: z.number(),\n y: z.number(),\n width: z.number(), // slot width = tool diameter\n }),\n stringify: ({ x, y }) => `G85X${x.toFixed(3)}Y${y.toFixed(3)}`,\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const G90 = defineExcellonDrillCommand({\n command_code: \"G90\",\n schema: z.object({\n command_code: z.literal(\"G90\").default(\"G90\"),\n }),\n stringify: () => \"G90\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\n/**\n * Z-Axis Feed Down\n */\nexport const M15 = defineExcellonDrillCommand({\n command_code: \"M15\",\n schema: z.object({\n command_code: z.literal(\"M15\").default(\"M15\"),\n }),\n stringify: () => \"M15\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\n/**\n * Z-Axis Feed Up (lift drill up)\n */\nexport const M16 = defineExcellonDrillCommand({\n command_code: \"M16\",\n schema: z.object({\n command_code: z.literal(\"M16\").default(\"M16\"),\n }),\n stringify: () => \"M16\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const M30 = defineExcellonDrillCommand({\n command_code: \"M30\",\n schema: z.object({\n command_code: z.literal(\"M30\").default(\"M30\"),\n }),\n stringify: () => \"M30\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const M48 = defineExcellonDrillCommand({\n command_code: \"M48\",\n schema: z.object({\n command_code: z.literal(\"M48\").default(\"M48\"),\n }),\n stringify: () => \"M48\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const M95 = defineExcellonDrillCommand({\n command_code: \"M95\",\n schema: z.object({\n command_code: z.literal(\"M95\").default(\"M95\"),\n }),\n stringify: () => \"M95\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const define_tool = defineExcellonDrillCommand({\n command_code: \"define_tool\",\n schema: z.object({\n command_code: z.literal(\"define_tool\").default(\"define_tool\"),\n tool_number: z.number(),\n diameter: z.number(),\n }),\n stringify: (c) => `T${c.tool_number}C${c.diameter.toFixed(6)}`,\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const drill_at = defineExcellonDrillCommand({\n command_code: \"drill_at\",\n schema: z.object({\n command_code: z.literal(\"drill_at\").default(\"drill_at\"),\n x: z.number(),\n y: z.number(),\n }),\n stringify: (c) => `X${c.x.toFixed(4)}Y${c.y.toFixed(4)}`,\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const header_attribute = defineExcellonDrillCommand({\n command_code: \"header_attribute\",\n schema: z.object({\n command_code: z.literal(\"header_attribute\").default(\"header_attribute\"),\n attribute_name: z.string(),\n attribute_value: z.string(),\n }),\n stringify({ attribute_name, attribute_value }) {\n return `; #@! ${attribute_name},${attribute_value}`\n },\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const header_comment = defineExcellonDrillCommand({\n command_code: \"header_comment\",\n schema: z.object({\n command_code: z.literal(\"header_comment\").default(\"header_comment\"),\n text: z.string(),\n }),\n stringify({ text }) {\n return `; ${text}`\n },\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const rewind = defineExcellonDrillCommand({\n command_code: \"rewind\",\n schema: z.object({\n command_code: z.literal(\"rewind\").default(\"rewind\"),\n }),\n stringify: () => \"%\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const unit_format = defineExcellonDrillCommand({\n command_code: \"unit_format\",\n schema: z.object({\n command_code: z.literal(\"unit_format\").default(\"unit_format\"),\n unit: z.union([z.literal(\"INCH\"), z.literal(\"METRIC\")]),\n lz: z\n .union([z.literal(\"LZ\"), z.literal(\"TZ\")])\n .nullable()\n .default(null),\n }),\n stringify(c) {\n return `${c.unit}${!c.lz ? \"\" : `,${c.lz}`}`\n },\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const use_tool = defineExcellonDrillCommand({\n command_code: \"use_tool\",\n schema: z.object({\n command_code: z.literal(\"use_tool\").default(\"use_tool\"),\n tool_number: z.number(),\n }),\n stringify: (c) => `T${c.tool_number}`,\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const aper_function_header = defineExcellonDrillCommand({\n command_code: \"aper_function_header\",\n schema: z.object({\n command_code: z\n .literal(\"aper_function_header\")\n .default(\"aper_function_header\"),\n is_plated: z.boolean(),\n }),\n stringify({ is_plated }) {\n return is_plated\n ? \"; #@! TA.AperFunction,Plated,PTH,ComponentDrill\"\n : \"; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill\"\n },\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const percent_sign = defineExcellonDrillCommand({\n command_code: \"percent_sign\",\n schema: z.object({\n command_code: z.literal(\"percent_sign\").default(\"percent_sign\"),\n }),\n stringify: () => \"%\",\n})\n","import type { z } from \"zod\"\nimport type { ExcellonDrillCommandDef } from \"./define-excellon-drill-command\"\nimport * as EDCMD from \"./commands\"\n\nexport const excellon_drill_command_map = {\n G00: EDCMD.G00,\n G01: EDCMD.G01,\n G85: EDCMD.G85,\n M48: EDCMD.M48,\n M95: EDCMD.M95,\n FMAT: EDCMD.FMAT,\n unit_format: EDCMD.unit_format,\n aper_function_header: EDCMD.aper_function_header,\n percent_sign: EDCMD.percent_sign,\n T: EDCMD.define_tool,\n define_tool: EDCMD.define_tool,\n use_tool: EDCMD.use_tool,\n G90: EDCMD.G90,\n G05: EDCMD.G05,\n M15: EDCMD.M15,\n M16: EDCMD.M16,\n M30: EDCMD.M30,\n drill_at: EDCMD.drill_at,\n header_comment: EDCMD.header_comment,\n header_attribute: EDCMD.header_attribute,\n rewind: EDCMD.rewind,\n} satisfies Record<string, ExcellonDrillCommandDef<string, any>>\n\nexport type AnyExcellonDrillCommand = z.infer<\n (typeof excellon_drill_command_map)[keyof typeof excellon_drill_command_map][\"schema\"]\n>\n","import {\n type AnyExcellonDrillCommand,\n excellon_drill_command_map,\n} from \"./any-excellon-drill-command-map\"\n\nexport const stringifyExcellonDrill = (\n commands: Array<AnyExcellonDrillCommand>,\n) => {\n return commands\n .map((c) => {\n const def = excellon_drill_command_map[c.command_code]\n return def.stringify(c as any)\n })\n .join(\"\\n\")\n}\n","import type { z } from \"zod\"\nimport {\n type AnyExcellonDrillCommand,\n excellon_drill_command_map,\n} from \"./any-excellon-drill-command-map\"\n\nclass ExcellonDrillBuilder {\n commands: Array<AnyExcellonDrillCommand>\n\n constructor() {\n this.commands = []\n }\n\n add<T extends keyof typeof excellon_drill_command_map>(\n cmd: T,\n props: z.input<(typeof excellon_drill_command_map)[T][\"schema\"]>,\n ): ExcellonDrillBuilder {\n this.commands.push({\n ...({\n command_code: excellon_drill_command_map[cmd].command_code,\n } as any),\n ...props,\n })\n return this\n }\n\n build(): Array<AnyExcellonDrillCommand> {\n return this.commands\n }\n}\n\nexport const excellonDrill = () => new ExcellonDrillBuilder()\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyExcellonDrillCommand } from \"./any-excellon-drill-command-map\"\nimport { excellonDrill } from \"./excellon-drill-builder\"\n\nexport const convertSoupToExcellonDrillCommands = ({\n circuitJson,\n is_plated,\n flip_y_axis = false,\n}: {\n circuitJson: Array<AnyCircuitElement>\n is_plated: boolean\n flip_y_axis?: boolean\n}): Array<AnyExcellonDrillCommand> => {\n const builder = excellonDrill()\n\n // Start sequence commands\n builder.add(\"M48\", {})\n\n // Add header comments\n const date_str = new Date().toISOString()\n builder\n .add(\"header_comment\", {\n text: `DRILL file {tscircuit} date ${date_str}`,\n })\n .add(\"header_comment\", {\n text: \"FORMAT={-:-/ absolute / metric / decimal}\",\n })\n .add(\"header_attribute\", {\n attribute_name: \"TF.CreationDate\",\n attribute_value: date_str,\n })\n .add(\"header_attribute\", {\n attribute_name: \"TF.GenerationSoftware\",\n attribute_value: \"tscircuit\",\n })\n .add(\"header_attribute\", {\n attribute_name: \"TF.FileFunction\",\n attribute_value: is_plated ? \"Plated,1,2,PTH\" : \"NonPlated,1,2,NPTH\",\n })\n .add(\"FMAT\", { format: 2 }) // Assuming format 2 for the example\n .add(\"unit_format\", { unit: \"METRIC\", lz: null })\n\n let tool_counter = 10 // Start tool numbering from 10 for example\n\n const diameterToToolNumber: Record<number, number> = {}\n\n // Define tools\n for (const element of circuitJson) {\n if (\n element.type !== \"pcb_plated_hole\" &&\n element.type !== \"pcb_hole\" &&\n element.type !== \"pcb_via\"\n ) {\n continue\n }\n\n if (\n !is_plated &&\n (element.type === \"pcb_plated_hole\" || element.type === \"pcb_via\")\n ) {\n continue\n }\n\n const holeDiameter =\n \"hole_diameter\" in element && typeof element.hole_diameter === \"number\"\n ? element.hole_diameter\n : \"hole_width\" in element &&\n typeof element.hole_width === \"number\" &&\n \"hole_height\" in element &&\n typeof element.hole_height === \"number\"\n ? Math.min(element.hole_width, element.hole_height)\n : undefined\n\n if (!holeDiameter) continue\n\n if (!diameterToToolNumber[holeDiameter]) {\n builder.add(\"aper_function_header\", {\n is_plated,\n })\n builder.add(\"define_tool\", {\n tool_number: tool_counter,\n diameter: holeDiameter,\n })\n diameterToToolNumber[holeDiameter] = tool_counter\n tool_counter++\n }\n }\n\n builder.add(\"percent_sign\", {})\n builder.add(\"G90\", {})\n builder.add(\"G05\", {})\n\n // --------------------\n // Execute drills/slots\n // --------------------\n for (let i = 10; i < tool_counter; i++) {\n builder.add(\"use_tool\", { tool_number: i })\n for (const element of circuitJson) {\n if (\n element.type === \"pcb_plated_hole\" ||\n element.type === \"pcb_hole\" ||\n element.type === \"pcb_via\"\n ) {\n if (\n !is_plated &&\n (element.type === \"pcb_plated_hole\" || element.type === \"pcb_via\")\n ) {\n continue\n }\n\n const holeDiameter =\n \"hole_diameter\" in element &&\n typeof element.hole_diameter === \"number\"\n ? element.hole_diameter\n : \"hole_width\" in element &&\n typeof element.hole_width === \"number\" &&\n \"hole_height\" in element &&\n typeof element.hole_height === \"number\"\n ? Math.min(element.hole_width, element.hole_height)\n : undefined\n\n if (!holeDiameter || diameterToToolNumber[holeDiameter] !== i) {\n continue\n }\n\n const elementX =\n \"x\" in element && typeof element.x === \"number\" ? element.x : 0\n const elementY =\n \"y\" in element && typeof element.y === \"number\" ? element.y : 0\n const offsetX =\n \"hole_offset_x\" in element &&\n typeof element.hole_offset_x === \"number\"\n ? element.hole_offset_x\n : 0\n const offsetY =\n \"hole_offset_y\" in element &&\n typeof element.hole_offset_y === \"number\"\n ? element.hole_offset_y\n : 0\n const centerX = elementX + offsetX\n const centerY = elementY + offsetY\n const yMultiplier = flip_y_axis ? -1 : 1\n\n if (\n \"hole_width\" in element &&\n typeof element.hole_width === \"number\" &&\n \"hole_height\" in element &&\n typeof element.hole_height === \"number\"\n ) {\n const holeWidth = element.hole_width\n const holeHeight = element.hole_height\n const maxDim = Math.max(holeWidth, holeHeight)\n const minDim = Math.min(holeWidth, holeHeight)\n\n if (Math.abs(maxDim - minDim) <= 1e-6) {\n builder.add(\"drill_at\", {\n x: centerX,\n y: centerY * yMultiplier,\n })\n continue\n }\n\n const rotationDegrees =\n \"hole_ccw_rotation\" in element &&\n typeof element.hole_ccw_rotation === \"number\"\n ? element.hole_ccw_rotation\n : \"ccw_rotation\" in element &&\n typeof element.ccw_rotation === \"number\"\n ? element.ccw_rotation\n : 0\n const rotationRadians = (rotationDegrees * Math.PI) / 180\n const cosTheta = Math.cos(rotationRadians)\n const sinTheta = Math.sin(rotationRadians)\n\n const isWidthMajor = holeWidth >= holeHeight\n const slotHalfLength = (maxDim - minDim) / 2\n const startRelative = isWidthMajor\n ? { x: -slotHalfLength, y: 0 }\n : { x: 0, y: -slotHalfLength }\n const endRelative = isWidthMajor\n ? { x: slotHalfLength, y: 0 }\n : { x: 0, y: slotHalfLength }\n\n const rotatePoint = ({ x, y }: { x: number; y: number }) => ({\n x: x * cosTheta - y * sinTheta,\n y: x * sinTheta + y * cosTheta,\n })\n\n const startPoint = rotatePoint(startRelative)\n const endPoint = rotatePoint(endRelative)\n\n const startX = centerX + startPoint.x\n const startY = (centerY + startPoint.y) * yMultiplier\n const endX = centerX + endPoint.x\n const endY = (centerY + endPoint.y) * yMultiplier\n\n builder\n .add(\"drill_at\", {\n x: startX,\n y: startY,\n })\n .add(\"G85\", {\n x: endX,\n y: endY,\n width: minDim,\n })\n continue\n }\n\n builder.add(\"drill_at\", {\n x: centerX,\n y: centerY * yMultiplier,\n })\n }\n }\n }\n\n builder.add(\"M30\", {})\n\n return builder.build()\n}\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const add_attribute_on_aperture = defineGerberCommand({\n command_code: \"TA\",\n schema: z\n .object({\n command_code: z.literal(\"TA\").default(\"TA\"),\n attribute_name: z.string(),\n attribute_value: z.string(),\n })\n .describe(\n \"Add attribute on aperture: Add an aperture attribute to the dictionary or modify it.\",\n ),\n stringify: ({ attribute_name, attribute_value }) => {\n return `%TA${attribute_name},${attribute_value}*%`\n },\n})\n","import type { AnyZodObject, z, ZodObject, ZodUnion } from \"zod\"\n\nexport interface GerberCommandDef<\n K extends string,\n T extends AnyZodObject | z.ZodIntersection<any, any>,\n> {\n command_code: K\n schema: T\n stringify: (c: z.infer<T>) => string\n}\n\nexport const defineGerberCommand = <\n K extends string,\n T extends AnyZodObject | z.ZodIntersection<any, any>,\n>({\n command_code,\n schema,\n stringify,\n}: {\n command_code: K\n schema: T\n stringify: (c: z.infer<T>) => string\n}): GerberCommandDef<K, T> => {\n return {\n command_code,\n schema,\n stringify,\n }\n}\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const add_attribute_on_file = defineGerberCommand({\n command_code: \"TF\",\n schema: z\n .object({\n command_code: z.literal(\"TF\").default(\"TF\"),\n attribute_name: z.string(),\n attribute_value: z.string(),\n })\n .describe(\"Add attribute on file: Set a file attribute.\"),\n stringify: ({ attribute_name, attribute_value }) => {\n return `%TF.${attribute_name},${attribute_value}*%`\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const add_attribute_on_object = defineGerberCommand({\n command_code: \"TO\",\n schema: z\n .object({\n command_code: z.literal(\"TO\").default(\"TO\"),\n attribute_name: z.string(),\n attribute_value: z.string(),\n })\n .describe(\n \"Add attribute on object: Add an object attribute to the dictionary or modify it.\",\n ),\n stringify: ({ attribute_name, attribute_value }) => {\n return `%TO${attribute_name},${attribute_value}*%`\n },\n})\n\nexport type AddAttributeOnObject = z.infer<\n typeof add_attribute_on_object.schema\n>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const aperture_block = defineGerberCommand({\n command_code: \"AB\",\n schema: z\n .object({\n command_code: z.literal(\"AB\").default(\"AB\"),\n block: z.string(),\n })\n .describe(\n \"Aperture block: Opens a block aperture statement and assigns its aperture number or closes a block aperture statement\",\n ),\n stringify() {\n return \"\"\n },\n})\n\nexport type ApertureBlock = z.infer<typeof aperture_block.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const comment = defineGerberCommand({\n command_code: \"G04\",\n schema: z\n .object({\n command_code: z.literal(\"G04\").default(\"G04\"),\n comment: z.string(),\n })\n .describe(\n \"Comment: A human readable comment, does not affect the image. 4.1\",\n ),\n stringify: (c) => {\n return `G04 ${c.comment}*`\n },\n})\n\nexport type Comment = z.infer<typeof comment.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const create_arc = defineGerberCommand({\n command_code: \"G75\",\n schema: z\n .object({\n command_code: z.literal(\"G75\").default(\"G75\"),\n })\n .describe(\n \"Create arc: A G75 must be called before creating the first arc.\",\n ),\n stringify() {\n return \"G75*\"\n },\n})\n\nexport type CreateArc = z.infer<typeof create_arc.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const define_aperture = defineGerberCommand({\n command_code: \"AD\",\n schema: z\n .object({\n command_code: z.literal(\"AD\").default(\"AD\"),\n aperture_code: z.string(),\n })\n .describe(\n \"Aperture define: Defines a template-based aperture, assigns a D code to it. 4.3\",\n ),\n stringify() {\n return \"\"\n },\n})\n\nexport type DefineAperture = z.infer<typeof define_aperture.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const define_macro_aperture_template = defineGerberCommand({\n command_code: \"AM\",\n schema: z\n .object({\n command_code: z.literal(\"AM\").default(\"AM\"),\n macro_name: z.string(),\n template_code: z.string(),\n })\n .describe(\"Aperture macro: Defines a macro aperture template. 4.5\"),\n stringify({ macro_name, template_code }) {\n return `%AM${macro_name}*\\n${template_code}%`\n },\n})\n\nexport type DefineMacroApertureTemplate = z.infer<\n typeof define_macro_aperture_template.schema\n>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const delete_attribute = defineGerberCommand({\n command_code: \"TD\",\n schema: z\n .object({\n command_code: z.literal(\"TD\").default(\"TD\"),\n attribute: z.string().optional(),\n })\n .describe(\n \"Delete attribute: Attribute delete Delete one or all attributes in the dictionary.\",\n ),\n stringify({ attribute }) {\n if (!attribute) {\n return \"%TD*%\"\n }\n return `%TD${attribute}*%`\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const end_of_file = defineGerberCommand({\n command_code: \"M02\",\n schema: z\n .object({\n command_code: z.literal(\"M02\").default(\"M02\"),\n })\n .describe(\"End of file: 4.13\"),\n stringify() {\n return \"M02*\"\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const end_region_statement = defineGerberCommand({\n command_code: \"G37\",\n schema: z\n .object({\n command_code: z.literal(\"G37\").default(\"G37\"),\n })\n .describe(\"End region statement: Ends the region statement\"),\n stringify() {\n return \"G37*\"\n },\n})\n\nexport type EndRegionStatement = z.infer<typeof end_region_statement.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\nimport { getGerberCoordinateWithPadding } from \"../stringify-gerber/get-gerber-coordinate-with-padding\"\n\nexport const flash_operation = defineGerberCommand({\n command_code: \"D03\",\n schema: z\n .object({\n command_code: z.literal(\"D03\").default(\"D03\"),\n x: z.number(),\n y: z.number(),\n })\n .describe(\n \"Flash operation: Creates a flash object with the current aperture. The current point is moved to the flash point.\",\n ),\n stringify({ x, y }) {\n const [gx, gy] = [x, y].map((coord) =>\n getGerberCoordinateWithPadding(coord),\n )\n return `X${gx}Y${gy}D03*`\n },\n})\n\nexport type FlashOperation = z.infer<typeof flash_operation.schema>\n","/**\n * Retrieves the Gerber coordinate with padding.\n *\n * Example Gerber coordinate strings:\n * full string: X110550000Y-85000000D03*\n * formatted coordinate for X: 110550000\n *\n * Example inputs/outputs:\n * input: 110.55\n * output: 110550000\n *\n * @param coordinate_mm - The coordinate value in millimeters.\n * @returns The Gerber coordinate with padding.\n */\nexport const getGerberCoordinateWithPadding = (\n coordinate_mm: number,\n): string => {\n const coordinate_um = coordinate_mm * 1000000 // Convert millimeters to micrometers\n let coordinate_str = coordinate_um.toFixed(0) // Convert to string without decimal places\n // add left padding\n while (coordinate_str.length < 9) {\n if (coordinate_um < 0) {\n coordinate_str = `-0${coordinate_str.slice(1)}`\n } else {\n coordinate_str = `0${coordinate_str}`\n }\n }\n return coordinate_str\n}\n","import { z } from \"zod\"\n\nexport const load_mirroring = z\n .object({\n command_code: z.literal(\"LM\"),\n mirroring: z.string(),\n })\n .describe(\"Load mirroring: Loads the mirror object transformation parameter.\")\n\nexport type LoadMirroring = z.infer<typeof load_mirroring>\n","import { z } from \"zod\"\n\nexport const load_polarity = z\n .object({\n command_code: z.literal(\"LP\"),\n polarity: z.string(),\n })\n .describe(\n \"Load polarity: Loads the polarity object transformation parameter.\",\n )\n\nexport type LoadPolarity = z.infer<typeof load_polarity>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const load_rotation = defineGerberCommand({\n command_code: \"LR\",\n schema: z\n .object({\n command_code: z.literal(\"LR\").default(\"LR\"),\n rotation_degrees: z.number(),\n })\n .describe(\n \"Load rotation: Loads the rotation object transformation parameter.\",\n ),\n stringify: ({ rotation_degrees }) => {\n return `%LR${rotation_degrees}*%`\n },\n})\n\nexport type LoadRotation = z.infer<typeof load_rotation.schema>\n","import { z } from \"zod\"\n\nexport const load_scaling = z\n .object({\n command_code: z.literal(\"LS\"),\n scaling: z.string(),\n })\n .describe(\"Load scaling: Loads the scale object transformation parameter.\")\n\nexport type LoadScaling = z.infer<typeof load_scaling>\n","import { getGerberCoordinateWithPadding } from \"./../stringify-gerber/get-gerber-coordinate-with-padding\"\nimport { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const move_operation = defineGerberCommand({\n command_code: \"D02\",\n schema: z\n .object({\n command_code: z.literal(\"D02\").default(\"D02\"),\n x: z.number(),\n y: z.number(),\n })\n .describe(\n \"Move operation: D02 moves the current point to the coordinate in the command. It does not create an object.\",\n ),\n stringify({ x, y }) {\n const [gx, gy] = [x, y].map((coord) =>\n getGerberCoordinateWithPadding(coord),\n )\n return `X${gx}Y${gy}D02*`\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\nimport { getGerberCoordinateWithPadding } from \"../stringify-gerber/get-gerber-coordinate-with-padding\"\n\nexport const plot_operation = defineGerberCommand({\n command_code: \"D01\",\n schema: z\n .object({\n command_code: z.literal(\"D01\").default(\"D01\"),\n x: z.number(),\n y: z.number(),\n i: z.number().optional(),\n j: z.number().optional(),\n })\n .describe(\n \"Plot operation: Outside a region statement D01 creates a draw or arc object with the current aperture. Inside it adds a draw/arc segment to the contour under construction. The current point is moved to draw/arc end point after the creation of the draw/arc.\",\n ),\n stringify({ x, y, i, j }) {\n const gx = getGerberCoordinateWithPadding(x)\n const gy = getGerberCoordinateWithPadding(y)\n let cmd = `X${gx}Y${gy}`\n if (i !== undefined && j !== undefined) {\n const gi = getGerberCoordinateWithPadding(i)\n const gj = getGerberCoordinateWithPadding(j)\n cmd += `I${gi}J${gj}`\n }\n return `${cmd}D01*`\n },\n})\n","import { z } from \"zod\"\n\nexport const set_coordinate_format = z\n .object({\n command_code: z.literal(\"FS\"),\n format: z.string(),\n })\n .describe(\"Sets the coordinate format, e.g. the number of decimals.\")\nexport type SetCoordinateFormat = z.infer<typeof set_coordinate_format>\n","import { z } from \"zod\"\n\nexport const set_current_aperture_d_code = z\n .object({\n command_code: z.literal(\"Dnn\"),\n d_code: z.string(),\n })\n .describe(\"(nn≥10) Sets the current aperture to D code nn. 4.6\")\n\nexport type SetCurrentApertureDCode = z.infer<\n typeof set_current_aperture_d_code\n>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const set_movement_mode_to_clockwise_circular = defineGerberCommand({\n command_code: \"G02\",\n schema: z\n .object({\n command_code: z.literal(\"G02\").default(\"G02\"),\n })\n .describe(\n \"Set movement mode to clockwise circular: Sets linear/circular mode to clockwise circular.\",\n ),\n stringify() {\n return \"G02*\"\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const set_movement_mode_to_counterclockwise_circular =\n defineGerberCommand({\n command_code: \"G03\", // Add the missing command_code property\n schema: z\n .object({\n command_code: z.literal(\"G03\").default(\"G03\"),\n })\n .describe(\n \"Set movement mode to counterclockwise circular: Sets linear/circular mode to counterclockwise circular.\",\n ),\n stringify() {\n return \"G03*\"\n },\n })\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const set_movement_mode_to_linear = defineGerberCommand({\n command_code: \"G01\",\n schema: z\n .object({\n command_code: z.literal(\"G01\").default(\"G01\"),\n })\n .describe(\n \"Set movement mode to linear: Sets linear/circular mode to linear.\",\n ),\n stringify() {\n return \"G01*\"\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const set_unit = defineGerberCommand({\n command_code: \"MO\",\n schema: z\n .object({\n command_code: z.literal(\"MO\").default(\"MO\"),\n unit: z.enum([\"MM\", \"in\"]),\n })\n .describe(\"Mode: Sets the unit to mm or inch. 4.2.1\"),\n stringify({ unit }) {\n return `%MO${unit}*%`\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const start_region_statement = defineGerberCommand({\n command_code: \"G36\",\n schema: z\n .object({\n command_code: z.literal(\"G36\").default(\"G36\"),\n })\n .describe(\n \"Start region statement: Starts a region statement which creates a region by defining its contours.\",\n ),\n stringify() {\n return \"G36*\"\n },\n})\n\nexport type StartRegionStatement = z.infer<typeof start_region_statement.schema>\n","import { z } from \"zod\"\n\nexport const step_and_repeat = z\n .object({\n command_code: z.literal(\"SR\"),\n statement: z.string(),\n })\n .describe(\"Step and repeat: Open or closes a step and repeat statement.\")\n\nexport type StepAndRepeat = z.infer<typeof step_and_repeat>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const format_specification = defineGerberCommand({\n command_code: \"FS\",\n schema: z.object({\n command_code: z.literal(\"FS\").default(\"FS\"),\n zero_omission_mode: z\n .union([z.literal(\"L\").describe(\"leading zeros omitted\"), z.literal(\"T\")])\n .nullable()\n .default(null),\n coordinate_notation: z\n .union([\n z.literal(\"A\").describe(\"absolute notation\"),\n z.literal(\"I\").describe(\"incremental notation\"),\n ])\n .default(\"A\"),\n x_integer_digits: z.number().int().default(4),\n x_decimal_digits: z.number().int().default(6),\n y_integer_digits: z.number().int().default(4),\n y_decimal_digits: z.number().int().default(6),\n }),\n stringify: () => {\n return \"%FSLAX46Y46*%\"\n },\n})\n\nexport type FormatSpecification = z.infer<typeof format_specification.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const set_layer_polarity = defineGerberCommand({\n command_code: \"LP\",\n schema: z\n .object({\n command_code: z.literal(\"LP\").default(\"LP\"),\n polarity: z.enum([\"D\", \"C\"]),\n })\n .describe(\n \"Layer Polarity: Sets the layer polarity to dark or clear. 4.2.1\",\n ),\n stringify({ polarity }) {\n return `%LP${polarity}*%`\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\nimport { getGerberCoordinateWithPadding } from \"../stringify-gerber/get-gerber-coordinate-with-padding\"\n\nconst circle_template = z.object({\n standard_template_code: z.literal(\"C\").describe(\"circle\"),\n diameter: z.number(),\n hole_diameter: z.number().optional(),\n})\n\nconst rectangle_template = z.object({\n standard_template_code: z.literal(\"R\").describe(\"rectangle\"),\n x_size: z.number(),\n y_size: z.number(),\n hole_diameter: z.number().optional(),\n})\n\nconst obround_template = z.object({\n standard_template_code: z.literal(\"O\").describe(\"obround\"),\n x_size: z.number(),\n y_size: z.number(),\n hole_diameter: z.number().optional(),\n})\n\nconst polygon_template = z.object({\n standard_template_code: z.literal(\"P\").describe(\"polygon\"),\n outer_diameter: z.number(),\n number_of_vertices: z.number().int(),\n rotation: z.number().optional(),\n hole_diameter: z.number().optional(),\n})\n\nconst standard_aperture_template_config = z.discriminatedUnion(\n \"standard_template_code\",\n [circle_template, rectangle_template, obround_template, polygon_template],\n)\n\nconst horz_pill_template = z.object({\n macro_name: z.literal(\"HORZPILL\"),\n x_size: z.number(),\n y_size: z.number(),\n circle_diameter: z.number(),\n circle_center_offset: z.number(),\n})\n\nconst vert_pill_template = z.object({\n macro_name: z.literal(\"VERTPILL\"),\n x_size: z.number(),\n y_size: z.number(),\n circle_diameter: z.number(),\n circle_center_offset: z.number(),\n})\n\nconst roundrect_template = z.object({\n macro_name: z.literal(\"ROUNDRECT\"),\n corner_radius: z.number(),\n corner_1_x: z.number(),\n corner_1_y: z.number(),\n corner_2_x: z.number(),\n corner_2_y: z.number(),\n corner_3_x: z.number(),\n corner_3_y: z.number(),\n corner_4_x: z.number(),\n corner_4_y: z.number(),\n})\n\nconst macro_aperture_template_config = z.discriminatedUnion(\"macro_name\", [\n horz_pill_template,\n vert_pill_template,\n roundrect_template,\n])\n\nconst aperture_template_config = z.union([\n standard_aperture_template_config,\n macro_aperture_template_config,\n])\n\nexport const define_aperture_template = defineGerberCommand({\n command_code: \"ADD\",\n schema: aperture_template_config.and(\n z.object({\n command_code: z.literal(\"ADD\").default(\"ADD\"),\n aperture_number: z.number().int(),\n }),\n ),\n stringify(props) {\n if (\"macro_name\" in props) {\n const { aperture_number, macro_name } = props\n let commandString = `%ADD${aperture_number}${macro_name},`\n\n if (macro_name === \"HORZPILL\" || macro_name === \"VERTPILL\") {\n commandString += `${props.x_size.toFixed(6)}X${props.y_size.toFixed(6)}X${props.circle_diameter.toFixed(6)}X${props.circle_center_offset.toFixed(6)}`\n } else if (macro_name === \"ROUNDRECT\") {\n // Handle ROUNDRECT if needed\n throw new Error(\"ROUNDRECT macro not implemented yet\")\n }\n\n commandString += \"*%\"\n return commandString\n }\n if (\"standard_template_code\" in props) {\n const { aperture_number, standard_template_code } = props\n let commandString = `%ADD${aperture_number}${standard_template_code},`\n\n if (standard_template_code === \"C\") {\n commandString += `${props.diameter.toFixed(6)}`\n } else if (\n standard_template_code === \"R\" ||\n standard_template_code === \"O\"\n ) {\n commandString += `${props.x_size.toFixed(6)}X${props.y_size.toFixed(6)}`\n } else if (standard_template_code === \"P\") {\n commandString += `${props.outer_diameter}X${props.number_of_vertices}X${\n props.rotation ? `X${props.rotation}` : \"\"\n }`\n }\n\n if (props.hole_diameter) {\n commandString += `X${props.hole_diameter.toFixed(6)}`\n }\n\n commandString += \"*%\"\n\n return commandString\n }\n throw new Error(\n `Invalid aperture template config: ${JSON.stringify(props)}`,\n )\n },\n})\n\nexport type DefineAperatureTemplateCommand = z.infer<\n typeof define_aperture_template.schema\n>\n\nexport type ApertureTemplateConfig = z.infer<typeof aperture_template_config>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const select_aperture = defineGerberCommand({\n command_code: \"D\",\n schema: z.object({\n command_code: z.literal(\"D\").default(\"D\"),\n aperture_number: z.number().int(),\n }),\n stringify({ aperture_number }) {\n return `D${aperture_number}*`\n },\n})\n","import type { GerberCommandDef } from \"./define-gerber-command\"\nimport type { z } from \"zod\"\n\nimport { add_attribute_on_aperture } from \"./commands/add_attribute_on_aperture\"\nimport { add_attribute_on_file } from \"./commands/add_attribute_on_file\"\nimport { add_attribute_on_object } from \"./commands/add_attribute_on_object\"\nimport { aperture_block } from \"./commands/aperture_block\"\nimport { comment } from \"./commands/comment\"\nimport { create_arc } from \"./commands/create_arc\"\nimport { define_aperture } from \"./commands/define_aperture\"\nimport { define_macro_aperture_template } from \"./commands/define_macro_aperture_template\"\nimport { delete_attribute } from \"./commands/delete_attribute\"\nimport { end_of_file } from \"./commands/end_of_file\"\nimport { end_region_statement } from \"./commands/end_region_statement\"\nimport { flash_operation } from \"./commands/flash_operation\"\nimport { load_mirroring } from \"./commands/load_mirroring\"\nimport { load_polarity } from \"./commands/load_polarity\"\nimport { load_rotation } from \"./commands/load_rotation\"\nimport { load_scaling } from \"./commands/load_scaling\"\nimport { move_operation } from \"./commands/move_operation\"\nimport { plot_operation } from \"./commands/plot_operation\"\nimport { set_coordinate_format } from \"./commands/set_coordinate_format\"\nimport { set_current_aperture_d_code } from \"./commands/set_current_aperture_d_code\"\nimport { set_movement_mode_to_clockwise_circular } from \"./commands/set_movement_mode_to_clockwise_circular\"\nimport { set_movement_mode_to_counterclockwise_circular } from \"./commands/set_movement_mode_to_counterclockwise_circular\"\nimport { set_movement_mode_to_linear } from \"./commands/set_movement_mode_to_linear\"\nimport { set_unit } from \"./commands/set_unit\"\nimport { start_region_statement } from \"./commands/start_region_statement\"\nimport { step_and_repeat } from \"./commands/step_and_repeat\"\nimport { format_specification } from \"./commands/format_specification\"\nimport { set_layer_polarity } from \"./commands/set_layer_polarity\"\nimport { define_aperture_template } from \"./commands/define_aperture_template\"\nimport { select_aperture } from \"./commands/select_aperture\"\n\nexport const gerber_command_map = {\n add_attribute_on_aperture,\n add_attribute_on_file,\n add_attribute_on_object,\n aperture_block,\n comment,\n create_arc,\n define_aperture,\n define_macro_aperture_template,\n delete_attribute,\n end_of_file,\n move_operation,\n flash_operation,\n end_region_statement,\n format_specification,\n // load_mirroring,\n // load_polarity,\n load_rotation,\n // load_scaling,\n plot_operation,\n // set_coordinate_format,\n // set_current_aperture_d_code,\n define_aperture_template,\n set_movement_mode_to_clockwise_circular,\n set_movement_mode_to_counterclockwise_circular,\n set_movement_mode_to_linear,\n select_aperture,\n set_unit,\n set_layer_polarity,\n start_region_statement,\n // step_and_repeat,\n} as const satisfies Record<string, GerberCommandDef<any, any>>\n\nexport type AnyGerberCommand = z.infer<\n (typeof gerber_command_map)[keyof typeof gerber_command_map][\"schema\"]\n>\n","import type { AnyGerberCommand } from \"./any_gerber_command\"\nimport type { z } from \"zod\"\nimport { gerber_command_map } from \"./any_gerber_command\"\n\nexport const gerberBuilder = () => new GerberBuilder()\n\nclass GerberBuilder {\n commands: Array<AnyGerberCommand>\n\n constructor() {\n this.commands = []\n }\n\n $if(\n condition: boolean,\n fn: (gb: GerberBuilder) => GerberBuilder,\n ): GerberBuilder {\n if (condition) {\n return fn(this)\n }\n return this\n }\n\n add<T extends keyof typeof gerber_command_map>(\n cmd: T,\n props: z.input<(typeof gerber_command_map)[T][\"schema\"]>,\n ): GerberBuilder {\n this.commands.push({\n ...({ command_code: gerber_command_map[cmd].command_code } as any),\n ...props,\n })\n return this\n }\n\n build(): Array<AnyGerberCommand> {\n return this.commands\n }\n}\n\n// Type test:\n// gerber()\n// .add(\"add_attribute_on_aperture\", {\n// attribute_name: \"foo\",\n// attribute_value: \"bar\",\n// })\n// .add(\"end_of_file\", {})\n// .build()\n","import type { AnyGerberCommand } from \"../any_gerber_command\"\nimport { gerber_command_map } from \"../any_gerber_command\"\n\nexport const stringifyGerberCommand = (command: AnyGerberCommand): string => {\n const command_def = Object.values(gerber_command_map).find(\n (cmd) => cmd.command_code === command.command_code,\n )\n\n if (!command_def) {\n throw new Error(\n `Command for command_code:\"${command.command_code}\" not found`,\n )\n }\n\n if (!command_def.stringify) {\n throw new Error(\n `Command for command_code:\"${command.command_code}\" does not have a stringify method`,\n )\n }\n\n return command_def.stringify(command as any)\n}\n","import type { AnyGerberCommand } from \"../any_gerber_command\"\nimport { stringifyGerberCommand } from \"./stringify-gerber-command\"\n\nexport const stringifyGerberCommandLayers = (\n commandLayers: Record<string, AnyGerberCommand[]>,\n): Record<string, string> => {\n const stringifiedCommandLayers: Record<string, string> = {}\n for (const layerName of Object.keys(commandLayers)) {\n stringifiedCommandLayers[layerName] = commandLayers[layerName]\n .map((command) => {\n return stringifyGerberCommand(command)\n })\n .join(\"\\n\")\n }\n return stringifiedCommandLayers\n}\n","import type { AnyGerberCommand } from \"../any_gerber_command\"\nimport { stringifyGerberCommand } from \"./stringify-gerber-command\"\n\nexport const stringifyGerberCommands = (\n commands: AnyGerberCommand[],\n): string => {\n return commands\n .map((command) => {\n return stringifyGerberCommand(command)\n })\n .join(\"\\n\")\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 { AnyGerberCommand } from \"../any_gerber_command\"\nimport { gerberBuilder } from \"../gerber-builder\"\n\nexport const defineCommonMacros = (glayer: Array<AnyGerberCommand>) => {\n glayer.push(\n ...gerberBuilder()\n .add(\"comment\", { comment: \"APERTURE MACROS START\" })\n .add(\"define_macro_aperture_template\", {\n macro_name: \"HORZPILL\",\n template_code: `\n0 Horizontal pill (stadium) shape macro*\n0 Parameters:*\n0 $1 = Total width*\n0 $2 = Total height*\n0 $3 = Circle diameter (equal to height)*\n0 $4 = Circle center offset\n0 21 = Center Line(Exposure, Width, Height, Center X, Center Y, Rotation)*\n0 1 = Circle(Exposure, Diameter, Center X, Center Y, Rotation)*\n21,1,$1,$2,0.0,0.0,0.0*\n1,1,$3,0.0-$4,0.0*\n1,1,$3,$4,0.0*\n`.trim(),\n })\n .add(\"define_macro_aperture_template\", {\n macro_name: \"VERTPILL\",\n template_code: `\n0 Vertical pill (stadium) shape macro*\n0 Parameters:*\n0 $1 = Total width*\n0 $2 = Total height*\n0 $3 = Circle diameter (equal to width)*\n0 $4 = Circle center offset\n0 21 = Center Line(Exposure, Width, Height, Center X, Center Y, Rotation)*\n21,1,$1,$2,0.0,0.0,0.0*\n1,1,$3,0.0,0.0-$4*\n1,1,$3,0.0,$4*\n`.trim(),\n })\n .add(\"define_macro_aperture_template\", {\n macro_name: \"RoundRect\",\n template_code: `\n0 Rectangle with rounded corners*\n0 $1 Corner radius*\n0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y Position of each corner*\n0 Polygon box body*\n4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*\n0 Circles for rounded corners*\n1,1,$1+$1,$2,$3*\n1,1,$1+$1,$4,$5*\n1,1,$1+$1,$6,$7*\n1,1,$1+$1,$8,$9*\n0 Rectangles between the rounded corners*\n20,1,$1+$1,$2,$3,$4,$5,0*\n20,1,$1+$1,$4,$5,$6,$7,0*\n20,1,$1+$1,$6,$7,$8,$9,0*\n20,1,$1+$1,$8,$9,$2,$3,0*\n`.trim(),\n })\n .add(\"comment\", { comment: \"APERTURE MACROS END\" })\n .build(),\n )\n}\n","import type {\n PCBHole,\n LayerRef,\n PCBPlatedHole,\n PCBSMTPad,\n PcbCopperText,\n PcbVia,\n PcbHole,\n PcbSolderPaste,\n PcbSilkscreenPath,\n PcbSilkscreenText,\n} from \"circuit-json\"\nimport stableStringify from \"fast-json-stable-stringify\"\nimport type { AnyGerberCommand } from \"../any_gerber_command\"\nimport type { ApertureTemplateConfig } from \"../commands/define_aperture_template\"\nimport { gerberBuilder } from \"../gerber-builder\"\nimport type { GerberLayerName } from \"./GerberLayerName\"\nimport { getAllTraceWidths } from \"./getAllTraceWidths\"\nimport type { AnyCircuitElement } from \"circuit-json\"\n\nconst getLayerRefFromGerberLayerName = (\n glayer_name: GerberLayerName,\n): LayerRef => {\n if (glayer_name.startsWith(\"F_\")) return \"top\"\n if (glayer_name.startsWith(\"B_\")) return \"bottom\"\n\n const innerLayerMatch = glayer_name.match(/^In([1-6])_/)\n if (innerLayerMatch) return `inner${innerLayerMatch[1]}` as LayerRef\n\n throw new Error(`Could not infer layer ref from ${glayer_name}`)\n}\n\nexport function defineAperturesForLayer({\n glayer,\n soup,\n glayer_name,\n}: {\n glayer: AnyGerberCommand[]\n soup: AnyCircuitElement[]\n glayer_name: GerberLayerName\n}) {\n const getNextApertureNumber = () => {\n const highest_aperture_number = glayer.reduce((acc, command) => {\n if (command.command_code === \"ADD\") {\n return Math.max(acc, command.aperture_number)\n }\n return acc\n }, 0)\n if (highest_aperture_number === 0) {\n return 10\n }\n return highest_aperture_number + 1\n }\n\n glayer.push(\n ...gerberBuilder()\n .add(\"comment\", { comment: \"aperture START LIST\" })\n .build(),\n )\n\n // Add all trace width apertures\n const traceWidths: Record<LayerRef, number[]> = getAllTraceWidths(soup)\n const layerRef = getLayerRefFromGerberLayerName(glayer_name)\n for (const width of traceWidths[layerRef]) {\n glayer.push(\n ...gerberBuilder()\n .add(\"define_aperture_template\", {\n aperture_number: getNextApertureNumber(),\n standard_template_code: \"C\",\n diameter: width,\n })\n .build(),\n )\n }\n\n // Add all pcb smtpad, plated hole etc. aperatures\n const apertureConfigs = getAllApertureTemplateConfigsForLayer(soup, layerRef)\n\n for (const apertureConfig of apertureConfigs) {\n glayer.push(\n ...gerberBuilder()\n .add(\"define_aperture_template\", {\n aperture_number: getNextApertureNumber(),\n ...apertureConfig,\n })\n .build(),\n )\n }\n\n glayer.push(\n ...gerberBuilder()\n .add(\"delete_attribute\", {})\n .add(\"comment\", { comment: \"aperture END LIST\" })\n .build(),\n )\n}\n\nexport const getApertureConfigFromPcbSmtpad = (\n elm: PCBSMTPad,\n): ApertureTemplateConfig => {\n if (elm.shape === \"rect\") {\n return {\n standard_template_code: \"R\",\n x_size: elm.width,\n y_size: elm.height,\n }\n }\n if (elm.shape === \"circle\") {\n return {\n standard_template_code: \"C\",\n diameter: elm.radius * 2,\n }\n }\n if (elm.shape === \"rotated_rect\") {\n // Rotation is handled by the LR command, not the aperture definition\n return {\n standard_template_code: \"R\",\n x_size: elm.width,\n y_size: elm.height,\n }\n }\n if (elm.shape === \"polygon\") {\n // Polygon shapes don't use apertures - they're drawn as regions\n throw new Error(\"Polygon SMT pads are drawn as regions, not apertures\")\n }\n throw new Error(`Unsupported shape ${(elm as any).shape}`)\n}\n\nexport const getApertureConfigFromPcbSilkscreenPath = (\n elm: PcbSilkscreenPath,\n): ApertureTemplateConfig => {\n if (\"stroke_width\" in elm) {\n return {\n standard_template_code: \"C\",\n diameter: elm.stroke_width,\n }\n }\n throw new Error(`Provide stroke_width for: ${elm as any}`)\n}\n\nexport const getApertureConfigFromPcbSilkscreenText = (\n elm: PcbSilkscreenText,\n): ApertureTemplateConfig => {\n if (\"font_size\" in elm) {\n return {\n standard_template_code: \"C\",\n diameter: elm.font_size / 8, // font size and diamater have different units of measurement\n }\n }\n throw new Error(`Provide font_size for: ${elm as any}`)\n}\n\nexport const getApertureConfigFromPcbCopperText = (\n elm: PcbCopperText,\n): ApertureTemplateConfig => {\n if (\"font_size\" in elm) {\n return {\n standard_template_code: \"C\",\n diameter: elm.font_size / 8, // font size and diamater have different units of measurement\n }\n }\n throw new Error(`Provide font_size for: ${elm as any}`)\n}\n\nexport const getApertureConfigFromPcbSolderPaste = (\n elm: PcbSolderPaste,\n): ApertureTemplateConfig => {\n if (elm.shape === \"rect\") {\n return {\n standard_template_code: \"R\",\n x_size: elm.width,\n y_size: elm.height,\n }\n }\n if (elm.shape === \"rotated_rect\") {\n // Rotation is handled by the LR command, not the aperture definition\n return {\n standard_template_code: \"R\",\n x_size: elm.width,\n y_size: elm.height,\n }\n }\n if (elm.shape === \"circle\") {\n return {\n standard_template_code: \"C\",\n diameter: elm.radius * 2,\n }\n }\n if (elm.shape === \"pill\") {\n if (!(\"width\" in elm && \"height\" in elm)) {\n throw new Error(\n \"Invalid pill shape in getApertureConfigFromPcbPlatedHole: missing dimensions\",\n )\n }\n if (elm.width >= elm.height) {\n return {\n macro_name: \"HORZPILL\",\n x_size: elm.width,\n y_size: elm.height,\n circle_diameter: Math.min(elm.width, elm.height),\n circle_center_offset: elm.width / 2,\n }\n }\n return {\n macro_name: \"VERTPILL\",\n x_size: elm.width,\n y_size: elm.height,\n circle_diameter: Math.min(elm.width, elm.height),\n circle_center_offset: elm.height / 2,\n }\n }\n throw new Error(`Unsupported shape ${(elm as any).shape}`)\n}\n\nexport const getApertureConfigFromPcbPlatedHole = (\n elm: PCBPlatedHole,\n): ApertureTemplateConfig => {\n if (elm.shape === \"circle\") {\n if (!(\"outer_diameter\" in elm && \"hole_diameter\" in elm)) {\n throw new Error(\n \"Invalid circle shape in getApertureConfigFromPcbPlatedHole: missing diameters\",\n )\n }\n return {\n standard_template_code: \"C\",\n diameter: elm.outer_diameter,\n }\n }\n if (elm.shape === \"pill\") {\n if (!(\"outer_width\" in elm && \"outer_height\" in elm)) {\n throw new Error(\n \"Invalid pill shape in getApertureConfigFromPcbPlatedHole: missing dimensions\",\n )\n }\n\n if (elm.outer_width > elm.outer_height) {\n return {\n macro_name: \"HORZPILL\",\n x_size: elm.outer_width,\n y_size: elm.outer_height,\n circle_diameter: Math.min(elm.outer_width, elm.outer_height),\n circle_center_offset: elm.outer_width / 2,\n }\n }\n return {\n macro_name: \"VERTPILL\",\n x_size: elm.outer_width,\n y_size: elm.outer_height,\n circle_diameter: Math.min(elm.outer_width, elm.outer_height),\n circle_center_offset: elm.outer_height / 2,\n }\n }\n const shape = elm.shape\n if (\n shape === \"circular_hole_with_rect_pad\" ||\n shape === \"pill_hole_with_rect_pad\" ||\n shape === \"rotated_pill_hole_with_rect_pad\"\n ) {\n if (!(\"rect_pad_width\" in elm && \"rect_pad_height\" in elm)) {\n throw new Error(\n `Invalid ${shape} shape in getApertureConfigFromPcbPlatedHole: missing dimensions`,\n )\n }\n return {\n standard_template_code: \"R\",\n x_size: elm.rect_pad_width,\n y_size: elm.rect_pad_height,\n }\n }\n throw new Error(\n `Unsupported shape in getApertureConfigFromPcbPlatedHole: ${elm.shape}`,\n )\n}\n\nexport const getApertureConfigFromCirclePcbHole = (\n elm: PcbHole,\n): ApertureTemplateConfig => {\n if (!(\"hole_diameter\" in elm)) {\n throw new Error(\n `Invalid shape called in getApertureConfigFromCirclePcbHole: ${elm.hole_shape}`,\n )\n }\n return {\n standard_template_code: \"C\",\n diameter: elm.hole_diameter,\n }\n}\n\nexport const getApertureConfigFromPcbVia = (\n elm: PcbVia,\n): ApertureTemplateConfig => {\n if (!(\"outer_diameter\" in elm)) {\n throw new Error(\n \"outer_diameter not specified in getApertureConfigFromPcbVia\",\n )\n }\n return {\n standard_template_code: \"C\",\n diameter: elm.outer_diameter,\n }\n}\n\nfunction getAllApertureTemplateConfigsForLayer(\n soup: AnyCircuitElement[],\n layer: LayerRef,\n): ApertureTemplateConfig[] {\n const configs: ApertureTemplateConfig[] = []\n const configHashMap = new Set<string>()\n\n const addConfigIfNew = (config: ApertureTemplateConfig) => {\n const hash = stableStringify(config)\n if (!configHashMap.has(hash)) {\n configs.push(config)\n configHashMap.add(hash)\n }\n }\n\n for (const elm of soup) {\n if (elm.type === \"pcb_smtpad\") {\n if (elm.layer === layer && elm.shape !== \"polygon\") {\n addConfigIfNew(getApertureConfigFromPcbSmtpad(elm))\n }\n } else if (elm.type === \"pcb_solder_paste\") {\n if (elm.layer === layer) {\n addConfigIfNew(getApertureConfigFromPcbSolderPaste(elm))\n }\n } else if (elm.type === \"pcb_plated_hole\") {\n if (elm.layers.includes(layer)) {\n addConfigIfNew(getApertureConfigFromPcbPlatedHole(elm))\n }\n } else if (elm.type === \"pcb_hole\") {\n if (elm.hole_shape === \"circle\")\n addConfigIfNew(getApertureConfigFromCirclePcbHole(elm))\n else console.warn(\"NOT IMPLEMENTED: drawing gerber for non circle holes\")\n } else if (elm.type === \"pcb_via\") {\n addConfigIfNew(getApertureConfigFromPcbVia(elm))\n } else if (elm.type === \"pcb_silkscreen_path\")\n addConfigIfNew(getApertureConfigFromPcbSilkscreenPath(elm))\n else if (elm.type === \"pcb_silkscreen_text\")\n addConfigIfNew(getApertureConfigFromPcbSilkscreenText(elm))\n else if (elm.type === \"pcb_copper_text\") {\n if (elm.layer === layer)\n addConfigIfNew(getApertureConfigFromPcbCopperText(elm))\n }\n }\n\n return configs\n}\n","import type { AnyCircuitElement, LayerRef, PCBTrace } from \"circuit-json\"\n\nexport function getAllTraceWidths(\n soup: AnyCircuitElement[],\n): Record<LayerRef, number[]> {\n const pcb_traces = soup.filter(\n (elm): elm is PCBTrace => elm.type === \"pcb_trace\",\n )\n\n const widths: Record<LayerRef, Set<number>> = {} as any\n\n for (const trace of pcb_traces) {\n for (const segment of trace.route) {\n if (segment.route_type === \"wire\") {\n widths[segment.layer] = widths[segment.layer] || new Set<number>()\n widths[segment.layer].add(segment.width)\n }\n }\n }\n\n return {\n top: Array.from(widths.top || []),\n inner1: Array.from(widths.inner1 || []),\n inner2: Array.from(widths.inner2 || []),\n inner3: Array.from(widths.inner3 || []),\n inner4: Array.from(widths.inner4 || []),\n inner5: Array.from(widths.inner5 || []),\n inner6: Array.from(widths.inner6 || []),\n bottom: Array.from(widths.bottom || []),\n } as any\n}\n","import type {\n ApertureTemplateConfig,\n DefineAperatureTemplateCommand,\n} from \"../commands/define_aperture_template\"\nimport type { AnyGerberCommand } from \"../any_gerber_command\"\n\nexport const findApertureNumber = (\n glayer: AnyGerberCommand[],\n search_params:\n | {\n trace_width?: number\n }\n | ApertureTemplateConfig,\n): number => {\n let aperture: any\n if (\"trace_width\" in search_params) {\n const trace_width = search_params.trace_width\n aperture = glayer.find(\n (command): command is DefineAperatureTemplateCommand =>\n \"standard_template_code\" in command &&\n command.command_code === \"ADD\" &&\n command.standard_template_code === \"C\" &&\n command.diameter === trace_width,\n )\n } else if (\n \"standard_template_code\" in search_params ||\n \"macro_name\" in search_params\n ) {\n aperture = glayer.find(\n (command): command is DefineAperatureTemplateCommand =>\n command.command_code === \"ADD\" &&\n Object.keys(search_params).every(\n (param_name) =>\n command[param_name as keyof typeof search_params] ===\n search_params[param_name as keyof typeof search_params],\n ),\n )\n }\n\n if (!aperture) {\n // TODO add FileFunction/layer name to this error to help narrow it\n throw new Error(\n `Aperture not found for search params ${JSON.stringify(search_params)}`,\n )\n }\n return aperture.aperture_number\n}\n","{\n \"name\": \"circuit-json-to-gerber\",\n \"version\": \"0.0.51\",\n \"main\": \"dist/index.js\",\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"tsup-node src/index.ts src/cli.ts --format esm --dts --sourcemap\",\n \"format\": \"biome format --write .\",\n \"format:check\": \"biome format .\",\n \"start\": \"bun --bun site/index.html\",\n \"build:site\": \"bun build site/index.html --outdir ./site-export\"\n },\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"circuit-to-gerber\": \"./dist/cli.js\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.8.3\",\n \"@types/archiver\": \"^6.0.3\",\n \"@types/bun\": \"^1.1.8\",\n \"@types/node\": \"^22.5.2\",\n \"@types/react\": \"^19.2.7\",\n \"@types/react-dom\": \"^19.1.5\",\n \"archiver\": \"^7.0.1\",\n \"bun-match-svg\": \"^0.0.13\",\n \"circuit-json\": \"^0.0.421\",\n \"commander\": \"^12.1.0\",\n \"gerber-to-svg\": \"^4.2.8\",\n \"gerberts\": \"^0.0.3\",\n \"jszip\": \"^3.10.1\",\n \"pcb-stackup\": \"^4.2.8\",\n \"react\": \"^19.2.1\",\n \"react-dom\": \"^19.2.1\",\n \"tscircuit\": \"^0.0.1705\",\n \"tsup\": \"^8.2.4\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5.0.0\",\n \"tscircuit\": \"*\",\n \"circuit-json\": \"*\"\n },\n \"dependencies\": {\n \"@tscircuit/alphabet\": \"^0.0.25\",\n \"fast-json-stable-stringify\": \"^2.1.0\",\n \"transformation-matrix\": \"^3.0.0\"\n }\n}\n","import type { LayerRef } from \"circuit-json\"\nimport type { AnyGerberCommand } from \"src/gerber/any_gerber_command\"\nimport { gerberBuilder } from \"../gerber-builder\"\nimport packageJson from \"../../../package.json\"\n\nconst layerAndTypeToFileFunction = {\n \"top-copper\": \"Copper,L1,Top\",\n \"top-soldermask\": \"Soldermask,Top\",\n \"bottom-soldermask\": \"Soldermask,Bot\",\n \"top-silkscreen\": \"Legend,Top\",\n \"bottom-silkscreen\": \"Legend,Bot\",\n \"top-paste\": \"Paste,Top\",\n \"bottom-paste\": \"Paste,Bot\",\n edgecut: \"Profile,NP\",\n}\n\nconst getCopperLayerNumber = (layer: LayerRef, total_layer_count: number) => {\n if (layer === \"top\") return 1\n if (layer === \"bottom\") return total_layer_count\n return Number(layer.replace(\"inner\", \"\")) + 1\n}\n\n/**\n * Returns headers for a Gerber file. Here's a typical header:\n *\n * %TF.GenerationSoftware,KiCad,Pcbnew,8.0.1*%\n * %TF.CreationDate,2024-04-08T11:14:22-07:00*%\n * %TF.ProjectId,,58585858-5858-4585-9858-585858585858,rev?*%\n * %TF.SameCoordinates,Original*%\n * %TF.FileFunction,Copper,L1,Top*%\n * %TF.FilePolarity,Positive*%\n * %FSLAX46Y46*%\n * G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\n * G04 Created by KiCad (PCBNEW 8.0.1) date 2024-04-08 11:14:22*\n * %MOMM*%\n * %LPD*%\n */\nexport const getCommandHeaders = (opts: {\n layer: \"edgecut\" | LayerRef\n layer_type?: \"copper\" | \"soldermask\" | \"silkscreen\" | \"paste\"\n total_layer_count?: number\n}): AnyGerberCommand[] => {\n const total_layer_count = opts.total_layer_count ?? 2\n let file_function: string | undefined\n if (opts.layer_type === \"copper\" && opts.layer !== \"edgecut\") {\n const layerNumber = getCopperLayerNumber(opts.layer, total_layer_count)\n const layerPosition =\n opts.layer === \"top\" ? \"Top\" : opts.layer === \"bottom\" ? \"Bot\" : \"Inr\"\n file_function = `Copper,L${layerNumber},${layerPosition}`\n } else {\n file_function =\n layerAndTypeToFileFunction[\n (opts.layer_type\n ? `${opts.layer}-${opts.layer_type}`\n : opts.layer) as keyof typeof layerAndTypeToFileFunction\n ]\n }\n return (\n gerberBuilder()\n .add(\"add_attribute_on_file\", {\n attribute_name: \"GenerationSoftware\",\n attribute_value: `tscircuit,circuit-json-to-gerber,${packageJson.version}`,\n })\n .add(\"add_attribute_on_file\", {\n attribute_name: \"CreationDate\",\n attribute_value: new Date().toISOString(),\n })\n // .add(\"add_attribute_on_file\", {\n // attribute_name: \"ProjectId\",\n // attribute_value: \"\",\n // })\n .add(\"add_attribute_on_file\", {\n attribute_name: \"SameCoordinates\",\n attribute_value: \"Original\",\n })\n .add(\"add_attribute_on_file\", {\n attribute_name: \"FileFunction\",\n attribute_value: file_function,\n })\n .$if(opts.layer !== \"edgecut\", (gb) =>\n gb.add(\"add_attribute_on_file\", {\n attribute_name: \"FilePolarity\",\n attribute_value:\n opts.layer_type === \"soldermask\" ? \"Negative\" : \"Positive\",\n }),\n )\n .add(\"format_specification\", {})\n .add(\"set_unit\", {\n unit: \"MM\",\n })\n .add(\"comment\", {\n comment: \"Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)\",\n })\n .add(\"comment\", {\n comment: `Created by tscircuit (builder) date ${new Date().toISOString()}`,\n })\n .add(\"set_movement_mode_to_linear\", {})\n .add(\"set_layer_polarity\", {\n polarity: \"D\",\n })\n .add(\"create_arc\", {})\n .build()\n )\n}\n","import type { LayerRef } from \"circuit-json\"\nimport type { GerberLayerName } from \"./GerberLayerName\"\n\nconst layerRefToGerberPrefix = {\n top: \"F_\",\n bottom: \"B_\",\n inner1: \"In1_\",\n inner2: \"In2_\",\n inner3: \"In3_\",\n inner4: \"In4_\",\n inner5: \"In5_\",\n inner6: \"In6_\",\n} as const\nconst layerTypeToGerberSuffix = {\n copper: \"Cu\",\n silkscreen: \"SilkScreen\",\n soldermask: \"Mask\",\n mask: \"Mask\",\n paste: \"Paste\",\n} as const\n\nexport const getGerberLayerName = (\n layer_ref: LayerRef | \"edgecut\",\n layer_type: \"copper\" | \"silkscreen\" | \"soldermask\" | \"paste\",\n): GerberLayerName => {\n if (layer_ref === \"edgecut\") return \"Edge_Cuts\"\n if (layer_ref.startsWith(\"inner\") && layer_type !== \"copper\") {\n throw new Error(`Inner layer ${layer_ref} only supports copper gerbers`)\n }\n return `${layerRefToGerberPrefix[layer_ref as keyof typeof layerRefToGerberPrefix]}${layerTypeToGerberSuffix[layer_type]}` as GerberLayerName\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { pairs } from \"../utils/pairs\"\nimport { gerberBuilder } from \"../gerber-builder\"\nimport type { LayerToGerberCommandsMap } from \"./GerberLayerName\"\nimport { defineCommonMacros } from \"./define-common-macros\"\nimport {\n defineAperturesForLayer,\n getApertureConfigFromCirclePcbHole,\n getApertureConfigFromPcbPlatedHole,\n getApertureConfigFromPcbCopperText,\n getApertureConfigFromPcbSilkscreenPath,\n getApertureConfigFromPcbSilkscreenText,\n getApertureConfigFromPcbSmtpad,\n getApertureConfigFromPcbSolderPaste,\n getApertureConfigFromPcbVia,\n} from \"./defineAperturesForLayer\"\nimport type { PcbCutout } from \"circuit-json\"\nimport { findApertureNumber } from \"./findApertureNumber\"\nimport { getCommandHeaders } from \"./getCommandHeaders\"\nimport { getGerberLayerName } from \"./getGerberLayerName\"\nimport { lineAlphabet } from \"@tscircuit/alphabet\"\nimport {\n applyToPoint,\n compose,\n identity,\n rotate,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport type { AnyGerberCommand } from \"../any_gerber_command\"\nimport type { LayerRef } from \"circuit-json\"\n\nconst getLayerCount = (soup: AnyCircuitElement[]) => {\n const board = soup.find((element) => element.type === \"pcb_board\") as\n | { num_layers?: number }\n | undefined\n const numLayers = board?.num_layers ?? 2\n return Math.max(2, Math.min(8, numLayers))\n}\n\nconst getInnerLayerRefs = (layerCount: number): LayerRef[] =>\n Array.from({ length: layerCount - 2 }, (_, i) => `inner${i + 1}` as LayerRef)\n\nconst getGerberInnerLayerName = (layerRef: LayerRef) => {\n if (!layerRef.startsWith(\"inner\")) {\n throw new Error(`Expected inner layer, got ${layerRef}`)\n }\n return `In${layerRef.replace(\"inner\", \"\")}_Cu` as const\n}\n\n/**\n * Converts tscircuit soup to arrays of Gerber commands for each layer\n */\nexport const convertSoupToGerberCommands = (\n soup: AnyCircuitElement[],\n opts: { flip_y_axis?: boolean } = {},\n): LayerToGerberCommandsMap => {\n opts.flip_y_axis ??= false\n const hasPanel = soup.some((e) => e.type === \"pcb_panel\")\n const layerCount = getLayerCount(soup)\n const innerLayerRefs = getInnerLayerRefs(layerCount)\n const copperLayerRefs = [\"top\", ...innerLayerRefs, \"bottom\"] as LayerRef[]\n const outerLayerRefs = [\"top\", \"bottom\"] as const\n const glayers: LayerToGerberCommandsMap = {\n F_Cu: getCommandHeaders({\n layer: \"top\",\n layer_type: \"copper\",\n total_layer_count: layerCount,\n }),\n F_SilkScreen: getCommandHeaders({\n layer: \"top\",\n layer_type: \"silkscreen\",\n }),\n F_Mask: getCommandHeaders({\n layer: \"top\",\n layer_type: \"soldermask\",\n }),\n F_Paste: getCommandHeaders({\n layer: \"top\",\n layer_type: \"paste\",\n }),\n B_Cu: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"copper\",\n total_layer_count: layerCount,\n }),\n B_SilkScreen: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"silkscreen\",\n }),\n B_Mask: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"soldermask\",\n }),\n B_Paste: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"paste\",\n }),\n Edge_Cuts: getCommandHeaders({\n layer: \"edgecut\",\n }),\n }\n\n for (const innerLayerRef of innerLayerRefs) {\n glayers[getGerberInnerLayerName(innerLayerRef)] = getCommandHeaders({\n layer: innerLayerRef,\n layer_type: \"copper\",\n total_layer_count: layerCount,\n })\n }\n\n const copperGerberLayerNames = copperLayerRefs.map((layerRef) =>\n getGerberLayerName(layerRef, \"copper\"),\n )\n const outerGerberLayerNames = outerLayerRefs.flatMap((layerRef) => [\n getGerberLayerName(layerRef, \"soldermask\"),\n getGerberLayerName(layerRef, \"paste\"),\n getGerberLayerName(layerRef, \"silkscreen\"),\n ])\n\n for (const glayer_name of [\n \"F_Cu\",\n ...copperGerberLayerNames.filter((name) => name !== \"F_Cu\"),\n ...outerGerberLayerNames,\n ] as const) {\n const glayer = glayers[glayer_name]\n defineCommonMacros(glayer)\n defineAperturesForLayer({\n soup,\n glayer,\n glayer_name,\n })\n }\n\n // Edgecuts has a single aperature\n glayers.Edge_Cuts.push(\n ...gerberBuilder()\n .add(\"define_aperture_template\", {\n aperture_number: 10,\n standard_template_code: \"C\",\n diameter: 0.05, //mm\n })\n .build(),\n )\n\n /**\n * \"maybe flip y axis\" to handle y axis negating\n */\n const mfy = (y: number) => (opts.flip_y_axis ? -y : y)\n\n const rotationLookup = new Map<string, number>()\n for (const element of soup) {\n if (\n element.type === \"pcb_plated_hole\" &&\n \"x\" in element &&\n typeof element.x === \"number\" &&\n \"y\" in element &&\n typeof element.y === \"number\"\n ) {\n const rotation =\n \"ccw_rotation\" in element && typeof element.ccw_rotation === \"number\"\n ? element.ccw_rotation\n : 0\n rotationLookup.set(`${element.x}:${element.y}`, rotation)\n }\n }\n\n const renderVectorText = (\n element: any,\n layer: LayerRef,\n layerType: \"copper\" | \"silkscreen\",\n getApertureConfig: (elm: any) => any,\n ) => {\n if (element.layer !== layer) return\n // The acctual Uppercase letters are 70% of the font size\n // sources: https://forum.generic-mapping-tools.org/t/what-exactly-is-the-custom-font-s-height-point-size-ratio/1265/2\n const CAP_HEIGHT_SCALE = 0.7 // Adjust based on your font's metrics\n const glayer = glayers[getGerberLayerName(layer, layerType)]\n const apertureConfig = getApertureConfig(element)\n const gerber = gerberBuilder().add(\"select_aperture\", {\n aperture_number: findApertureNumber(glayer, apertureConfig),\n })\n\n let initialX = element.anchor_position.x\n let initialY = element.anchor_position.y\n const fontSize = element.font_size * CAP_HEIGHT_SCALE\n const letterSpacing = fontSize * 0.4\n const spaceWidth = fontSize * 0.5\n\n const textWidth =\n element.text.split(\"\").reduce((width: number, char: string) => {\n if (char === \" \") {\n return width + spaceWidth + letterSpacing\n }\n return width + fontSize + letterSpacing\n }, 0) - letterSpacing\n\n const textHeight = fontSize\n\n const anchorAlignment =\n element.anchor_alignment ||\n (():\n | \"top_center\"\n | \"bottom_center\"\n | \"center_left\"\n | \"center_right\"\n | undefined => {\n const side = element.anchor_side as\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | undefined\n if (!side) return undefined\n switch (side) {\n case \"top\":\n return \"top_center\"\n case \"bottom\":\n return \"bottom_center\"\n case \"left\":\n return \"center_left\"\n case \"right\":\n return \"center_right\"\n }\n })() ||\n \"center\"\n\n switch (anchorAlignment) {\n case \"top_left\":\n break\n case \"top_center\":\n initialX -= textWidth / 2\n break\n case \"top_right\":\n initialX -= textWidth\n break\n case \"center_right\":\n initialY -= textHeight / 2\n break\n case \"center_left\":\n initialX -= textWidth\n initialY -= textHeight / 2\n break\n case \"bottom_left\":\n initialY -= textHeight\n break\n case \"bottom_center\":\n initialX -= textWidth / 2\n initialY -= textHeight\n break\n case \"bottom_right\":\n initialX -= textWidth\n initialY -= textHeight\n break\n default:\n initialX -= textWidth / 2\n initialY -= textHeight / 2\n break\n }\n\n let anchoredX = initialX\n const anchoredY = initialY\n\n let rotation = element.ccw_rotation || 0\n const cx = anchoredX + textWidth / 2\n const cy = anchoredY + textHeight / 2\n const transforms: Matrix[] = []\n\n const shouldMirror =\n element.is_mirrored !== undefined\n ? element.is_mirrored\n : element.layer === \"bottom\"\n\n if (shouldMirror) {\n transforms.push(\n translate(cx, cy),\n { a: -1, b: 0, c: 0, d: 1, e: 0, f: 0 },\n translate(-cx, -cy),\n )\n rotation = -rotation\n }\n\n if (rotation) {\n const rad = (rotation * Math.PI) / 180\n transforms.push(translate(cx, cy), rotate(rad), translate(-cx, -cy))\n }\n\n const transformMatrix =\n transforms.length > 0 ? compose(...transforms) : undefined\n\n const applyTransform = (point: { x: number; y: number }) =>\n transformMatrix ? applyToPoint(transformMatrix, point) : point\n\n if (layerType === \"copper\" && element.is_knockout) {\n const padding = element.knockout_padding ?? {\n left: 0.2,\n right: 0.2,\n top: 0.2,\n bottom: 0.2,\n }\n\n const paddedRect = [\n { x: initialX - padding.left, y: initialY - padding.top },\n {\n x: initialX + textWidth + padding.right,\n y: initialY - padding.top,\n },\n {\n x: initialX + textWidth + padding.right,\n y: initialY + textHeight + padding.bottom,\n },\n {\n x: initialX - padding.left,\n y: initialY + textHeight + padding.bottom,\n },\n ].map(applyTransform)\n\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(glayer, apertureConfig),\n })\n .add(\"start_region_statement\", {})\n .add(\"move_operation\", {\n x: paddedRect[0].x,\n y: mfy(paddedRect[0].y),\n })\n .add(\"plot_operation\", {\n x: paddedRect[1].x,\n y: mfy(paddedRect[1].y),\n })\n .add(\"plot_operation\", {\n x: paddedRect[2].x,\n y: mfy(paddedRect[2].y),\n })\n .add(\"plot_operation\", {\n x: paddedRect[3].x,\n y: mfy(paddedRect[3].y),\n })\n .add(\"plot_operation\", {\n x: paddedRect[0].x,\n y: mfy(paddedRect[0].y),\n })\n .add(\"end_region_statement\", {})\n .build(),\n )\n\n glayer.push(\n ...gerberBuilder().add(\"set_layer_polarity\", { polarity: \"C\" }).build(),\n )\n }\n\n for (const char of element.text.toUpperCase()) {\n if (char === \" \") {\n anchoredX += spaceWidth + letterSpacing\n continue\n }\n\n const letterPaths = lineAlphabet[char] || []\n for (const path of letterPaths) {\n const x1 = anchoredX + path.x1 * fontSize\n const y1 = anchoredY + path.y1 * fontSize\n const x2 = anchoredX + path.x2 * fontSize\n const y2 = anchoredY + path.y2 * fontSize\n\n const p1 = applyTransform({ x: x1, y: y1 })\n const p2 = applyTransform({ x: x2, y: y2 })\n\n gerber.add(\"move_operation\", { x: p1.x, y: mfy(p1.y) })\n gerber.add(\"plot_operation\", { x: p2.x, y: mfy(p2.y) })\n }\n\n anchoredX += fontSize + letterSpacing\n }\n\n glayer.push(...gerber.build())\n\n if (layerType === \"copper\" && element.is_knockout) {\n glayer.push(\n ...gerberBuilder().add(\"set_layer_polarity\", { polarity: \"D\" }).build(),\n )\n }\n }\n\n // Helper to draw a ring into a gerber builder (used for copper pours)\n const drawRingToBuilder = (\n builder: ReturnType<typeof gerberBuilder>,\n ring: {\n vertices: Array<{ x: number; y: number; bulge?: number }>\n },\n ) => {\n if (!ring || ring.vertices.length === 0) return\n\n builder.add(\"move_operation\", {\n x: ring.vertices[0].x,\n y: mfy(ring.vertices[0].y),\n })\n\n const vertices_loop = [...ring.vertices, ring.vertices[0]]\n\n for (let i = 0; i < vertices_loop.length - 1; i++) {\n const start = vertices_loop[i]\n const end = vertices_loop[i + 1]\n\n if (start.bulge && Math.abs(start.bulge) > 1e-9) {\n const bulge = (opts.flip_y_axis ? -1 : 1) * (start.bulge as number)\n if (bulge > 0) {\n // CCW\n builder.add(\"set_movement_mode_to_counterclockwise_circular\", {})\n } else {\n // CW\n builder.add(\"set_movement_mode_to_clockwise_circular\", {})\n }\n\n const p1 = { x: start.x, y: start.y }\n const p2 = { x: end.x, y: end.y }\n\n const dx = p2.x - p1.x\n const dy = p2.y - p1.y\n const d = Math.sqrt(dx * dx + dy * dy)\n\n if (d < 1e-9) {\n builder.add(\"set_movement_mode_to_linear\", {})\n builder.add(\"plot_operation\", {\n x: end.x,\n y: mfy(end.y),\n })\n continue\n }\n\n const abs_b = Math.abs(bulge)\n const theta = 4 * Math.atan(abs_b)\n if (Math.abs(Math.sin(theta / 2)) < 1e-9) {\n builder.add(\"set_movement_mode_to_linear\", {})\n builder.add(\"plot_operation\", {\n x: end.x,\n y: mfy(end.y),\n })\n continue\n }\n const R = d / (2 * Math.sin(theta / 2))\n const alpha = (Math.PI - theta) / 2\n const phi = Math.atan2(dy, dx)\n const delta_angle = bulge > 0 ? alpha : -alpha\n const angle_p1_center = phi + delta_angle\n const Cx = p1.x + R * Math.cos(angle_p1_center)\n const Cy = p1.y + R * Math.sin(angle_p1_center)\n\n const i_offset = Cx - p1.x\n const j_offset = Cy - p1.y\n\n builder.add(\"plot_operation\", {\n x: end.x,\n y: mfy(end.y),\n i: i_offset,\n j: opts.flip_y_axis ? -j_offset : j_offset,\n })\n } else {\n // line\n builder.add(\"set_movement_mode_to_linear\", {})\n builder.add(\"plot_operation\", { x: end.x, y: mfy(end.y) })\n }\n }\n }\n\n // To conform to Gerber spec (CCW outer, CW inner) from tscircuit\n // spec (CW outer, CCW inner), we must reverse both.\n const reverseRing = (ring: {\n vertices: Array<{ x: number; y: number; bulge?: number }>\n }): {\n vertices: Array<{ x: number; y: number; bulge?: number }>\n } => {\n const { vertices } = ring\n if (!vertices || vertices.length === 0) return { vertices: [] }\n const n = vertices.length\n\n const reversed_pts = [...vertices].reverse()\n\n const new_vertices = reversed_pts.map((pt, i) => {\n const bulge_v_idx = (n - 2 - i + n) % n\n const bulge = vertices[bulge_v_idx].bulge\n return { ...pt, bulge: bulge ? -bulge : undefined }\n })\n\n return { vertices: new_vertices }\n }\n\n // FIRST PASS: Process copper pours first\n // Copper pours must be rendered before traces/pads/vias so that:\n // 1. Pour is drawn (LPD - dark)\n // 2. Cutouts are drawn (LPC - clear)\n // 3. Traces/pads/vias are drawn on top (LPD - dark)\n for (const layer of copperLayerRefs) {\n for (const element of soup) {\n if (element.type === \"pcb_copper_pour\" && layer === element.layer) {\n const copper_glayer = glayers[getGerberLayerName(layer, \"copper\")]\n\n // Collect all pour commands for this element\n const all_pour_commands: AnyGerberCommand[] = []\n\n if (element.shape === \"brep\") {\n const { brep_shape } = element\n if (!brep_shape) continue\n const { outer_ring, inner_rings } = brep_shape\n\n // Draw outer ring as a filled region (dark polarity - default)\n const outer_builder = gerberBuilder()\n .add(\"select_aperture\", { aperture_number: 10 })\n .add(\"start_region_statement\", {})\n\n drawRingToBuilder(outer_builder, reverseRing(outer_ring))\n\n outer_builder.add(\"end_region_statement\", {})\n all_pour_commands.push(...outer_builder.build())\n\n // Draw inner rings (cutouts) using clear polarity\n // Each inner ring is drawn as a separate region with LPC (clear)\n if (inner_rings && inner_rings.length > 0) {\n // Switch to clear polarity\n all_pour_commands.push(\n ...gerberBuilder()\n .add(\"set_layer_polarity\", { polarity: \"C\" })\n .build(),\n )\n\n for (const inner_ring of inner_rings) {\n const inner_builder = gerberBuilder()\n .add(\"select_aperture\", { aperture_number: 10 })\n .add(\"start_region_statement\", {})\n\n // For clear polarity, we don't need to reverse - draw as-is\n // The polarity handles the \"hole\" semantics\n drawRingToBuilder(inner_builder, inner_ring)\n\n inner_builder.add(\"end_region_statement\", {})\n all_pour_commands.push(...inner_builder.build())\n }\n\n // Switch back to dark polarity\n all_pour_commands.push(\n ...gerberBuilder()\n .add(\"set_layer_polarity\", { polarity: \"D\" })\n .build(),\n )\n }\n } else if (element.shape === \"rect\") {\n const { center, width, height, rotation } = element\n const w = (width as number) / 2\n const h = (height as number) / 2\n\n const points = [\n { x: -w, y: h }, // Top-left\n { x: w, y: h }, // Top-right\n { x: w, y: -h }, // Bottom-right\n { x: -w, y: -h }, // Bottom-left\n ]\n\n let transformMatrix = identity()\n if (rotation) {\n const angle_rad = ((rotation as number) * Math.PI) / 180\n transformMatrix = rotate(angle_rad)\n }\n transformMatrix = compose(\n translate(center.x, center.y),\n transformMatrix,\n )\n\n const transformedPoints = points.map((p) =>\n applyToPoint(transformMatrix, p),\n )\n\n const rect_builder = gerberBuilder()\n .add(\"select_aperture\", { aperture_number: 10 })\n .add(\"start_region_statement\", {})\n\n rect_builder.add(\"move_operation\", {\n x: transformedPoints[0].x,\n y: mfy(transformedPoints[0].y),\n })\n for (let i = 1; i < transformedPoints.length; i++) {\n rect_builder.add(\"plot_operation\", {\n x: transformedPoints[i].x,\n y: mfy(transformedPoints[i].y),\n })\n }\n rect_builder.add(\"plot_operation\", {\n x: transformedPoints[0].x,\n y: mfy(transformedPoints[0].y),\n })\n\n rect_builder.add(\"end_region_statement\", {})\n all_pour_commands.push(...rect_builder.build())\n } else if (element.shape === \"polygon\") {\n const { points } = element\n if (points.length > 0) {\n const poly_builder = gerberBuilder()\n .add(\"select_aperture\", { aperture_number: 10 })\n .add(\"start_region_statement\", {})\n\n poly_builder.add(\"move_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n for (let i = 1; i < points.length; i++) {\n poly_builder.add(\"plot_operation\", {\n x: points[i].x,\n y: mfy(points[i].y),\n })\n }\n poly_builder.add(\"plot_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n\n poly_builder.add(\"end_region_statement\", {})\n all_pour_commands.push(...poly_builder.build())\n }\n }\n\n copper_glayer.push(...all_pour_commands)\n\n if (element.covered_with_solder_mask === false) {\n const mask_layer = glayers[getGerberLayerName(layer, \"soldermask\")]\n mask_layer.push(...all_pour_commands)\n }\n }\n }\n }\n\n // SECOND PASS: Process all other elements (traces, pads, vias, etc.)\n for (const layer of [...copperLayerRefs, \"edgecut\"] as const) {\n for (const element of soup) {\n if (element.type === \"pcb_trace\") {\n const { route } = element\n for (const [a, b] of pairs(route)) {\n // TODO b kind of matters here, this doesn't handle a bunch of cases\n // but the definition of a route is also kind of broken, a \"wire\" is\n // a relationship between two points and can't really be a type of\n // point\n if (a.route_type === \"wire\") {\n if (a.layer === layer) {\n const glayer = glayers[getGerberLayerName(layer, \"copper\")]\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(glayer, {\n trace_width: a.width,\n }),\n })\n .add(\"move_operation\", { x: a.x, y: mfy(a.y) })\n .add(\"plot_operation\", { x: b.x, y: mfy(b.y) })\n .build(),\n )\n }\n }\n }\n } else if (\n element.type === \"pcb_silkscreen_path\" &&\n outerLayerRefs.includes(layer as any)\n ) {\n if (element.layer === layer) {\n const glayer = glayers[getGerberLayerName(layer, \"silkscreen\")]\n const apertureConfig = getApertureConfigFromPcbSilkscreenPath(element)\n const gerber = gerberBuilder().add(\"select_aperture\", {\n aperture_number: findApertureNumber(glayer, apertureConfig),\n })\n // Move to the first point\n if (element.route.length > 0) {\n gerber.add(\"move_operation\", {\n x: element.route[0].x,\n y: mfy(element.route[0].y),\n })\n }\n\n // Plot lines to subsequent points\n for (let i = 1; i < element.route.length; i++) {\n gerber.add(\"plot_operation\", {\n x: element.route[i].x,\n y: mfy(element.route[i].y),\n })\n }\n\n glayer.push(...gerber.build())\n }\n } else if (\n element.type === \"pcb_silkscreen_text\" &&\n outerLayerRefs.includes(layer as any)\n ) {\n renderVectorText(\n element,\n layer as LayerRef,\n \"silkscreen\",\n getApertureConfigFromPcbSilkscreenText,\n )\n } else if (element.type === \"pcb_copper_text\" && layer !== \"edgecut\") {\n renderVectorText(\n element,\n layer,\n \"copper\",\n getApertureConfigFromPcbCopperText,\n )\n } else if (element.type === \"pcb_smtpad\" && element.shape !== \"polygon\") {\n if (element.layer === layer && outerLayerRefs.includes(layer as any)) {\n for (const glayer of [\n glayers[getGerberLayerName(layer, \"copper\")],\n glayers[getGerberLayerName(layer, \"soldermask\")],\n ]) {\n const apertureConfig = getApertureConfigFromPcbSmtpad(element)\n const apertureNumber = findApertureNumber(glayer, apertureConfig)\n const gb = gerberBuilder().add(\"select_aperture\", {\n aperture_number: apertureNumber,\n })\n\n if (element.shape === \"rotated_rect\" && element.ccw_rotation) {\n gb.add(\"load_rotation\", {\n rotation_degrees: element.ccw_rotation,\n })\n }\n\n gb.add(\"flash_operation\", { x: element.x, y: mfy(element.y) })\n\n if (element.shape === \"rotated_rect\" && element.ccw_rotation) {\n // Reset rotation\n gb.add(\"load_rotation\", { rotation_degrees: 0 })\n }\n\n glayer.push(...gb.build())\n }\n }\n } else if (element.type === \"pcb_smtpad\" && element.shape === \"polygon\") {\n if (element.layer === layer && outerLayerRefs.includes(layer as any)) {\n const layers_to_add_to = [\n glayers[getGerberLayerName(layer, \"copper\")],\n ]\n\n // Add to soldermask layer unless explicitly covered\n if (\n !(\"is_covered_with_solder_mask\" in element) ||\n element.is_covered_with_solder_mask !== false\n ) {\n layers_to_add_to.push(\n glayers[getGerberLayerName(layer, \"soldermask\")],\n )\n }\n\n for (const glayer of layers_to_add_to) {\n const pad_builder = gerberBuilder()\n .add(\"select_aperture\", { aperture_number: 10 })\n .add(\"start_region_statement\", {})\n\n const { points } = element\n if (points && points.length > 0) {\n pad_builder.add(\"move_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n for (let i = 1; i < points.length; i++) {\n pad_builder.add(\"plot_operation\", {\n x: points[i].x,\n y: mfy(points[i].y),\n })\n }\n pad_builder.add(\"plot_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n }\n\n pad_builder.add(\"end_region_statement\", {})\n\n glayer.push(...pad_builder.build())\n }\n }\n } else if (element.type === \"pcb_solder_paste\") {\n if (element.layer === layer && outerLayerRefs.includes(layer as any)) {\n const glayer = glayers[getGerberLayerName(layer, \"paste\")]\n const aperture_number = findApertureNumber(\n glayer,\n getApertureConfigFromPcbSolderPaste(element),\n )\n const rotation =\n \"ccw_rotation\" in element &&\n typeof element.ccw_rotation === \"number\"\n ? element.ccw_rotation\n : (rotationLookup.get(`${element.x}:${element.y}`) ?? 0)\n\n const gb = gerberBuilder().add(\"select_aperture\", {\n aperture_number,\n })\n if (rotation) {\n gb.add(\"load_rotation\", { rotation_degrees: rotation })\n }\n gb.add(\"flash_operation\", { x: element.x, y: mfy(element.y) })\n if (rotation) {\n gb.add(\"load_rotation\", { rotation_degrees: 0 })\n }\n glayer.push(...gb.build())\n }\n } else if (element.type === \"pcb_plated_hole\") {\n if (element.layers.includes(layer as any)) {\n const layersToAddTo = [\n glayers[getGerberLayerName(layer, \"copper\")],\n ] as AnyGerberCommand[][]\n if (outerLayerRefs.includes(layer as any)) {\n layersToAddTo.push(glayers[getGerberLayerName(layer, \"soldermask\")])\n }\n for (const glayer of layersToAddTo) {\n // --- Compute effective copper pad dimensions ---\n const holeW =\n \"hole_width\" in element && typeof element.hole_width === \"number\"\n ? element.hole_width\n : 0\n const holeH =\n \"hole_height\" in element &&\n typeof element.hole_height === \"number\"\n ? element.hole_height\n : 0\n\n const padWidthCandidates: number[] = [holeW]\n if (\n \"outer_width\" in element &&\n typeof element.outer_width === \"number\"\n ) {\n padWidthCandidates.push(element.outer_width)\n }\n if (\n \"rect_pad_width\" in element &&\n typeof element.rect_pad_width === \"number\"\n ) {\n padWidthCandidates.push(element.rect_pad_width)\n }\n const padW = Math.max(...padWidthCandidates)\n\n const padHeightCandidates: number[] = [holeH]\n if (\n \"outer_height\" in element &&\n typeof element.outer_height === \"number\"\n ) {\n padHeightCandidates.push(element.outer_height)\n }\n if (\n \"rect_pad_height\" in element &&\n typeof element.rect_pad_height === \"number\"\n ) {\n padHeightCandidates.push(element.rect_pad_height)\n }\n const padH = Math.max(...padHeightCandidates)\n\n if (element.shape === \"pill\") {\n // Use min dimension as slot width (aperture circle)\n const circleApertureConfig = {\n standard_template_code: \"C\" as const,\n diameter: Math.min(padW, padH),\n }\n\n let aperture_number: number\n try {\n aperture_number = findApertureNumber(\n glayer,\n circleApertureConfig,\n )\n } catch {\n aperture_number =\n Math.max(\n ...glayer\n .filter((cmd) => \"aperture_number\" in cmd)\n .map((cmd) => cmd.aperture_number),\n 9,\n ) + 1\n\n glayer.push(\n ...gerberBuilder()\n .add(\"define_aperture_template\", {\n aperture_number,\n ...circleApertureConfig,\n })\n .build(),\n )\n }\n\n const gb = gerberBuilder().add(\"select_aperture\", {\n aperture_number,\n })\n\n const rotationRadians =\n ((element.ccw_rotation ?? 0) * Math.PI) / 180\n const cosTheta = Math.cos(rotationRadians)\n const sinTheta = Math.sin(rotationRadians)\n\n const rotateAndTranslate = (dx: number, dy: number) => {\n const rotatedX = dx * cosTheta - dy * sinTheta\n const rotatedY = dx * sinTheta + dy * cosTheta\n return {\n x: element.x + rotatedX,\n y: element.y + rotatedY,\n }\n }\n\n const isHorizontal = padW >= padH\n const offset = isHorizontal\n ? (padW - padH) / 2\n : (padH - padW) / 2\n\n if (offset <= 0) {\n const center = rotateAndTranslate(0, 0)\n gb.add(\"flash_operation\", { x: center.x, y: mfy(center.y) })\n } else {\n const startRelative = isHorizontal\n ? { x: -offset, y: 0 }\n : { x: 0, y: -offset }\n const endRelative = isHorizontal\n ? { x: offset, y: 0 }\n : { x: 0, y: offset }\n\n const startPoint = rotateAndTranslate(\n startRelative.x,\n startRelative.y,\n )\n const endPoint = rotateAndTranslate(\n endRelative.x,\n endRelative.y,\n )\n\n gb.add(\"flash_operation\", {\n x: startPoint.x,\n y: mfy(startPoint.y),\n })\n .add(\"move_operation\", {\n x: startPoint.x,\n y: mfy(startPoint.y),\n })\n .add(\"plot_operation\", {\n x: endPoint.x,\n y: mfy(endPoint.y),\n })\n .add(\"flash_operation\", {\n x: endPoint.x,\n y: mfy(endPoint.y),\n })\n }\n\n glayer.push(...gb.build())\n } else {\n // Non-pill shapes (rect, circle)\n const apertureConfig = getApertureConfigFromPcbPlatedHole({\n ...element,\n ...(element.shape !== \"circle\"\n ? { outer_width: padW, outer_height: padH }\n : {}),\n })\n const rotation =\n \"rect_ccw_rotation\" in element &&\n typeof element.rect_ccw_rotation === \"number\" &&\n Math.abs(padW - padH) > 1e-9\n ? element.rect_ccw_rotation\n : undefined\n\n const gb = gerberBuilder().add(\"select_aperture\", {\n aperture_number: findApertureNumber(glayer, apertureConfig),\n })\n\n if (rotation)\n gb.add(\"load_rotation\", { rotation_degrees: rotation })\n\n gb.add(\"flash_operation\", { x: element.x, y: mfy(element.y) })\n\n if (rotation) gb.add(\"load_rotation\", { rotation_degrees: 0 })\n\n glayer.push(...gb.build())\n }\n }\n }\n } else if (element.type === \"pcb_hole\") {\n if (outerLayerRefs.includes(layer as any)) {\n for (const glayer of [\n glayers[getGerberLayerName(layer, \"soldermask\")],\n ]) {\n if (element.hole_shape !== \"circle\") {\n console.warn(\n \"NOT IMPLEMENTED: drawing gerber for non-round holes\",\n )\n continue\n }\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(\n glayer,\n getApertureConfigFromCirclePcbHole(element),\n ),\n })\n .add(\"flash_operation\", { x: element.x, y: mfy(element.y) })\n .build(),\n )\n }\n }\n } else if (element.type === \"pcb_via\") {\n if (element.layers.includes(layer as any)) {\n for (const glayer of [glayers[getGerberLayerName(layer, \"copper\")]]) {\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(\n glayer,\n getApertureConfigFromPcbVia(element),\n ),\n })\n .add(\"flash_operation\", { x: element.x, y: mfy(element.y) })\n .build(),\n )\n }\n }\n } else if (element.type === \"pcb_board\" && layer === \"edgecut\") {\n // Skip boards when a panel exists\n if (hasPanel) continue\n\n const glayer = glayers.Edge_Cuts\n const { width, height, center, outline } = element\n const gerberBuild = gerberBuilder().add(\"select_aperture\", {\n aperture_number: 10,\n })\n if (outline && outline.length > 2) {\n const outlinePoints = outline.map((point) => ({\n x: point.x,\n y: mfy(point.y),\n }))\n\n const firstPoint = outlinePoints[0]\n gerberBuild.add(\"move_operation\", firstPoint)\n for (let i = 1; i < outlinePoints.length; i++) {\n gerberBuild.add(\"plot_operation\", outlinePoints[i])\n }\n\n const lastPoint = outlinePoints[outlinePoints.length - 1]\n if (lastPoint.x !== firstPoint.x || lastPoint.y !== firstPoint.y) {\n gerberBuild.add(\"plot_operation\", firstPoint)\n }\n } else {\n gerberBuild\n .add(\"move_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n .add(\"plot_operation\", {\n x: center!.x + width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n // .add(\"move_operation\", {\n // x: center.x + width / 2,\n // y: center.y - height / 2,\n // })\n .add(\"plot_operation\", {\n x: center!.x + width! / 2,\n y: mfy(center!.y + height! / 2),\n })\n // .add(\"move_operation\", {\n // x: center.x + width / 2,\n // y: center.y + height / 2,\n // })\n .add(\"plot_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y + height! / 2),\n })\n // .add(\"move_operation\", {\n // x: center.x - width / 2,\n // y: center.y + height / 2,\n // })\n .add(\"plot_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n }\n\n glayer.push(...gerberBuild.build())\n } else if (element.type === \"pcb_panel\" && layer === \"edgecut\") {\n const glayer = glayers.Edge_Cuts\n const panel = element\n const { width, height, center } = panel\n const gerberBuild = gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: 10,\n })\n .add(\"move_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n .add(\"plot_operation\", {\n x: center!.x + width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n .add(\"plot_operation\", {\n x: center!.x + width! / 2,\n y: mfy(center!.y + height! / 2),\n })\n .add(\"plot_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y + height! / 2),\n })\n .add(\"plot_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n\n glayer.push(...gerberBuild.build())\n } else if (element.type === \"pcb_cutout\") {\n if (layer === \"edgecut\") {\n const ec_layer = glayers.Edge_Cuts\n const cutout_builder = gerberBuilder().add(\"select_aperture\", {\n aperture_number: 10,\n })\n\n const el = element as PcbCutout\n\n if (el.shape === \"rect\") {\n const { center, width, height, rotation, corner_radius } = el\n const w = width / 2\n const h = height / 2\n const r = Math.max(\n 0,\n Math.min(corner_radius ?? 0, Math.abs(w), Math.abs(h)),\n )\n\n const makeTransformMatrix = () => {\n let transformMatrix = identity()\n if (rotation) {\n const angle_rad = (rotation * Math.PI) / 180\n transformMatrix = rotate(angle_rad)\n }\n return compose(translate(center.x, center.y), transformMatrix)\n }\n\n const transformMatrix = makeTransformMatrix()\n\n if (r > 0) {\n const startPoint = { x: -w + r, y: h }\n\n let currentPoint = applyToPoint(transformMatrix, startPoint)\n\n cutout_builder.add(\"move_operation\", {\n x: currentPoint.x,\n y: mfy(currentPoint.y),\n })\n\n const addLine = (point: { x: number; y: number }) => {\n const transformedPoint = applyToPoint(transformMatrix, point)\n cutout_builder.add(\"plot_operation\", {\n x: transformedPoint.x,\n y: mfy(transformedPoint.y),\n })\n currentPoint = transformedPoint\n }\n\n const addArc = (options: {\n point: { x: number; y: number }\n center: { x: number; y: number }\n }) => {\n const transformedPoint = applyToPoint(\n transformMatrix,\n options.point,\n )\n const transformedCenter = applyToPoint(\n transformMatrix,\n options.center,\n )\n\n cutout_builder\n .add(\"set_movement_mode_to_clockwise_circular\", {})\n .add(\"plot_operation\", {\n x: transformedPoint.x,\n y: mfy(transformedPoint.y),\n i: transformedCenter.x - currentPoint.x,\n j: mfy(transformedCenter.y) - mfy(currentPoint.y),\n })\n .add(\"set_movement_mode_to_linear\", {})\n\n currentPoint = transformedPoint\n }\n\n addLine({ x: w - r, y: h })\n addArc({\n point: { x: w, y: h - r },\n center: { x: w - r, y: h - r },\n })\n addLine({ x: w, y: -h + r })\n addArc({\n point: { x: w - r, y: -h },\n center: { x: w - r, y: -h + r },\n })\n addLine({ x: -w + r, y: -h })\n addArc({\n point: { x: -w, y: -h + r },\n center: { x: -w + r, y: -h + r },\n })\n addLine({ x: -w, y: h - r })\n addArc({\n point: { x: -w + r, y: h },\n center: { x: -w + r, y: h - r },\n })\n } else {\n const points = [\n { x: -w, y: h }, // Top-left\n { x: w, y: h }, // Top-right\n { x: w, y: -h }, // Bottom-right\n { x: -w, y: -h }, // Bottom-left\n ]\n\n const transformedPoints = points.map((p) =>\n applyToPoint(transformMatrix, p),\n )\n\n cutout_builder.add(\"move_operation\", {\n x: transformedPoints[0].x,\n y: mfy(transformedPoints[0].y),\n })\n for (let i = 1; i < transformedPoints.length; i++) {\n cutout_builder.add(\"plot_operation\", {\n x: transformedPoints[i].x,\n y: mfy(transformedPoints[i].y),\n })\n }\n cutout_builder.add(\"plot_operation\", {\n x: transformedPoints[0].x,\n y: mfy(transformedPoints[0].y),\n })\n }\n } else if (el.shape === \"circle\") {\n const { center, radius } = el\n\n // To draw a circle, we draw two semi-circles\n const p1 = { x: center.x + radius, y: center.y }\n const p2 = { x: center.x - radius, y: center.y }\n\n cutout_builder\n .add(\"move_operation\", {\n x: p1.x,\n y: mfy(p1.y),\n })\n .add(\"set_movement_mode_to_counterclockwise_circular\", {})\n // Draw the first semi-circle (top half if we start from rightmost point)\n .add(\"plot_operation\", {\n x: p2.x,\n y: mfy(p2.y),\n i: -radius,\n j: 0,\n })\n // Draw the second semi-circle (bottom half)\n .add(\"plot_operation\", {\n x: p1.x,\n y: mfy(p1.y),\n i: radius,\n j: 0,\n })\n .add(\"set_movement_mode_to_linear\", {})\n } else if (el.shape === \"polygon\") {\n const { points } = el\n if (points.length > 0) {\n cutout_builder.add(\"move_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n for (let i = 1; i < points.length; i++) {\n cutout_builder.add(\"plot_operation\", {\n x: points[i].x,\n y: mfy(points[i].y),\n })\n }\n cutout_builder.add(\"plot_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n }\n }\n ec_layer.push(...cutout_builder.build())\n }\n }\n }\n }\n\n for (const key of Object.keys(glayers)) {\n glayers[key as keyof LayerToGerberCommandsMap].push(\n ...gerberBuilder().add(\"end_of_file\", {}).build(),\n )\n }\n\n return glayers\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","transformMatrix"]}
|
package/dist/cli.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -79,8 +79,8 @@ declare const excellon_drill_command_map: {
|
|
|
79
79
|
command_code: z.ZodDefault<z.ZodLiteral<"aper_function_header">>;
|
|
80
80
|
is_plated: z.ZodBoolean;
|
|
81
81
|
}, "strip", z.ZodTypeAny, {
|
|
82
|
-
is_plated: boolean;
|
|
83
82
|
command_code: "aper_function_header";
|
|
83
|
+
is_plated: boolean;
|
|
84
84
|
}, {
|
|
85
85
|
is_plated: boolean;
|
|
86
86
|
command_code?: "aper_function_header" | undefined;
|
|
@@ -610,9 +610,9 @@ declare const gerber_command_map: {
|
|
|
610
610
|
polarity: z.ZodEnum<["D", "C"]>;
|
|
611
611
|
}, "strip", z.ZodTypeAny, {
|
|
612
612
|
command_code: "LP";
|
|
613
|
-
polarity: "
|
|
613
|
+
polarity: "D" | "C";
|
|
614
614
|
}, {
|
|
615
|
-
polarity: "
|
|
615
|
+
polarity: "D" | "C";
|
|
616
616
|
command_code?: "LP" | undefined;
|
|
617
617
|
}>>;
|
|
618
618
|
readonly start_region_statement: GerberCommandDef<"G36", z.ZodObject<{
|
|
@@ -634,7 +634,14 @@ declare class GerberBuilder {
|
|
|
634
634
|
build(): Array<AnyGerberCommand>;
|
|
635
635
|
}
|
|
636
636
|
|
|
637
|
+
declare const stringifyGerberCommandLayers: (commandLayers: Record<string, AnyGerberCommand[]>) => Record<string, string>;
|
|
638
|
+
|
|
639
|
+
declare const stringifyGerberCommand: (command: AnyGerberCommand) => string;
|
|
640
|
+
|
|
641
|
+
declare const stringifyGerberCommands: (commands: AnyGerberCommand[]) => string;
|
|
642
|
+
|
|
637
643
|
type LayerToGerberCommandsMap = {
|
|
644
|
+
[key: string]: AnyGerberCommand[];
|
|
638
645
|
F_Cu: AnyGerberCommand[];
|
|
639
646
|
F_SilkScreen: AnyGerberCommand[];
|
|
640
647
|
F_Mask: AnyGerberCommand[];
|
|
@@ -645,13 +652,6 @@ type LayerToGerberCommandsMap = {
|
|
|
645
652
|
B_Paste: AnyGerberCommand[];
|
|
646
653
|
Edge_Cuts: AnyGerberCommand[];
|
|
647
654
|
};
|
|
648
|
-
type GerberLayerName = keyof LayerToGerberCommandsMap;
|
|
649
|
-
|
|
650
|
-
declare const stringifyGerberCommandLayers: (commandLayers: Record<GerberLayerName, AnyGerberCommand[]>) => Record<GerberLayerName, string>;
|
|
651
|
-
|
|
652
|
-
declare const stringifyGerberCommand: (command: AnyGerberCommand) => string;
|
|
653
|
-
|
|
654
|
-
declare const stringifyGerberCommands: (commands: AnyGerberCommand[]) => string;
|
|
655
655
|
|
|
656
656
|
/**
|
|
657
657
|
* Converts tscircuit soup to arrays of Gerber commands for each layer
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/excellon-drill/commands/FMAT.ts","../src/excellon-drill/define-excellon-drill-command.ts","../src/excellon-drill/commands/G00.ts","../src/excellon-drill/commands/G01.ts","../src/excellon-drill/commands/G05.ts","../src/excellon-drill/commands/G85.ts","../src/excellon-drill/commands/G90.ts","../src/excellon-drill/commands/M15.ts","../src/excellon-drill/commands/M16.ts","../src/excellon-drill/commands/M30.ts","../src/excellon-drill/commands/M48.ts","../src/excellon-drill/commands/M95.ts","../src/excellon-drill/commands/define_tool.ts","../src/excellon-drill/commands/drill_at.ts","../src/excellon-drill/commands/header_attribute.ts","../src/excellon-drill/commands/header_comment.ts","../src/excellon-drill/commands/rewind.ts","../src/excellon-drill/commands/unit_format.ts","../src/excellon-drill/commands/use_tool.ts","../src/excellon-drill/commands/aper_function_header.ts","../src/excellon-drill/commands/percent_sign.ts","../src/excellon-drill/any-excellon-drill-command-map.ts","../src/excellon-drill/stringify-excellon-drill.ts","../src/excellon-drill/excellon-drill-builder.ts","../src/excellon-drill/convert-soup-to-excellon-drill-commands.ts","../src/gerber/commands/add_attribute_on_aperture.ts","../src/gerber/define-gerber-command.ts","../src/gerber/commands/add_attribute_on_file.ts","../src/gerber/commands/add_attribute_on_object.ts","../src/gerber/commands/aperture_block.ts","../src/gerber/commands/comment.ts","../src/gerber/commands/create_arc.ts","../src/gerber/commands/define_aperture.ts","../src/gerber/commands/define_macro_aperture_template.ts","../src/gerber/commands/delete_attribute.ts","../src/gerber/commands/end_of_file.ts","../src/gerber/commands/end_region_statement.ts","../src/gerber/commands/flash_operation.ts","../src/gerber/stringify-gerber/get-gerber-coordinate-with-padding.ts","../src/gerber/commands/load_mirroring.ts","../src/gerber/commands/load_polarity.ts","../src/gerber/commands/load_rotation.ts","../src/gerber/commands/load_scaling.ts","../src/gerber/commands/move_operation.ts","../src/gerber/commands/plot_operation.ts","../src/gerber/commands/set_coordinate_format.ts","../src/gerber/commands/set_current_aperture_d_code.ts","../src/gerber/commands/set_movement_mode_to_clockwise_circular.ts","../src/gerber/commands/set_movement_mode_to_counterclockwise_circular.ts","../src/gerber/commands/set_movement_mode_to_linear.ts","../src/gerber/commands/set_unit.ts","../src/gerber/commands/start_region_statement.ts","../src/gerber/commands/step_and_repeat.ts","../src/gerber/commands/format_specification.ts","../src/gerber/commands/set_layer_polarity.ts","../src/gerber/commands/define_aperture_template.ts","../src/gerber/commands/select_aperture.ts","../src/gerber/any_gerber_command.ts","../src/gerber/gerber-builder.ts","../src/gerber/stringify-gerber/stringify-gerber-command.ts","../src/gerber/stringify-gerber/stringify-gerber-command-layers.ts","../src/gerber/stringify-gerber/stringify-gerber-commands.ts","../src/gerber/utils/pairs.ts","../src/gerber/convert-soup-to-gerber-commands/define-common-macros.ts","../src/gerber/convert-soup-to-gerber-commands/defineAperturesForLayer.ts","../src/gerber/convert-soup-to-gerber-commands/getAllTraceWidths.ts","../src/gerber/convert-soup-to-gerber-commands/findApertureNumber.ts","../package.json","../src/gerber/convert-soup-to-gerber-commands/getCommandHeaders.ts","../src/gerber/convert-soup-to-gerber-commands/getGerberLayerName.ts","../src/gerber/convert-soup-to-gerber-commands/index.ts"],"sourcesContent":["import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const FMAT = defineExcellonDrillCommand({\n command_code: \"FMAT\",\n schema: z.object({\n command_code: z.literal(\"FMAT\").default(\"FMAT\"),\n format: z.number(),\n }),\n stringify: (c) => `FMAT,${c.format}`,\n})\n","import type { AnyZodObject, z } from \"zod\"\n\nexport interface ExcellonDrillCommandDef<\n K extends string,\n T extends AnyZodObject | z.ZodIntersection<any, any>,\n> {\n command_code: K\n schema: T\n stringify: (c: z.infer<T>) => string\n}\n\nexport const defineExcellonDrillCommand = <\n K extends string,\n T extends AnyZodObject | z.ZodIntersection<any, any>,\n>({\n command_code,\n schema,\n stringify,\n}: {\n command_code: K\n schema: T\n stringify: (c: z.infer<T>) => string\n}): ExcellonDrillCommandDef<K, T> => {\n return {\n command_code,\n schema,\n stringify,\n }\n}\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\n/**\n * Rapid move without drilling\n */\nexport const G00 = defineExcellonDrillCommand({\n command_code: \"G00\",\n schema: z.object({\n command_code: z.literal(\"G00\").default(\"G00\"),\n }),\n stringify: () => \"G00\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\n/**\n * Linear move with drilling\n */\nexport const G01 = defineExcellonDrillCommand({\n command_code: \"G01\",\n schema: z.object({\n command_code: z.literal(\"G01\").default(\"G01\"),\n }),\n stringify: () => \"G01\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const G05 = defineExcellonDrillCommand({\n command_code: \"G05\",\n schema: z.object({\n command_code: z.literal(\"G05\").default(\"G05\"),\n }),\n stringify: () => \"G05\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const G85 = defineExcellonDrillCommand({\n command_code: \"G85\",\n schema: z.object({\n command_code: z.literal(\"G85\").default(\"G85\"),\n x: z.number(),\n y: z.number(),\n width: z.number(), // slot width = tool diameter\n }),\n stringify: ({ x, y }) => `G85X${x.toFixed(3)}Y${y.toFixed(3)}`,\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const G90 = defineExcellonDrillCommand({\n command_code: \"G90\",\n schema: z.object({\n command_code: z.literal(\"G90\").default(\"G90\"),\n }),\n stringify: () => \"G90\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\n/**\n * Z-Axis Feed Down\n */\nexport const M15 = defineExcellonDrillCommand({\n command_code: \"M15\",\n schema: z.object({\n command_code: z.literal(\"M15\").default(\"M15\"),\n }),\n stringify: () => \"M15\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\n/**\n * Z-Axis Feed Up (lift drill up)\n */\nexport const M16 = defineExcellonDrillCommand({\n command_code: \"M16\",\n schema: z.object({\n command_code: z.literal(\"M16\").default(\"M16\"),\n }),\n stringify: () => \"M16\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const M30 = defineExcellonDrillCommand({\n command_code: \"M30\",\n schema: z.object({\n command_code: z.literal(\"M30\").default(\"M30\"),\n }),\n stringify: () => \"M30\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const M48 = defineExcellonDrillCommand({\n command_code: \"M48\",\n schema: z.object({\n command_code: z.literal(\"M48\").default(\"M48\"),\n }),\n stringify: () => \"M48\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const M95 = defineExcellonDrillCommand({\n command_code: \"M95\",\n schema: z.object({\n command_code: z.literal(\"M95\").default(\"M95\"),\n }),\n stringify: () => \"M95\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const define_tool = defineExcellonDrillCommand({\n command_code: \"define_tool\",\n schema: z.object({\n command_code: z.literal(\"define_tool\").default(\"define_tool\"),\n tool_number: z.number(),\n diameter: z.number(),\n }),\n stringify: (c) => `T${c.tool_number}C${c.diameter.toFixed(6)}`,\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const drill_at = defineExcellonDrillCommand({\n command_code: \"drill_at\",\n schema: z.object({\n command_code: z.literal(\"drill_at\").default(\"drill_at\"),\n x: z.number(),\n y: z.number(),\n }),\n stringify: (c) => `X${c.x.toFixed(4)}Y${c.y.toFixed(4)}`,\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const header_attribute = defineExcellonDrillCommand({\n command_code: \"header_attribute\",\n schema: z.object({\n command_code: z.literal(\"header_attribute\").default(\"header_attribute\"),\n attribute_name: z.string(),\n attribute_value: z.string(),\n }),\n stringify({ attribute_name, attribute_value }) {\n return `; #@! ${attribute_name},${attribute_value}`\n },\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const header_comment = defineExcellonDrillCommand({\n command_code: \"header_comment\",\n schema: z.object({\n command_code: z.literal(\"header_comment\").default(\"header_comment\"),\n text: z.string(),\n }),\n stringify({ text }) {\n return `; ${text}`\n },\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const rewind = defineExcellonDrillCommand({\n command_code: \"rewind\",\n schema: z.object({\n command_code: z.literal(\"rewind\").default(\"rewind\"),\n }),\n stringify: () => \"%\",\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const unit_format = defineExcellonDrillCommand({\n command_code: \"unit_format\",\n schema: z.object({\n command_code: z.literal(\"unit_format\").default(\"unit_format\"),\n unit: z.union([z.literal(\"INCH\"), z.literal(\"METRIC\")]),\n lz: z\n .union([z.literal(\"LZ\"), z.literal(\"TZ\")])\n .nullable()\n .default(null),\n }),\n stringify(c) {\n return `${c.unit}${!c.lz ? \"\" : `,${c.lz}`}`\n },\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const use_tool = defineExcellonDrillCommand({\n command_code: \"use_tool\",\n schema: z.object({\n command_code: z.literal(\"use_tool\").default(\"use_tool\"),\n tool_number: z.number(),\n }),\n stringify: (c) => `T${c.tool_number}`,\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const aper_function_header = defineExcellonDrillCommand({\n command_code: \"aper_function_header\",\n schema: z.object({\n command_code: z\n .literal(\"aper_function_header\")\n .default(\"aper_function_header\"),\n is_plated: z.boolean(),\n }),\n stringify({ is_plated }) {\n return is_plated\n ? \"; #@! TA.AperFunction,Plated,PTH,ComponentDrill\"\n : \"; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill\"\n },\n})\n","import { z } from \"zod\"\nimport { defineExcellonDrillCommand } from \"../define-excellon-drill-command\"\n\nexport const percent_sign = defineExcellonDrillCommand({\n command_code: \"percent_sign\",\n schema: z.object({\n command_code: z.literal(\"percent_sign\").default(\"percent_sign\"),\n }),\n stringify: () => \"%\",\n})\n","import type { z } from \"zod\"\nimport type { ExcellonDrillCommandDef } from \"./define-excellon-drill-command\"\nimport * as EDCMD from \"./commands\"\n\nexport const excellon_drill_command_map = {\n G00: EDCMD.G00,\n G01: EDCMD.G01,\n G85: EDCMD.G85,\n M48: EDCMD.M48,\n M95: EDCMD.M95,\n FMAT: EDCMD.FMAT,\n unit_format: EDCMD.unit_format,\n aper_function_header: EDCMD.aper_function_header,\n percent_sign: EDCMD.percent_sign,\n T: EDCMD.define_tool,\n define_tool: EDCMD.define_tool,\n use_tool: EDCMD.use_tool,\n G90: EDCMD.G90,\n G05: EDCMD.G05,\n M15: EDCMD.M15,\n M16: EDCMD.M16,\n M30: EDCMD.M30,\n drill_at: EDCMD.drill_at,\n header_comment: EDCMD.header_comment,\n header_attribute: EDCMD.header_attribute,\n rewind: EDCMD.rewind,\n} satisfies Record<string, ExcellonDrillCommandDef<string, any>>\n\nexport type AnyExcellonDrillCommand = z.infer<\n (typeof excellon_drill_command_map)[keyof typeof excellon_drill_command_map][\"schema\"]\n>\n","import {\n type AnyExcellonDrillCommand,\n excellon_drill_command_map,\n} from \"./any-excellon-drill-command-map\"\n\nexport const stringifyExcellonDrill = (\n commands: Array<AnyExcellonDrillCommand>,\n) => {\n return commands\n .map((c) => {\n const def = excellon_drill_command_map[c.command_code]\n return def.stringify(c as any)\n })\n .join(\"\\n\")\n}\n","import type { z } from \"zod\"\nimport {\n type AnyExcellonDrillCommand,\n excellon_drill_command_map,\n} from \"./any-excellon-drill-command-map\"\n\nclass ExcellonDrillBuilder {\n commands: Array<AnyExcellonDrillCommand>\n\n constructor() {\n this.commands = []\n }\n\n add<T extends keyof typeof excellon_drill_command_map>(\n cmd: T,\n props: z.input<(typeof excellon_drill_command_map)[T][\"schema\"]>,\n ): ExcellonDrillBuilder {\n this.commands.push({\n ...({\n command_code: excellon_drill_command_map[cmd].command_code,\n } as any),\n ...props,\n })\n return this\n }\n\n build(): Array<AnyExcellonDrillCommand> {\n return this.commands\n }\n}\n\nexport const excellonDrill = () => new ExcellonDrillBuilder()\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyExcellonDrillCommand } from \"./any-excellon-drill-command-map\"\nimport { excellonDrill } from \"./excellon-drill-builder\"\n\nexport const convertSoupToExcellonDrillCommands = ({\n circuitJson,\n is_plated,\n flip_y_axis = false,\n}: {\n circuitJson: Array<AnyCircuitElement>\n is_plated: boolean\n flip_y_axis?: boolean\n}): Array<AnyExcellonDrillCommand> => {\n const builder = excellonDrill()\n\n // Start sequence commands\n builder.add(\"M48\", {})\n\n // Add header comments\n const date_str = new Date().toISOString()\n builder\n .add(\"header_comment\", {\n text: `DRILL file {tscircuit} date ${date_str}`,\n })\n .add(\"header_comment\", {\n text: \"FORMAT={-:-/ absolute / metric / decimal}\",\n })\n .add(\"header_attribute\", {\n attribute_name: \"TF.CreationDate\",\n attribute_value: date_str,\n })\n .add(\"header_attribute\", {\n attribute_name: \"TF.GenerationSoftware\",\n attribute_value: \"tscircuit\",\n })\n .add(\"header_attribute\", {\n attribute_name: \"TF.FileFunction\",\n attribute_value: is_plated ? \"Plated,1,2,PTH\" : \"NonPlated,1,2,NPTH\",\n })\n .add(\"FMAT\", { format: 2 }) // Assuming format 2 for the example\n .add(\"unit_format\", { unit: \"METRIC\", lz: null })\n\n let tool_counter = 10 // Start tool numbering from 10 for example\n\n const diameterToToolNumber: Record<number, number> = {}\n\n // Define tools\n for (const element of circuitJson) {\n if (\n element.type !== \"pcb_plated_hole\" &&\n element.type !== \"pcb_hole\" &&\n element.type !== \"pcb_via\"\n ) {\n continue\n }\n\n if (\n !is_plated &&\n (element.type === \"pcb_plated_hole\" || element.type === \"pcb_via\")\n ) {\n continue\n }\n\n const holeDiameter =\n \"hole_diameter\" in element && typeof element.hole_diameter === \"number\"\n ? element.hole_diameter\n : \"hole_width\" in element &&\n typeof element.hole_width === \"number\" &&\n \"hole_height\" in element &&\n typeof element.hole_height === \"number\"\n ? Math.min(element.hole_width, element.hole_height)\n : undefined\n\n if (!holeDiameter) continue\n\n if (!diameterToToolNumber[holeDiameter]) {\n builder.add(\"aper_function_header\", {\n is_plated,\n })\n builder.add(\"define_tool\", {\n tool_number: tool_counter,\n diameter: holeDiameter,\n })\n diameterToToolNumber[holeDiameter] = tool_counter\n tool_counter++\n }\n }\n\n builder.add(\"percent_sign\", {})\n builder.add(\"G90\", {})\n builder.add(\"G05\", {})\n\n // --------------------\n // Execute drills/slots\n // --------------------\n for (let i = 10; i < tool_counter; i++) {\n builder.add(\"use_tool\", { tool_number: i })\n for (const element of circuitJson) {\n if (\n element.type === \"pcb_plated_hole\" ||\n element.type === \"pcb_hole\" ||\n element.type === \"pcb_via\"\n ) {\n if (\n !is_plated &&\n (element.type === \"pcb_plated_hole\" || element.type === \"pcb_via\")\n ) {\n continue\n }\n\n const holeDiameter =\n \"hole_diameter\" in element &&\n typeof element.hole_diameter === \"number\"\n ? element.hole_diameter\n : \"hole_width\" in element &&\n typeof element.hole_width === \"number\" &&\n \"hole_height\" in element &&\n typeof element.hole_height === \"number\"\n ? Math.min(element.hole_width, element.hole_height)\n : undefined\n\n if (!holeDiameter || diameterToToolNumber[holeDiameter] !== i) {\n continue\n }\n\n const elementX =\n \"x\" in element && typeof element.x === \"number\" ? element.x : 0\n const elementY =\n \"y\" in element && typeof element.y === \"number\" ? element.y : 0\n const offsetX =\n \"hole_offset_x\" in element &&\n typeof element.hole_offset_x === \"number\"\n ? element.hole_offset_x\n : 0\n const offsetY =\n \"hole_offset_y\" in element &&\n typeof element.hole_offset_y === \"number\"\n ? element.hole_offset_y\n : 0\n const centerX = elementX + offsetX\n const centerY = elementY + offsetY\n const yMultiplier = flip_y_axis ? -1 : 1\n\n if (\n \"hole_width\" in element &&\n typeof element.hole_width === \"number\" &&\n \"hole_height\" in element &&\n typeof element.hole_height === \"number\"\n ) {\n const holeWidth = element.hole_width\n const holeHeight = element.hole_height\n const maxDim = Math.max(holeWidth, holeHeight)\n const minDim = Math.min(holeWidth, holeHeight)\n\n if (Math.abs(maxDim - minDim) <= 1e-6) {\n builder.add(\"drill_at\", {\n x: centerX,\n y: centerY * yMultiplier,\n })\n continue\n }\n\n const rotationDegrees =\n \"hole_ccw_rotation\" in element &&\n typeof element.hole_ccw_rotation === \"number\"\n ? element.hole_ccw_rotation\n : \"ccw_rotation\" in element &&\n typeof element.ccw_rotation === \"number\"\n ? element.ccw_rotation\n : 0\n const rotationRadians = (rotationDegrees * Math.PI) / 180\n const cosTheta = Math.cos(rotationRadians)\n const sinTheta = Math.sin(rotationRadians)\n\n const isWidthMajor = holeWidth >= holeHeight\n const slotHalfLength = (maxDim - minDim) / 2\n const startRelative = isWidthMajor\n ? { x: -slotHalfLength, y: 0 }\n : { x: 0, y: -slotHalfLength }\n const endRelative = isWidthMajor\n ? { x: slotHalfLength, y: 0 }\n : { x: 0, y: slotHalfLength }\n\n const rotatePoint = ({ x, y }: { x: number; y: number }) => ({\n x: x * cosTheta - y * sinTheta,\n y: x * sinTheta + y * cosTheta,\n })\n\n const startPoint = rotatePoint(startRelative)\n const endPoint = rotatePoint(endRelative)\n\n const startX = centerX + startPoint.x\n const startY = (centerY + startPoint.y) * yMultiplier\n const endX = centerX + endPoint.x\n const endY = (centerY + endPoint.y) * yMultiplier\n\n builder\n .add(\"drill_at\", {\n x: startX,\n y: startY,\n })\n .add(\"G85\", {\n x: endX,\n y: endY,\n width: minDim,\n })\n continue\n }\n\n builder.add(\"drill_at\", {\n x: centerX,\n y: centerY * yMultiplier,\n })\n }\n }\n }\n\n builder.add(\"M30\", {})\n\n return builder.build()\n}\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const add_attribute_on_aperture = defineGerberCommand({\n command_code: \"TA\",\n schema: z\n .object({\n command_code: z.literal(\"TA\").default(\"TA\"),\n attribute_name: z.string(),\n attribute_value: z.string(),\n })\n .describe(\n \"Add attribute on aperture: Add an aperture attribute to the dictionary or modify it.\",\n ),\n stringify: ({ attribute_name, attribute_value }) => {\n return `%TA${attribute_name},${attribute_value}*%`\n },\n})\n","import type { AnyZodObject, z, ZodObject, ZodUnion } from \"zod\"\n\nexport interface GerberCommandDef<\n K extends string,\n T extends AnyZodObject | z.ZodIntersection<any, any>,\n> {\n command_code: K\n schema: T\n stringify: (c: z.infer<T>) => string\n}\n\nexport const defineGerberCommand = <\n K extends string,\n T extends AnyZodObject | z.ZodIntersection<any, any>,\n>({\n command_code,\n schema,\n stringify,\n}: {\n command_code: K\n schema: T\n stringify: (c: z.infer<T>) => string\n}): GerberCommandDef<K, T> => {\n return {\n command_code,\n schema,\n stringify,\n }\n}\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const add_attribute_on_file = defineGerberCommand({\n command_code: \"TF\",\n schema: z\n .object({\n command_code: z.literal(\"TF\").default(\"TF\"),\n attribute_name: z.string(),\n attribute_value: z.string(),\n })\n .describe(\"Add attribute on file: Set a file attribute.\"),\n stringify: ({ attribute_name, attribute_value }) => {\n return `%TF.${attribute_name},${attribute_value}*%`\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const add_attribute_on_object = defineGerberCommand({\n command_code: \"TO\",\n schema: z\n .object({\n command_code: z.literal(\"TO\").default(\"TO\"),\n attribute_name: z.string(),\n attribute_value: z.string(),\n })\n .describe(\n \"Add attribute on object: Add an object attribute to the dictionary or modify it.\",\n ),\n stringify: ({ attribute_name, attribute_value }) => {\n return `%TO${attribute_name},${attribute_value}*%`\n },\n})\n\nexport type AddAttributeOnObject = z.infer<\n typeof add_attribute_on_object.schema\n>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const aperture_block = defineGerberCommand({\n command_code: \"AB\",\n schema: z\n .object({\n command_code: z.literal(\"AB\").default(\"AB\"),\n block: z.string(),\n })\n .describe(\n \"Aperture block: Opens a block aperture statement and assigns its aperture number or closes a block aperture statement\",\n ),\n stringify() {\n return \"\"\n },\n})\n\nexport type ApertureBlock = z.infer<typeof aperture_block.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const comment = defineGerberCommand({\n command_code: \"G04\",\n schema: z\n .object({\n command_code: z.literal(\"G04\").default(\"G04\"),\n comment: z.string(),\n })\n .describe(\n \"Comment: A human readable comment, does not affect the image. 4.1\",\n ),\n stringify: (c) => {\n return `G04 ${c.comment}*`\n },\n})\n\nexport type Comment = z.infer<typeof comment.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const create_arc = defineGerberCommand({\n command_code: \"G75\",\n schema: z\n .object({\n command_code: z.literal(\"G75\").default(\"G75\"),\n })\n .describe(\n \"Create arc: A G75 must be called before creating the first arc.\",\n ),\n stringify() {\n return \"G75*\"\n },\n})\n\nexport type CreateArc = z.infer<typeof create_arc.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const define_aperture = defineGerberCommand({\n command_code: \"AD\",\n schema: z\n .object({\n command_code: z.literal(\"AD\").default(\"AD\"),\n aperture_code: z.string(),\n })\n .describe(\n \"Aperture define: Defines a template-based aperture, assigns a D code to it. 4.3\",\n ),\n stringify() {\n return \"\"\n },\n})\n\nexport type DefineAperture = z.infer<typeof define_aperture.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const define_macro_aperture_template = defineGerberCommand({\n command_code: \"AM\",\n schema: z\n .object({\n command_code: z.literal(\"AM\").default(\"AM\"),\n macro_name: z.string(),\n template_code: z.string(),\n })\n .describe(\"Aperture macro: Defines a macro aperture template. 4.5\"),\n stringify({ macro_name, template_code }) {\n return `%AM${macro_name}*\\n${template_code}%`\n },\n})\n\nexport type DefineMacroApertureTemplate = z.infer<\n typeof define_macro_aperture_template.schema\n>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const delete_attribute = defineGerberCommand({\n command_code: \"TD\",\n schema: z\n .object({\n command_code: z.literal(\"TD\").default(\"TD\"),\n attribute: z.string().optional(),\n })\n .describe(\n \"Delete attribute: Attribute delete Delete one or all attributes in the dictionary.\",\n ),\n stringify({ attribute }) {\n if (!attribute) {\n return \"%TD*%\"\n }\n return `%TD${attribute}*%`\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const end_of_file = defineGerberCommand({\n command_code: \"M02\",\n schema: z\n .object({\n command_code: z.literal(\"M02\").default(\"M02\"),\n })\n .describe(\"End of file: 4.13\"),\n stringify() {\n return \"M02*\"\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const end_region_statement = defineGerberCommand({\n command_code: \"G37\",\n schema: z\n .object({\n command_code: z.literal(\"G37\").default(\"G37\"),\n })\n .describe(\"End region statement: Ends the region statement\"),\n stringify() {\n return \"G37*\"\n },\n})\n\nexport type EndRegionStatement = z.infer<typeof end_region_statement.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\nimport { getGerberCoordinateWithPadding } from \"../stringify-gerber/get-gerber-coordinate-with-padding\"\n\nexport const flash_operation = defineGerberCommand({\n command_code: \"D03\",\n schema: z\n .object({\n command_code: z.literal(\"D03\").default(\"D03\"),\n x: z.number(),\n y: z.number(),\n })\n .describe(\n \"Flash operation: Creates a flash object with the current aperture. The current point is moved to the flash point.\",\n ),\n stringify({ x, y }) {\n const [gx, gy] = [x, y].map((coord) =>\n getGerberCoordinateWithPadding(coord),\n )\n return `X${gx}Y${gy}D03*`\n },\n})\n\nexport type FlashOperation = z.infer<typeof flash_operation.schema>\n","/**\n * Retrieves the Gerber coordinate with padding.\n *\n * Example Gerber coordinate strings:\n * full string: X110550000Y-85000000D03*\n * formatted coordinate for X: 110550000\n *\n * Example inputs/outputs:\n * input: 110.55\n * output: 110550000\n *\n * @param coordinate_mm - The coordinate value in millimeters.\n * @returns The Gerber coordinate with padding.\n */\nexport const getGerberCoordinateWithPadding = (\n coordinate_mm: number,\n): string => {\n const coordinate_um = coordinate_mm * 1000000 // Convert millimeters to micrometers\n let coordinate_str = coordinate_um.toFixed(0) // Convert to string without decimal places\n // add left padding\n while (coordinate_str.length < 9) {\n if (coordinate_um < 0) {\n coordinate_str = `-0${coordinate_str.slice(1)}`\n } else {\n coordinate_str = `0${coordinate_str}`\n }\n }\n return coordinate_str\n}\n","import { z } from \"zod\"\n\nexport const load_mirroring = z\n .object({\n command_code: z.literal(\"LM\"),\n mirroring: z.string(),\n })\n .describe(\"Load mirroring: Loads the mirror object transformation parameter.\")\n\nexport type LoadMirroring = z.infer<typeof load_mirroring>\n","import { z } from \"zod\"\n\nexport const load_polarity = z\n .object({\n command_code: z.literal(\"LP\"),\n polarity: z.string(),\n })\n .describe(\n \"Load polarity: Loads the polarity object transformation parameter.\",\n )\n\nexport type LoadPolarity = z.infer<typeof load_polarity>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const load_rotation = defineGerberCommand({\n command_code: \"LR\",\n schema: z\n .object({\n command_code: z.literal(\"LR\").default(\"LR\"),\n rotation_degrees: z.number(),\n })\n .describe(\n \"Load rotation: Loads the rotation object transformation parameter.\",\n ),\n stringify: ({ rotation_degrees }) => {\n return `%LR${rotation_degrees}*%`\n },\n})\n\nexport type LoadRotation = z.infer<typeof load_rotation.schema>\n","import { z } from \"zod\"\n\nexport const load_scaling = z\n .object({\n command_code: z.literal(\"LS\"),\n scaling: z.string(),\n })\n .describe(\"Load scaling: Loads the scale object transformation parameter.\")\n\nexport type LoadScaling = z.infer<typeof load_scaling>\n","import { getGerberCoordinateWithPadding } from \"./../stringify-gerber/get-gerber-coordinate-with-padding\"\nimport { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const move_operation = defineGerberCommand({\n command_code: \"D02\",\n schema: z\n .object({\n command_code: z.literal(\"D02\").default(\"D02\"),\n x: z.number(),\n y: z.number(),\n })\n .describe(\n \"Move operation: D02 moves the current point to the coordinate in the command. It does not create an object.\",\n ),\n stringify({ x, y }) {\n const [gx, gy] = [x, y].map((coord) =>\n getGerberCoordinateWithPadding(coord),\n )\n return `X${gx}Y${gy}D02*`\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\nimport { getGerberCoordinateWithPadding } from \"../stringify-gerber/get-gerber-coordinate-with-padding\"\n\nexport const plot_operation = defineGerberCommand({\n command_code: \"D01\",\n schema: z\n .object({\n command_code: z.literal(\"D01\").default(\"D01\"),\n x: z.number(),\n y: z.number(),\n i: z.number().optional(),\n j: z.number().optional(),\n })\n .describe(\n \"Plot operation: Outside a region statement D01 creates a draw or arc object with the current aperture. Inside it adds a draw/arc segment to the contour under construction. The current point is moved to draw/arc end point after the creation of the draw/arc.\",\n ),\n stringify({ x, y, i, j }) {\n const gx = getGerberCoordinateWithPadding(x)\n const gy = getGerberCoordinateWithPadding(y)\n let cmd = `X${gx}Y${gy}`\n if (i !== undefined && j !== undefined) {\n const gi = getGerberCoordinateWithPadding(i)\n const gj = getGerberCoordinateWithPadding(j)\n cmd += `I${gi}J${gj}`\n }\n return `${cmd}D01*`\n },\n})\n","import { z } from \"zod\"\n\nexport const set_coordinate_format = z\n .object({\n command_code: z.literal(\"FS\"),\n format: z.string(),\n })\n .describe(\"Sets the coordinate format, e.g. the number of decimals.\")\nexport type SetCoordinateFormat = z.infer<typeof set_coordinate_format>\n","import { z } from \"zod\"\n\nexport const set_current_aperture_d_code = z\n .object({\n command_code: z.literal(\"Dnn\"),\n d_code: z.string(),\n })\n .describe(\"(nn≥10) Sets the current aperture to D code nn. 4.6\")\n\nexport type SetCurrentApertureDCode = z.infer<\n typeof set_current_aperture_d_code\n>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const set_movement_mode_to_clockwise_circular = defineGerberCommand({\n command_code: \"G02\",\n schema: z\n .object({\n command_code: z.literal(\"G02\").default(\"G02\"),\n })\n .describe(\n \"Set movement mode to clockwise circular: Sets linear/circular mode to clockwise circular.\",\n ),\n stringify() {\n return \"G02*\"\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const set_movement_mode_to_counterclockwise_circular =\n defineGerberCommand({\n command_code: \"G03\", // Add the missing command_code property\n schema: z\n .object({\n command_code: z.literal(\"G03\").default(\"G03\"),\n })\n .describe(\n \"Set movement mode to counterclockwise circular: Sets linear/circular mode to counterclockwise circular.\",\n ),\n stringify() {\n return \"G03*\"\n },\n })\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const set_movement_mode_to_linear = defineGerberCommand({\n command_code: \"G01\",\n schema: z\n .object({\n command_code: z.literal(\"G01\").default(\"G01\"),\n })\n .describe(\n \"Set movement mode to linear: Sets linear/circular mode to linear.\",\n ),\n stringify() {\n return \"G01*\"\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const set_unit = defineGerberCommand({\n command_code: \"MO\",\n schema: z\n .object({\n command_code: z.literal(\"MO\").default(\"MO\"),\n unit: z.enum([\"MM\", \"in\"]),\n })\n .describe(\"Mode: Sets the unit to mm or inch. 4.2.1\"),\n stringify({ unit }) {\n return `%MO${unit}*%`\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const start_region_statement = defineGerberCommand({\n command_code: \"G36\",\n schema: z\n .object({\n command_code: z.literal(\"G36\").default(\"G36\"),\n })\n .describe(\n \"Start region statement: Starts a region statement which creates a region by defining its contours.\",\n ),\n stringify() {\n return \"G36*\"\n },\n})\n\nexport type StartRegionStatement = z.infer<typeof start_region_statement.schema>\n","import { z } from \"zod\"\n\nexport const step_and_repeat = z\n .object({\n command_code: z.literal(\"SR\"),\n statement: z.string(),\n })\n .describe(\"Step and repeat: Open or closes a step and repeat statement.\")\n\nexport type StepAndRepeat = z.infer<typeof step_and_repeat>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const format_specification = defineGerberCommand({\n command_code: \"FS\",\n schema: z.object({\n command_code: z.literal(\"FS\").default(\"FS\"),\n zero_omission_mode: z\n .union([z.literal(\"L\").describe(\"leading zeros omitted\"), z.literal(\"T\")])\n .nullable()\n .default(null),\n coordinate_notation: z\n .union([\n z.literal(\"A\").describe(\"absolute notation\"),\n z.literal(\"I\").describe(\"incremental notation\"),\n ])\n .default(\"A\"),\n x_integer_digits: z.number().int().default(4),\n x_decimal_digits: z.number().int().default(6),\n y_integer_digits: z.number().int().default(4),\n y_decimal_digits: z.number().int().default(6),\n }),\n stringify: () => {\n return \"%FSLAX46Y46*%\"\n },\n})\n\nexport type FormatSpecification = z.infer<typeof format_specification.schema>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const set_layer_polarity = defineGerberCommand({\n command_code: \"LP\",\n schema: z\n .object({\n command_code: z.literal(\"LP\").default(\"LP\"),\n polarity: z.enum([\"D\", \"C\"]),\n })\n .describe(\n \"Layer Polarity: Sets the layer polarity to dark or clear. 4.2.1\",\n ),\n stringify({ polarity }) {\n return `%LP${polarity}*%`\n },\n})\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\nimport { getGerberCoordinateWithPadding } from \"../stringify-gerber/get-gerber-coordinate-with-padding\"\n\nconst circle_template = z.object({\n standard_template_code: z.literal(\"C\").describe(\"circle\"),\n diameter: z.number(),\n hole_diameter: z.number().optional(),\n})\n\nconst rectangle_template = z.object({\n standard_template_code: z.literal(\"R\").describe(\"rectangle\"),\n x_size: z.number(),\n y_size: z.number(),\n hole_diameter: z.number().optional(),\n})\n\nconst obround_template = z.object({\n standard_template_code: z.literal(\"O\").describe(\"obround\"),\n x_size: z.number(),\n y_size: z.number(),\n hole_diameter: z.number().optional(),\n})\n\nconst polygon_template = z.object({\n standard_template_code: z.literal(\"P\").describe(\"polygon\"),\n outer_diameter: z.number(),\n number_of_vertices: z.number().int(),\n rotation: z.number().optional(),\n hole_diameter: z.number().optional(),\n})\n\nconst standard_aperture_template_config = z.discriminatedUnion(\n \"standard_template_code\",\n [circle_template, rectangle_template, obround_template, polygon_template],\n)\n\nconst horz_pill_template = z.object({\n macro_name: z.literal(\"HORZPILL\"),\n x_size: z.number(),\n y_size: z.number(),\n circle_diameter: z.number(),\n circle_center_offset: z.number(),\n})\n\nconst vert_pill_template = z.object({\n macro_name: z.literal(\"VERTPILL\"),\n x_size: z.number(),\n y_size: z.number(),\n circle_diameter: z.number(),\n circle_center_offset: z.number(),\n})\n\nconst roundrect_template = z.object({\n macro_name: z.literal(\"ROUNDRECT\"),\n corner_radius: z.number(),\n corner_1_x: z.number(),\n corner_1_y: z.number(),\n corner_2_x: z.number(),\n corner_2_y: z.number(),\n corner_3_x: z.number(),\n corner_3_y: z.number(),\n corner_4_x: z.number(),\n corner_4_y: z.number(),\n})\n\nconst macro_aperture_template_config = z.discriminatedUnion(\"macro_name\", [\n horz_pill_template,\n vert_pill_template,\n roundrect_template,\n])\n\nconst aperture_template_config = z.union([\n standard_aperture_template_config,\n macro_aperture_template_config,\n])\n\nexport const define_aperture_template = defineGerberCommand({\n command_code: \"ADD\",\n schema: aperture_template_config.and(\n z.object({\n command_code: z.literal(\"ADD\").default(\"ADD\"),\n aperture_number: z.number().int(),\n }),\n ),\n stringify(props) {\n if (\"macro_name\" in props) {\n const { aperture_number, macro_name } = props\n let commandString = `%ADD${aperture_number}${macro_name},`\n\n if (macro_name === \"HORZPILL\" || macro_name === \"VERTPILL\") {\n commandString += `${props.x_size.toFixed(6)}X${props.y_size.toFixed(6)}X${props.circle_diameter.toFixed(6)}X${props.circle_center_offset.toFixed(6)}`\n } else if (macro_name === \"ROUNDRECT\") {\n // Handle ROUNDRECT if needed\n throw new Error(\"ROUNDRECT macro not implemented yet\")\n }\n\n commandString += \"*%\"\n return commandString\n }\n if (\"standard_template_code\" in props) {\n const { aperture_number, standard_template_code } = props\n let commandString = `%ADD${aperture_number}${standard_template_code},`\n\n if (standard_template_code === \"C\") {\n commandString += `${props.diameter.toFixed(6)}`\n } else if (\n standard_template_code === \"R\" ||\n standard_template_code === \"O\"\n ) {\n commandString += `${props.x_size.toFixed(6)}X${props.y_size.toFixed(6)}`\n } else if (standard_template_code === \"P\") {\n commandString += `${props.outer_diameter}X${props.number_of_vertices}X${\n props.rotation ? `X${props.rotation}` : \"\"\n }`\n }\n\n if (props.hole_diameter) {\n commandString += `X${props.hole_diameter.toFixed(6)}`\n }\n\n commandString += \"*%\"\n\n return commandString\n }\n throw new Error(\n `Invalid aperture template config: ${JSON.stringify(props)}`,\n )\n },\n})\n\nexport type DefineAperatureTemplateCommand = z.infer<\n typeof define_aperture_template.schema\n>\n\nexport type ApertureTemplateConfig = z.infer<typeof aperture_template_config>\n","import { z } from \"zod\"\nimport { defineGerberCommand } from \"../define-gerber-command\"\n\nexport const select_aperture = defineGerberCommand({\n command_code: \"D\",\n schema: z.object({\n command_code: z.literal(\"D\").default(\"D\"),\n aperture_number: z.number().int(),\n }),\n stringify({ aperture_number }) {\n return `D${aperture_number}*`\n },\n})\n","import type { GerberCommandDef } from \"./define-gerber-command\"\nimport type { z } from \"zod\"\n\nimport { add_attribute_on_aperture } from \"./commands/add_attribute_on_aperture\"\nimport { add_attribute_on_file } from \"./commands/add_attribute_on_file\"\nimport { add_attribute_on_object } from \"./commands/add_attribute_on_object\"\nimport { aperture_block } from \"./commands/aperture_block\"\nimport { comment } from \"./commands/comment\"\nimport { create_arc } from \"./commands/create_arc\"\nimport { define_aperture } from \"./commands/define_aperture\"\nimport { define_macro_aperture_template } from \"./commands/define_macro_aperture_template\"\nimport { delete_attribute } from \"./commands/delete_attribute\"\nimport { end_of_file } from \"./commands/end_of_file\"\nimport { end_region_statement } from \"./commands/end_region_statement\"\nimport { flash_operation } from \"./commands/flash_operation\"\nimport { load_mirroring } from \"./commands/load_mirroring\"\nimport { load_polarity } from \"./commands/load_polarity\"\nimport { load_rotation } from \"./commands/load_rotation\"\nimport { load_scaling } from \"./commands/load_scaling\"\nimport { move_operation } from \"./commands/move_operation\"\nimport { plot_operation } from \"./commands/plot_operation\"\nimport { set_coordinate_format } from \"./commands/set_coordinate_format\"\nimport { set_current_aperture_d_code } from \"./commands/set_current_aperture_d_code\"\nimport { set_movement_mode_to_clockwise_circular } from \"./commands/set_movement_mode_to_clockwise_circular\"\nimport { set_movement_mode_to_counterclockwise_circular } from \"./commands/set_movement_mode_to_counterclockwise_circular\"\nimport { set_movement_mode_to_linear } from \"./commands/set_movement_mode_to_linear\"\nimport { set_unit } from \"./commands/set_unit\"\nimport { start_region_statement } from \"./commands/start_region_statement\"\nimport { step_and_repeat } from \"./commands/step_and_repeat\"\nimport { format_specification } from \"./commands/format_specification\"\nimport { set_layer_polarity } from \"./commands/set_layer_polarity\"\nimport { define_aperture_template } from \"./commands/define_aperture_template\"\nimport { select_aperture } from \"./commands/select_aperture\"\n\nexport const gerber_command_map = {\n add_attribute_on_aperture,\n add_attribute_on_file,\n add_attribute_on_object,\n aperture_block,\n comment,\n create_arc,\n define_aperture,\n define_macro_aperture_template,\n delete_attribute,\n end_of_file,\n move_operation,\n flash_operation,\n end_region_statement,\n format_specification,\n // load_mirroring,\n // load_polarity,\n load_rotation,\n // load_scaling,\n plot_operation,\n // set_coordinate_format,\n // set_current_aperture_d_code,\n define_aperture_template,\n set_movement_mode_to_clockwise_circular,\n set_movement_mode_to_counterclockwise_circular,\n set_movement_mode_to_linear,\n select_aperture,\n set_unit,\n set_layer_polarity,\n start_region_statement,\n // step_and_repeat,\n} as const satisfies Record<string, GerberCommandDef<any, any>>\n\nexport type AnyGerberCommand = z.infer<\n (typeof gerber_command_map)[keyof typeof gerber_command_map][\"schema\"]\n>\n","import type { AnyGerberCommand } from \"./any_gerber_command\"\nimport type { z } from \"zod\"\nimport { gerber_command_map } from \"./any_gerber_command\"\n\nexport const gerberBuilder = () => new GerberBuilder()\n\nclass GerberBuilder {\n commands: Array<AnyGerberCommand>\n\n constructor() {\n this.commands = []\n }\n\n $if(\n condition: boolean,\n fn: (gb: GerberBuilder) => GerberBuilder,\n ): GerberBuilder {\n if (condition) {\n return fn(this)\n }\n return this\n }\n\n add<T extends keyof typeof gerber_command_map>(\n cmd: T,\n props: z.input<(typeof gerber_command_map)[T][\"schema\"]>,\n ): GerberBuilder {\n this.commands.push({\n ...({ command_code: gerber_command_map[cmd].command_code } as any),\n ...props,\n })\n return this\n }\n\n build(): Array<AnyGerberCommand> {\n return this.commands\n }\n}\n\n// Type test:\n// gerber()\n// .add(\"add_attribute_on_aperture\", {\n// attribute_name: \"foo\",\n// attribute_value: \"bar\",\n// })\n// .add(\"end_of_file\", {})\n// .build()\n","import type { AnyGerberCommand } from \"../any_gerber_command\"\nimport { gerber_command_map } from \"../any_gerber_command\"\n\nexport const stringifyGerberCommand = (command: AnyGerberCommand): string => {\n const command_def = Object.values(gerber_command_map).find(\n (cmd) => cmd.command_code === command.command_code,\n )\n\n if (!command_def) {\n throw new Error(\n `Command for command_code:\"${command.command_code}\" not found`,\n )\n }\n\n if (!command_def.stringify) {\n throw new Error(\n `Command for command_code:\"${command.command_code}\" does not have a stringify method`,\n )\n }\n\n return command_def.stringify(command as any)\n}\n","import type { AnyGerberCommand } from \"../any_gerber_command\"\nimport type { GerberLayerName } from \"../convert-soup-to-gerber-commands/GerberLayerName\"\nimport { stringifyGerberCommand } from \"./stringify-gerber-command\"\n\nexport const stringifyGerberCommandLayers = (\n commandLayers: Record<GerberLayerName, AnyGerberCommand[]>,\n): Record<GerberLayerName, string> => {\n const stringifiedCommandLayers: Record<GerberLayerName, string> = {} as any\n for (const layerName of Object.keys(commandLayers) as GerberLayerName[]) {\n stringifiedCommandLayers[layerName] = commandLayers[layerName]\n .map((command) => {\n return stringifyGerberCommand(command)\n })\n .join(\"\\n\")\n }\n return stringifiedCommandLayers\n}\n","import type { AnyGerberCommand } from \"../any_gerber_command\"\nimport { stringifyGerberCommand } from \"./stringify-gerber-command\"\n\nexport const stringifyGerberCommands = (\n commands: AnyGerberCommand[],\n): string => {\n return commands\n .map((command) => {\n return stringifyGerberCommand(command)\n })\n .join(\"\\n\")\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 { AnyGerberCommand } from \"../any_gerber_command\"\nimport { gerberBuilder } from \"../gerber-builder\"\n\nexport const defineCommonMacros = (glayer: Array<AnyGerberCommand>) => {\n glayer.push(\n ...gerberBuilder()\n .add(\"comment\", { comment: \"APERTURE MACROS START\" })\n .add(\"define_macro_aperture_template\", {\n macro_name: \"HORZPILL\",\n template_code: `\n0 Horizontal pill (stadium) shape macro*\n0 Parameters:*\n0 $1 = Total width*\n0 $2 = Total height*\n0 $3 = Circle diameter (equal to height)*\n0 $4 = Circle center offset\n0 21 = Center Line(Exposure, Width, Height, Center X, Center Y, Rotation)*\n0 1 = Circle(Exposure, Diameter, Center X, Center Y, Rotation)*\n21,1,$1,$2,0.0,0.0,0.0*\n1,1,$3,0.0-$4,0.0*\n1,1,$3,$4,0.0*\n`.trim(),\n })\n .add(\"define_macro_aperture_template\", {\n macro_name: \"VERTPILL\",\n template_code: `\n0 Vertical pill (stadium) shape macro*\n0 Parameters:*\n0 $1 = Total width*\n0 $2 = Total height*\n0 $3 = Circle diameter (equal to width)*\n0 $4 = Circle center offset\n0 21 = Center Line(Exposure, Width, Height, Center X, Center Y, Rotation)*\n21,1,$1,$2,0.0,0.0,0.0*\n1,1,$3,0.0,0.0-$4*\n1,1,$3,0.0,$4*\n`.trim(),\n })\n .add(\"define_macro_aperture_template\", {\n macro_name: \"RoundRect\",\n template_code: `\n0 Rectangle with rounded corners*\n0 $1 Corner radius*\n0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y Position of each corner*\n0 Polygon box body*\n4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*\n0 Circles for rounded corners*\n1,1,$1+$1,$2,$3*\n1,1,$1+$1,$4,$5*\n1,1,$1+$1,$6,$7*\n1,1,$1+$1,$8,$9*\n0 Rectangles between the rounded corners*\n20,1,$1+$1,$2,$3,$4,$5,0*\n20,1,$1+$1,$4,$5,$6,$7,0*\n20,1,$1+$1,$6,$7,$8,$9,0*\n20,1,$1+$1,$8,$9,$2,$3,0*\n`.trim(),\n })\n .add(\"comment\", { comment: \"APERTURE MACROS END\" })\n .build(),\n )\n}\n","import type {\n PCBHole,\n LayerRef,\n PCBPlatedHole,\n PCBSMTPad,\n PcbCopperText,\n PcbVia,\n PcbHole,\n PcbSolderPaste,\n PcbSilkscreenPath,\n PcbSilkscreenText,\n} from \"circuit-json\"\nimport stableStringify from \"fast-json-stable-stringify\"\nimport type { AnyGerberCommand } from \"../any_gerber_command\"\nimport type { ApertureTemplateConfig } from \"../commands/define_aperture_template\"\nimport { gerberBuilder } from \"../gerber-builder\"\nimport type { GerberLayerName } from \"./GerberLayerName\"\nimport { getAllTraceWidths } from \"./getAllTraceWidths\"\nimport type { AnyCircuitElement } from \"circuit-json\"\n\nexport function defineAperturesForLayer({\n glayer,\n soup,\n glayer_name,\n}: {\n glayer: AnyGerberCommand[]\n soup: AnyCircuitElement[]\n glayer_name: GerberLayerName\n}) {\n const getNextApertureNumber = () => {\n const highest_aperture_number = glayer.reduce((acc, command) => {\n if (command.command_code === \"ADD\") {\n return Math.max(acc, command.aperture_number)\n }\n return acc\n }, 0)\n if (highest_aperture_number === 0) {\n return 10\n }\n return highest_aperture_number + 1\n }\n\n glayer.push(\n ...gerberBuilder()\n .add(\"comment\", { comment: \"aperture START LIST\" })\n .build(),\n )\n\n // Add all trace width apertures\n const traceWidths: Record<LayerRef, number[]> = getAllTraceWidths(soup)\n for (const width of traceWidths[\n glayer_name.startsWith(\"F_\") ? \"top\" : \"bottom\"\n ]) {\n glayer.push(\n ...gerberBuilder()\n .add(\"define_aperture_template\", {\n aperture_number: getNextApertureNumber(),\n standard_template_code: \"C\",\n diameter: width,\n })\n .build(),\n )\n }\n\n // Add all pcb smtpad, plated hole etc. aperatures\n const apertureConfigs = getAllApertureTemplateConfigsForLayer(\n soup,\n glayer_name.startsWith(\"F_\") ? \"top\" : \"bottom\",\n )\n\n for (const apertureConfig of apertureConfigs) {\n glayer.push(\n ...gerberBuilder()\n .add(\"define_aperture_template\", {\n aperture_number: getNextApertureNumber(),\n ...apertureConfig,\n })\n .build(),\n )\n }\n\n glayer.push(\n ...gerberBuilder()\n .add(\"delete_attribute\", {})\n .add(\"comment\", { comment: \"aperture END LIST\" })\n .build(),\n )\n}\n\nexport const getApertureConfigFromPcbSmtpad = (\n elm: PCBSMTPad,\n): ApertureTemplateConfig => {\n if (elm.shape === \"rect\") {\n return {\n standard_template_code: \"R\",\n x_size: elm.width,\n y_size: elm.height,\n }\n }\n if (elm.shape === \"circle\") {\n return {\n standard_template_code: \"C\",\n diameter: elm.radius * 2,\n }\n }\n if (elm.shape === \"rotated_rect\") {\n // Rotation is handled by the LR command, not the aperture definition\n return {\n standard_template_code: \"R\",\n x_size: elm.width,\n y_size: elm.height,\n }\n }\n if (elm.shape === \"polygon\") {\n // Polygon shapes don't use apertures - they're drawn as regions\n throw new Error(\"Polygon SMT pads are drawn as regions, not apertures\")\n }\n throw new Error(`Unsupported shape ${(elm as any).shape}`)\n}\n\nexport const getApertureConfigFromPcbSilkscreenPath = (\n elm: PcbSilkscreenPath,\n): ApertureTemplateConfig => {\n if (\"stroke_width\" in elm) {\n return {\n standard_template_code: \"C\",\n diameter: elm.stroke_width,\n }\n }\n throw new Error(`Provide stroke_width for: ${elm as any}`)\n}\n\nexport const getApertureConfigFromPcbSilkscreenText = (\n elm: PcbSilkscreenText,\n): ApertureTemplateConfig => {\n if (\"font_size\" in elm) {\n return {\n standard_template_code: \"C\",\n diameter: elm.font_size / 8, // font size and diamater have different units of measurement\n }\n }\n throw new Error(`Provide font_size for: ${elm as any}`)\n}\n\nexport const getApertureConfigFromPcbCopperText = (\n elm: PcbCopperText,\n): ApertureTemplateConfig => {\n if (\"font_size\" in elm) {\n return {\n standard_template_code: \"C\",\n diameter: elm.font_size / 8, // font size and diamater have different units of measurement\n }\n }\n throw new Error(`Provide font_size for: ${elm as any}`)\n}\n\nexport const getApertureConfigFromPcbSolderPaste = (\n elm: PcbSolderPaste,\n): ApertureTemplateConfig => {\n if (elm.shape === \"rect\") {\n return {\n standard_template_code: \"R\",\n x_size: elm.width,\n y_size: elm.height,\n }\n }\n if (elm.shape === \"rotated_rect\") {\n // Rotation is handled by the LR command, not the aperture definition\n return {\n standard_template_code: \"R\",\n x_size: elm.width,\n y_size: elm.height,\n }\n }\n if (elm.shape === \"circle\") {\n return {\n standard_template_code: \"C\",\n diameter: elm.radius * 2,\n }\n }\n if (elm.shape === \"pill\") {\n if (!(\"width\" in elm && \"height\" in elm)) {\n throw new Error(\n \"Invalid pill shape in getApertureConfigFromPcbPlatedHole: missing dimensions\",\n )\n }\n if (elm.width >= elm.height) {\n return {\n macro_name: \"HORZPILL\",\n x_size: elm.width,\n y_size: elm.height,\n circle_diameter: Math.min(elm.width, elm.height),\n circle_center_offset: elm.width / 2,\n }\n }\n return {\n macro_name: \"VERTPILL\",\n x_size: elm.width,\n y_size: elm.height,\n circle_diameter: Math.min(elm.width, elm.height),\n circle_center_offset: elm.height / 2,\n }\n }\n throw new Error(`Unsupported shape ${(elm as any).shape}`)\n}\n\nexport const getApertureConfigFromPcbPlatedHole = (\n elm: PCBPlatedHole,\n): ApertureTemplateConfig => {\n if (elm.shape === \"circle\") {\n if (!(\"outer_diameter\" in elm && \"hole_diameter\" in elm)) {\n throw new Error(\n \"Invalid circle shape in getApertureConfigFromPcbPlatedHole: missing diameters\",\n )\n }\n return {\n standard_template_code: \"C\",\n diameter: elm.outer_diameter,\n }\n }\n if (elm.shape === \"pill\") {\n if (!(\"outer_width\" in elm && \"outer_height\" in elm)) {\n throw new Error(\n \"Invalid pill shape in getApertureConfigFromPcbPlatedHole: missing dimensions\",\n )\n }\n\n if (elm.outer_width > elm.outer_height) {\n return {\n macro_name: \"HORZPILL\",\n x_size: elm.outer_width,\n y_size: elm.outer_height,\n circle_diameter: Math.min(elm.outer_width, elm.outer_height),\n circle_center_offset: elm.outer_width / 2,\n }\n }\n return {\n macro_name: \"VERTPILL\",\n x_size: elm.outer_width,\n y_size: elm.outer_height,\n circle_diameter: Math.min(elm.outer_width, elm.outer_height),\n circle_center_offset: elm.outer_height / 2,\n }\n }\n const shape = elm.shape\n if (\n shape === \"circular_hole_with_rect_pad\" ||\n shape === \"pill_hole_with_rect_pad\" ||\n shape === \"rotated_pill_hole_with_rect_pad\"\n ) {\n if (!(\"rect_pad_width\" in elm && \"rect_pad_height\" in elm)) {\n throw new Error(\n `Invalid ${shape} shape in getApertureConfigFromPcbPlatedHole: missing dimensions`,\n )\n }\n return {\n standard_template_code: \"R\",\n x_size: elm.rect_pad_width,\n y_size: elm.rect_pad_height,\n }\n }\n throw new Error(\n `Unsupported shape in getApertureConfigFromPcbPlatedHole: ${elm.shape}`,\n )\n}\n\nexport const getApertureConfigFromCirclePcbHole = (\n elm: PcbHole,\n): ApertureTemplateConfig => {\n if (!(\"hole_diameter\" in elm)) {\n throw new Error(\n `Invalid shape called in getApertureConfigFromCirclePcbHole: ${elm.hole_shape}`,\n )\n }\n return {\n standard_template_code: \"C\",\n diameter: elm.hole_diameter,\n }\n}\n\nexport const getApertureConfigFromPcbVia = (\n elm: PcbVia,\n): ApertureTemplateConfig => {\n if (!(\"outer_diameter\" in elm)) {\n throw new Error(\n \"outer_diameter not specified in getApertureConfigFromPcbVia\",\n )\n }\n return {\n standard_template_code: \"C\",\n diameter: elm.outer_diameter,\n }\n}\n\nfunction getAllApertureTemplateConfigsForLayer(\n soup: AnyCircuitElement[],\n layer: \"top\" | \"bottom\",\n): ApertureTemplateConfig[] {\n const configs: ApertureTemplateConfig[] = []\n const configHashMap = new Set<string>()\n\n const addConfigIfNew = (config: ApertureTemplateConfig) => {\n const hash = stableStringify(config)\n if (!configHashMap.has(hash)) {\n configs.push(config)\n configHashMap.add(hash)\n }\n }\n\n for (const elm of soup) {\n if (elm.type === \"pcb_smtpad\") {\n if (elm.layer === layer && elm.shape !== \"polygon\") {\n addConfigIfNew(getApertureConfigFromPcbSmtpad(elm))\n }\n } else if (elm.type === \"pcb_solder_paste\") {\n if (elm.layer === layer) {\n addConfigIfNew(getApertureConfigFromPcbSolderPaste(elm))\n }\n } else if (elm.type === \"pcb_plated_hole\") {\n if (elm.layers.includes(layer)) {\n addConfigIfNew(getApertureConfigFromPcbPlatedHole(elm))\n }\n } else if (elm.type === \"pcb_hole\") {\n if (elm.hole_shape === \"circle\")\n addConfigIfNew(getApertureConfigFromCirclePcbHole(elm))\n else console.warn(\"NOT IMPLEMENTED: drawing gerber for non circle holes\")\n } else if (elm.type === \"pcb_via\") {\n addConfigIfNew(getApertureConfigFromPcbVia(elm))\n } else if (elm.type === \"pcb_silkscreen_path\")\n addConfigIfNew(getApertureConfigFromPcbSilkscreenPath(elm))\n else if (elm.type === \"pcb_silkscreen_text\")\n addConfigIfNew(getApertureConfigFromPcbSilkscreenText(elm))\n else if (elm.type === \"pcb_copper_text\") {\n if (elm.layer === layer)\n addConfigIfNew(getApertureConfigFromPcbCopperText(elm))\n }\n }\n\n return configs\n}\n","import type { AnyCircuitElement, LayerRef, PCBTrace } from \"circuit-json\"\n\nexport function getAllTraceWidths(\n soup: AnyCircuitElement[],\n): Record<LayerRef, number[]> {\n const pcb_traces = soup.filter(\n (elm): elm is PCBTrace => elm.type === \"pcb_trace\",\n )\n\n const widths: Record<LayerRef, Set<number>> = {} as any\n\n for (const trace of pcb_traces) {\n for (const segment of trace.route) {\n if (segment.route_type === \"wire\") {\n widths[segment.layer] = widths[segment.layer] || new Set<number>()\n widths[segment.layer].add(segment.width)\n }\n }\n }\n\n return {\n top: Array.from(widths.top || []),\n bottom: Array.from(widths.bottom || []),\n } as any\n}\n","import type {\n ApertureTemplateConfig,\n DefineAperatureTemplateCommand,\n} from \"../commands/define_aperture_template\"\nimport type { AnyGerberCommand } from \"../any_gerber_command\"\n\nexport const findApertureNumber = (\n glayer: AnyGerberCommand[],\n search_params:\n | {\n trace_width?: number\n }\n | ApertureTemplateConfig,\n): number => {\n let aperture: any\n if (\"trace_width\" in search_params) {\n const trace_width = search_params.trace_width\n aperture = glayer.find(\n (command): command is DefineAperatureTemplateCommand =>\n \"standard_template_code\" in command &&\n command.command_code === \"ADD\" &&\n command.standard_template_code === \"C\" &&\n command.diameter === trace_width,\n )\n } else if (\n \"standard_template_code\" in search_params ||\n \"macro_name\" in search_params\n ) {\n aperture = glayer.find(\n (command): command is DefineAperatureTemplateCommand =>\n command.command_code === \"ADD\" &&\n Object.keys(search_params).every(\n (param_name) =>\n command[param_name as keyof typeof search_params] ===\n search_params[param_name as keyof typeof search_params],\n ),\n )\n }\n\n if (!aperture) {\n // TODO add FileFunction/layer name to this error to help narrow it\n throw new Error(\n `Aperture not found for search params ${JSON.stringify(search_params)}`,\n )\n }\n return aperture.aperture_number\n}\n","{\n \"name\": \"circuit-json-to-gerber\",\n \"version\": \"0.0.50\",\n \"main\": \"dist/index.js\",\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"tsup-node src/index.ts src/cli.ts --format esm --dts --sourcemap\",\n \"format\": \"biome format --write .\",\n \"format:check\": \"biome format .\",\n \"start\": \"bun --bun site/index.html\",\n \"build:site\": \"bun build site/index.html --outdir ./site-export\"\n },\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"circuit-to-gerber\": \"./dist/cli.js\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.8.3\",\n \"@types/archiver\": \"^6.0.3\",\n \"@types/bun\": \"^1.1.8\",\n \"@types/node\": \"^22.5.2\",\n \"@types/react\": \"^19.2.7\",\n \"@types/react-dom\": \"^19.1.5\",\n \"archiver\": \"^7.0.1\",\n \"bun-match-svg\": \"^0.0.13\",\n \"circuit-json\": \"^0.0.421\",\n \"commander\": \"^12.1.0\",\n \"gerber-to-svg\": \"^4.2.8\",\n \"gerberts\": \"^0.0.3\",\n \"jszip\": \"^3.10.1\",\n \"pcb-stackup\": \"^4.2.8\",\n \"react\": \"^19.2.1\",\n \"react-dom\": \"^19.2.1\",\n \"tscircuit\": \"^0.0.1705\",\n \"tsup\": \"^8.2.4\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5.0.0\",\n \"tscircuit\": \"*\",\n \"circuit-json\": \"*\"\n },\n \"dependencies\": {\n \"@tscircuit/alphabet\": \"^0.0.25\",\n \"fast-json-stable-stringify\": \"^2.1.0\",\n \"transformation-matrix\": \"^3.0.0\"\n }\n}\n","import type { AnyGerberCommand } from \"src/gerber/any_gerber_command\"\nimport { gerberBuilder } from \"../gerber-builder\"\nimport packageJson from \"../../../package.json\"\n\nconst layerAndTypeToFileFunction = {\n \"top-copper\": \"Copper,L1,Top\",\n \"bottom-copper\": \"Copper,L2,Bot\",\n \"top-soldermask\": \"Soldermask,Top\",\n \"bottom-soldermask\": \"Soldermask,Bot\",\n \"top-silkscreen\": \"Legend,Top\",\n \"bottom-silkscreen\": \"Legend,Bot\",\n \"top-paste\": \"Paste,Top\",\n \"bottom-paste\": \"Paste,Bot\",\n edgecut: \"Profile,NP\",\n // TODO inner layers\n}\n\n/**\n * Returns headers for a Gerber file. Here's a typical header:\n *\n * %TF.GenerationSoftware,KiCad,Pcbnew,8.0.1*%\n * %TF.CreationDate,2024-04-08T11:14:22-07:00*%\n * %TF.ProjectId,,58585858-5858-4585-9858-585858585858,rev?*%\n * %TF.SameCoordinates,Original*%\n * %TF.FileFunction,Copper,L1,Top*%\n * %TF.FilePolarity,Positive*%\n * %FSLAX46Y46*%\n * G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\n * G04 Created by KiCad (PCBNEW 8.0.1) date 2024-04-08 11:14:22*\n * %MOMM*%\n * %LPD*%\n */\nexport const getCommandHeaders = (opts: {\n layer:\n | \"edgecut\"\n | \"top\"\n | \"bottom\"\n | \"inner1\"\n | \"inner2\"\n | \"inner3\"\n | \"inner4\"\n layer_type?: \"copper\" | \"soldermask\" | \"silkscreen\" | \"paste\"\n}): AnyGerberCommand[] => {\n const file_function =\n layerAndTypeToFileFunction[\n (opts.layer_type\n ? `${opts.layer}-${opts.layer_type}`\n : opts.layer) as keyof typeof layerAndTypeToFileFunction\n ]\n return (\n gerberBuilder()\n .add(\"add_attribute_on_file\", {\n attribute_name: \"GenerationSoftware\",\n attribute_value: `tscircuit,circuit-json-to-gerber,${packageJson.version}`,\n })\n .add(\"add_attribute_on_file\", {\n attribute_name: \"CreationDate\",\n attribute_value: new Date().toISOString(),\n })\n // .add(\"add_attribute_on_file\", {\n // attribute_name: \"ProjectId\",\n // attribute_value: \"\",\n // })\n .add(\"add_attribute_on_file\", {\n attribute_name: \"SameCoordinates\",\n attribute_value: \"Original\",\n })\n .add(\"add_attribute_on_file\", {\n attribute_name: \"FileFunction\",\n attribute_value: file_function,\n })\n .$if(opts.layer !== \"edgecut\", (gb) =>\n gb.add(\"add_attribute_on_file\", {\n attribute_name: \"FilePolarity\",\n attribute_value:\n opts.layer_type === \"soldermask\" ? \"Negative\" : \"Positive\",\n }),\n )\n .add(\"format_specification\", {})\n .add(\"set_unit\", {\n unit: \"MM\",\n })\n .add(\"comment\", {\n comment: \"Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)\",\n })\n .add(\"comment\", {\n comment: `Created by tscircuit (builder) date ${new Date().toISOString()}`,\n })\n .add(\"set_movement_mode_to_linear\", {})\n .add(\"set_layer_polarity\", {\n polarity: \"D\",\n })\n .add(\"create_arc\", {})\n .build()\n )\n}\n","import type { LayerRef } from \"circuit-json\"\nimport type { GerberLayerName } from \"./GerberLayerName\"\n\nconst layerRefToGerberPrefix = {\n top: \"F_\",\n bottom: \"B_\",\n} as const\nconst layerTypeToGerberSuffix = {\n copper: \"Cu\",\n silkscreen: \"SilkScreen\",\n soldermask: \"Mask\",\n mask: \"Mask\",\n paste: \"Paste\",\n} as const\n\nexport const getGerberLayerName = (\n layer_ref: LayerRef | \"edgecut\",\n layer_type: \"copper\" | \"silkscreen\" | \"soldermask\" | \"paste\",\n): GerberLayerName => {\n if (layer_ref === \"edgecut\") return \"Edge_Cuts\"\n return `${layerRefToGerberPrefix[layer_ref as keyof typeof layerRefToGerberPrefix]}${layerTypeToGerberSuffix[layer_type]}`\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { pairs } from \"../utils/pairs\"\nimport { gerberBuilder } from \"../gerber-builder\"\nimport type { LayerToGerberCommandsMap } from \"./GerberLayerName\"\nimport { defineCommonMacros } from \"./define-common-macros\"\nimport {\n defineAperturesForLayer,\n getApertureConfigFromCirclePcbHole,\n getApertureConfigFromPcbPlatedHole,\n getApertureConfigFromPcbCopperText,\n getApertureConfigFromPcbSilkscreenPath,\n getApertureConfigFromPcbSilkscreenText,\n getApertureConfigFromPcbSmtpad,\n getApertureConfigFromPcbSolderPaste,\n getApertureConfigFromPcbVia,\n} from \"./defineAperturesForLayer\"\nimport type { PcbCutout } from \"circuit-json\"\nimport { findApertureNumber } from \"./findApertureNumber\"\nimport { getCommandHeaders } from \"./getCommandHeaders\"\nimport { getGerberLayerName } from \"./getGerberLayerName\"\nimport { lineAlphabet } from \"@tscircuit/alphabet\"\nimport {\n applyToPoint,\n compose,\n identity,\n rotate,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport type { AnyGerberCommand } from \"../any_gerber_command\"\n\n/**\n * Converts tscircuit soup to arrays of Gerber commands for each layer\n */\nexport const convertSoupToGerberCommands = (\n soup: AnyCircuitElement[],\n opts: { flip_y_axis?: boolean } = {},\n): LayerToGerberCommandsMap => {\n opts.flip_y_axis ??= false\n const hasPanel = soup.some((e) => e.type === \"pcb_panel\")\n const glayers: LayerToGerberCommandsMap = {\n F_Cu: getCommandHeaders({\n layer: \"top\",\n layer_type: \"copper\",\n }),\n F_SilkScreen: getCommandHeaders({\n layer: \"top\",\n layer_type: \"silkscreen\",\n }),\n F_Mask: getCommandHeaders({\n layer: \"top\",\n layer_type: \"soldermask\",\n }),\n F_Paste: getCommandHeaders({\n layer: \"top\",\n layer_type: \"paste\",\n }),\n B_Cu: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"copper\",\n }),\n B_SilkScreen: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"silkscreen\",\n }),\n B_Mask: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"soldermask\",\n }),\n B_Paste: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"paste\",\n }),\n Edge_Cuts: getCommandHeaders({\n layer: \"edgecut\",\n }),\n }\n\n for (const glayer_name of [\n \"F_Cu\",\n \"B_Cu\",\n \"F_Mask\",\n \"B_Mask\",\n \"F_Paste\",\n \"B_Paste\",\n \"F_SilkScreen\",\n \"B_SilkScreen\",\n ] as const) {\n const glayer = glayers[glayer_name]\n defineCommonMacros(glayer)\n defineAperturesForLayer({\n soup,\n glayer,\n glayer_name,\n })\n }\n\n // Edgecuts has a single aperature\n glayers.Edge_Cuts.push(\n ...gerberBuilder()\n .add(\"define_aperture_template\", {\n aperture_number: 10,\n standard_template_code: \"C\",\n diameter: 0.05, //mm\n })\n .build(),\n )\n\n /**\n * \"maybe flip y axis\" to handle y axis negating\n */\n const mfy = (y: number) => (opts.flip_y_axis ? -y : y)\n\n const rotationLookup = new Map<string, number>()\n for (const element of soup) {\n if (\n element.type === \"pcb_plated_hole\" &&\n \"x\" in element &&\n typeof element.x === \"number\" &&\n \"y\" in element &&\n typeof element.y === \"number\"\n ) {\n const rotation =\n \"ccw_rotation\" in element && typeof element.ccw_rotation === \"number\"\n ? element.ccw_rotation\n : 0\n rotationLookup.set(`${element.x}:${element.y}`, rotation)\n }\n }\n\n const renderVectorText = (\n element: any,\n layer: \"top\" | \"bottom\",\n layerType: \"copper\" | \"silkscreen\",\n getApertureConfig: (elm: any) => any,\n ) => {\n if (element.layer !== layer) return\n // The acctual Uppercase letters are 70% of the font size\n // sources: https://forum.generic-mapping-tools.org/t/what-exactly-is-the-custom-font-s-height-point-size-ratio/1265/2\n const CAP_HEIGHT_SCALE = 0.7 // Adjust based on your font's metrics\n const glayer = glayers[getGerberLayerName(layer, layerType)]\n const apertureConfig = getApertureConfig(element)\n const gerber = gerberBuilder().add(\"select_aperture\", {\n aperture_number: findApertureNumber(glayer, apertureConfig),\n })\n\n let initialX = element.anchor_position.x\n let initialY = element.anchor_position.y\n const fontSize = element.font_size * CAP_HEIGHT_SCALE\n const letterSpacing = fontSize * 0.4\n const spaceWidth = fontSize * 0.5\n\n const textWidth =\n element.text.split(\"\").reduce((width: number, char: string) => {\n if (char === \" \") {\n return width + spaceWidth + letterSpacing\n }\n return width + fontSize + letterSpacing\n }, 0) - letterSpacing\n\n const textHeight = fontSize\n\n const anchorAlignment =\n element.anchor_alignment ||\n (():\n | \"top_center\"\n | \"bottom_center\"\n | \"center_left\"\n | \"center_right\"\n | undefined => {\n const side = element.anchor_side as\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | undefined\n if (!side) return undefined\n switch (side) {\n case \"top\":\n return \"top_center\"\n case \"bottom\":\n return \"bottom_center\"\n case \"left\":\n return \"center_left\"\n case \"right\":\n return \"center_right\"\n }\n })() ||\n \"center\"\n\n switch (anchorAlignment) {\n case \"top_left\":\n break\n case \"top_center\":\n initialX -= textWidth / 2\n break\n case \"top_right\":\n initialX -= textWidth\n break\n case \"center_right\":\n initialY -= textHeight / 2\n break\n case \"center_left\":\n initialX -= textWidth\n initialY -= textHeight / 2\n break\n case \"bottom_left\":\n initialY -= textHeight\n break\n case \"bottom_center\":\n initialX -= textWidth / 2\n initialY -= textHeight\n break\n case \"bottom_right\":\n initialX -= textWidth\n initialY -= textHeight\n break\n default:\n initialX -= textWidth / 2\n initialY -= textHeight / 2\n break\n }\n\n let anchoredX = initialX\n const anchoredY = initialY\n\n let rotation = element.ccw_rotation || 0\n const cx = anchoredX + textWidth / 2\n const cy = anchoredY + textHeight / 2\n const transforms: Matrix[] = []\n\n const shouldMirror =\n element.is_mirrored !== undefined\n ? element.is_mirrored\n : element.layer === \"bottom\"\n\n if (shouldMirror) {\n transforms.push(\n translate(cx, cy),\n { a: -1, b: 0, c: 0, d: 1, e: 0, f: 0 },\n translate(-cx, -cy),\n )\n rotation = -rotation\n }\n\n if (rotation) {\n const rad = (rotation * Math.PI) / 180\n transforms.push(translate(cx, cy), rotate(rad), translate(-cx, -cy))\n }\n\n const transformMatrix =\n transforms.length > 0 ? compose(...transforms) : undefined\n\n const applyTransform = (point: { x: number; y: number }) =>\n transformMatrix ? applyToPoint(transformMatrix, point) : point\n\n if (layerType === \"copper\" && element.is_knockout) {\n const padding = element.knockout_padding ?? {\n left: 0.2,\n right: 0.2,\n top: 0.2,\n bottom: 0.2,\n }\n\n const paddedRect = [\n { x: initialX - padding.left, y: initialY - padding.top },\n {\n x: initialX + textWidth + padding.right,\n y: initialY - padding.top,\n },\n {\n x: initialX + textWidth + padding.right,\n y: initialY + textHeight + padding.bottom,\n },\n {\n x: initialX - padding.left,\n y: initialY + textHeight + padding.bottom,\n },\n ].map(applyTransform)\n\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(glayer, apertureConfig),\n })\n .add(\"start_region_statement\", {})\n .add(\"move_operation\", {\n x: paddedRect[0].x,\n y: mfy(paddedRect[0].y),\n })\n .add(\"plot_operation\", {\n x: paddedRect[1].x,\n y: mfy(paddedRect[1].y),\n })\n .add(\"plot_operation\", {\n x: paddedRect[2].x,\n y: mfy(paddedRect[2].y),\n })\n .add(\"plot_operation\", {\n x: paddedRect[3].x,\n y: mfy(paddedRect[3].y),\n })\n .add(\"plot_operation\", {\n x: paddedRect[0].x,\n y: mfy(paddedRect[0].y),\n })\n .add(\"end_region_statement\", {})\n .build(),\n )\n\n glayer.push(\n ...gerberBuilder().add(\"set_layer_polarity\", { polarity: \"C\" }).build(),\n )\n }\n\n for (const char of element.text.toUpperCase()) {\n if (char === \" \") {\n anchoredX += spaceWidth + letterSpacing\n continue\n }\n\n const letterPaths = lineAlphabet[char] || []\n for (const path of letterPaths) {\n const x1 = anchoredX + path.x1 * fontSize\n const y1 = anchoredY + path.y1 * fontSize\n const x2 = anchoredX + path.x2 * fontSize\n const y2 = anchoredY + path.y2 * fontSize\n\n const p1 = applyTransform({ x: x1, y: y1 })\n const p2 = applyTransform({ x: x2, y: y2 })\n\n gerber.add(\"move_operation\", { x: p1.x, y: mfy(p1.y) })\n gerber.add(\"plot_operation\", { x: p2.x, y: mfy(p2.y) })\n }\n\n anchoredX += fontSize + letterSpacing\n }\n\n glayer.push(...gerber.build())\n\n if (layerType === \"copper\" && element.is_knockout) {\n glayer.push(\n ...gerberBuilder().add(\"set_layer_polarity\", { polarity: \"D\" }).build(),\n )\n }\n }\n\n // Helper to draw a ring into a gerber builder (used for copper pours)\n const drawRingToBuilder = (\n builder: ReturnType<typeof gerberBuilder>,\n ring: {\n vertices: Array<{ x: number; y: number; bulge?: number }>\n },\n ) => {\n if (!ring || ring.vertices.length === 0) return\n\n builder.add(\"move_operation\", {\n x: ring.vertices[0].x,\n y: mfy(ring.vertices[0].y),\n })\n\n const vertices_loop = [...ring.vertices, ring.vertices[0]]\n\n for (let i = 0; i < vertices_loop.length - 1; i++) {\n const start = vertices_loop[i]\n const end = vertices_loop[i + 1]\n\n if (start.bulge && Math.abs(start.bulge) > 1e-9) {\n const bulge = (opts.flip_y_axis ? -1 : 1) * (start.bulge as number)\n if (bulge > 0) {\n // CCW\n builder.add(\"set_movement_mode_to_counterclockwise_circular\", {})\n } else {\n // CW\n builder.add(\"set_movement_mode_to_clockwise_circular\", {})\n }\n\n const p1 = { x: start.x, y: start.y }\n const p2 = { x: end.x, y: end.y }\n\n const dx = p2.x - p1.x\n const dy = p2.y - p1.y\n const d = Math.sqrt(dx * dx + dy * dy)\n\n if (d < 1e-9) {\n builder.add(\"set_movement_mode_to_linear\", {})\n builder.add(\"plot_operation\", {\n x: end.x,\n y: mfy(end.y),\n })\n continue\n }\n\n const abs_b = Math.abs(bulge)\n const theta = 4 * Math.atan(abs_b)\n if (Math.abs(Math.sin(theta / 2)) < 1e-9) {\n builder.add(\"set_movement_mode_to_linear\", {})\n builder.add(\"plot_operation\", {\n x: end.x,\n y: mfy(end.y),\n })\n continue\n }\n const R = d / (2 * Math.sin(theta / 2))\n const alpha = (Math.PI - theta) / 2\n const phi = Math.atan2(dy, dx)\n const delta_angle = bulge > 0 ? alpha : -alpha\n const angle_p1_center = phi + delta_angle\n const Cx = p1.x + R * Math.cos(angle_p1_center)\n const Cy = p1.y + R * Math.sin(angle_p1_center)\n\n const i_offset = Cx - p1.x\n const j_offset = Cy - p1.y\n\n builder.add(\"plot_operation\", {\n x: end.x,\n y: mfy(end.y),\n i: i_offset,\n j: opts.flip_y_axis ? -j_offset : j_offset,\n })\n } else {\n // line\n builder.add(\"set_movement_mode_to_linear\", {})\n builder.add(\"plot_operation\", { x: end.x, y: mfy(end.y) })\n }\n }\n }\n\n // To conform to Gerber spec (CCW outer, CW inner) from tscircuit\n // spec (CW outer, CCW inner), we must reverse both.\n const reverseRing = (ring: {\n vertices: Array<{ x: number; y: number; bulge?: number }>\n }): {\n vertices: Array<{ x: number; y: number; bulge?: number }>\n } => {\n const { vertices } = ring\n if (!vertices || vertices.length === 0) return { vertices: [] }\n const n = vertices.length\n\n const reversed_pts = [...vertices].reverse()\n\n const new_vertices = reversed_pts.map((pt, i) => {\n const bulge_v_idx = (n - 2 - i + n) % n\n const bulge = vertices[bulge_v_idx].bulge\n return { ...pt, bulge: bulge ? -bulge : undefined }\n })\n\n return { vertices: new_vertices }\n }\n\n // FIRST PASS: Process copper pours first\n // Copper pours must be rendered before traces/pads/vias so that:\n // 1. Pour is drawn (LPD - dark)\n // 2. Cutouts are drawn (LPC - clear)\n // 3. Traces/pads/vias are drawn on top (LPD - dark)\n for (const layer of [\"top\", \"bottom\"] as const) {\n for (const element of soup) {\n if (element.type === \"pcb_copper_pour\" && layer === element.layer) {\n const copper_glayer = glayers[getGerberLayerName(layer, \"copper\")]\n\n // Collect all pour commands for this element\n const all_pour_commands: AnyGerberCommand[] = []\n\n if (element.shape === \"brep\") {\n const { brep_shape } = element\n if (!brep_shape) continue\n const { outer_ring, inner_rings } = brep_shape\n\n // Draw outer ring as a filled region (dark polarity - default)\n const outer_builder = gerberBuilder()\n .add(\"select_aperture\", { aperture_number: 10 })\n .add(\"start_region_statement\", {})\n\n drawRingToBuilder(outer_builder, reverseRing(outer_ring))\n\n outer_builder.add(\"end_region_statement\", {})\n all_pour_commands.push(...outer_builder.build())\n\n // Draw inner rings (cutouts) using clear polarity\n // Each inner ring is drawn as a separate region with LPC (clear)\n if (inner_rings && inner_rings.length > 0) {\n // Switch to clear polarity\n all_pour_commands.push(\n ...gerberBuilder()\n .add(\"set_layer_polarity\", { polarity: \"C\" })\n .build(),\n )\n\n for (const inner_ring of inner_rings) {\n const inner_builder = gerberBuilder()\n .add(\"select_aperture\", { aperture_number: 10 })\n .add(\"start_region_statement\", {})\n\n // For clear polarity, we don't need to reverse - draw as-is\n // The polarity handles the \"hole\" semantics\n drawRingToBuilder(inner_builder, inner_ring)\n\n inner_builder.add(\"end_region_statement\", {})\n all_pour_commands.push(...inner_builder.build())\n }\n\n // Switch back to dark polarity\n all_pour_commands.push(\n ...gerberBuilder()\n .add(\"set_layer_polarity\", { polarity: \"D\" })\n .build(),\n )\n }\n } else if (element.shape === \"rect\") {\n const { center, width, height, rotation } = element\n const w = (width as number) / 2\n const h = (height as number) / 2\n\n const points = [\n { x: -w, y: h }, // Top-left\n { x: w, y: h }, // Top-right\n { x: w, y: -h }, // Bottom-right\n { x: -w, y: -h }, // Bottom-left\n ]\n\n let transformMatrix = identity()\n if (rotation) {\n const angle_rad = ((rotation as number) * Math.PI) / 180\n transformMatrix = rotate(angle_rad)\n }\n transformMatrix = compose(\n translate(center.x, center.y),\n transformMatrix,\n )\n\n const transformedPoints = points.map((p) =>\n applyToPoint(transformMatrix, p),\n )\n\n const rect_builder = gerberBuilder()\n .add(\"select_aperture\", { aperture_number: 10 })\n .add(\"start_region_statement\", {})\n\n rect_builder.add(\"move_operation\", {\n x: transformedPoints[0].x,\n y: mfy(transformedPoints[0].y),\n })\n for (let i = 1; i < transformedPoints.length; i++) {\n rect_builder.add(\"plot_operation\", {\n x: transformedPoints[i].x,\n y: mfy(transformedPoints[i].y),\n })\n }\n rect_builder.add(\"plot_operation\", {\n x: transformedPoints[0].x,\n y: mfy(transformedPoints[0].y),\n })\n\n rect_builder.add(\"end_region_statement\", {})\n all_pour_commands.push(...rect_builder.build())\n } else if (element.shape === \"polygon\") {\n const { points } = element\n if (points.length > 0) {\n const poly_builder = gerberBuilder()\n .add(\"select_aperture\", { aperture_number: 10 })\n .add(\"start_region_statement\", {})\n\n poly_builder.add(\"move_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n for (let i = 1; i < points.length; i++) {\n poly_builder.add(\"plot_operation\", {\n x: points[i].x,\n y: mfy(points[i].y),\n })\n }\n poly_builder.add(\"plot_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n\n poly_builder.add(\"end_region_statement\", {})\n all_pour_commands.push(...poly_builder.build())\n }\n }\n\n copper_glayer.push(...all_pour_commands)\n\n if (element.covered_with_solder_mask === false) {\n const mask_layer = glayers[getGerberLayerName(layer, \"soldermask\")]\n mask_layer.push(...all_pour_commands)\n }\n }\n }\n }\n\n // SECOND PASS: Process all other elements (traces, pads, vias, etc.)\n for (const layer of [\"top\", \"bottom\", \"edgecut\"] as const) {\n for (const element of soup) {\n if (element.type === \"pcb_trace\") {\n const { route } = element\n for (const [a, b] of pairs(route)) {\n // TODO b kind of matters here, this doesn't handle a bunch of cases\n // but the definition of a route is also kind of broken, a \"wire\" is\n // a relationship between two points and can't really be a type of\n // point\n if (a.route_type === \"wire\") {\n if (a.layer === layer) {\n const glayer = glayers[getGerberLayerName(layer, \"copper\")]\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(glayer, {\n trace_width: a.width,\n }),\n })\n .add(\"move_operation\", { x: a.x, y: mfy(a.y) })\n .add(\"plot_operation\", { x: b.x, y: mfy(b.y) })\n .build(),\n )\n }\n }\n }\n } else if (element.type === \"pcb_silkscreen_path\") {\n if (element.layer === layer) {\n const glayer = glayers[getGerberLayerName(layer, \"silkscreen\")]\n const apertureConfig = getApertureConfigFromPcbSilkscreenPath(element)\n const gerber = gerberBuilder().add(\"select_aperture\", {\n aperture_number: findApertureNumber(glayer, apertureConfig),\n })\n // Move to the first point\n if (element.route.length > 0) {\n gerber.add(\"move_operation\", {\n x: element.route[0].x,\n y: mfy(element.route[0].y),\n })\n }\n\n // Plot lines to subsequent points\n for (let i = 1; i < element.route.length; i++) {\n gerber.add(\"plot_operation\", {\n x: element.route[i].x,\n y: mfy(element.route[i].y),\n })\n }\n\n glayer.push(...gerber.build())\n }\n } else if (\n element.type === \"pcb_silkscreen_text\" &&\n layer !== \"edgecut\"\n ) {\n renderVectorText(\n element,\n layer,\n \"silkscreen\",\n getApertureConfigFromPcbSilkscreenText,\n )\n } else if (element.type === \"pcb_copper_text\" && layer !== \"edgecut\") {\n renderVectorText(\n element,\n layer,\n \"copper\",\n getApertureConfigFromPcbCopperText,\n )\n } else if (element.type === \"pcb_smtpad\" && element.shape !== \"polygon\") {\n if (element.layer === layer) {\n for (const glayer of [\n glayers[getGerberLayerName(layer, \"copper\")],\n glayers[getGerberLayerName(layer, \"soldermask\")],\n ]) {\n const apertureConfig = getApertureConfigFromPcbSmtpad(element)\n const apertureNumber = findApertureNumber(glayer, apertureConfig)\n const gb = gerberBuilder().add(\"select_aperture\", {\n aperture_number: apertureNumber,\n })\n\n if (element.shape === \"rotated_rect\" && element.ccw_rotation) {\n gb.add(\"load_rotation\", {\n rotation_degrees: element.ccw_rotation,\n })\n }\n\n gb.add(\"flash_operation\", { x: element.x, y: mfy(element.y) })\n\n if (element.shape === \"rotated_rect\" && element.ccw_rotation) {\n // Reset rotation\n gb.add(\"load_rotation\", { rotation_degrees: 0 })\n }\n\n glayer.push(...gb.build())\n }\n }\n } else if (element.type === \"pcb_smtpad\" && element.shape === \"polygon\") {\n if (element.layer === layer) {\n const layers_to_add_to = [\n glayers[getGerberLayerName(layer, \"copper\")],\n ]\n\n // Add to soldermask layer unless explicitly covered\n if (\n !(\"is_covered_with_solder_mask\" in element) ||\n element.is_covered_with_solder_mask !== false\n ) {\n layers_to_add_to.push(\n glayers[getGerberLayerName(layer, \"soldermask\")],\n )\n }\n\n for (const glayer of layers_to_add_to) {\n const pad_builder = gerberBuilder()\n .add(\"select_aperture\", { aperture_number: 10 })\n .add(\"start_region_statement\", {})\n\n const { points } = element\n if (points && points.length > 0) {\n pad_builder.add(\"move_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n for (let i = 1; i < points.length; i++) {\n pad_builder.add(\"plot_operation\", {\n x: points[i].x,\n y: mfy(points[i].y),\n })\n }\n pad_builder.add(\"plot_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n }\n\n pad_builder.add(\"end_region_statement\", {})\n\n glayer.push(...pad_builder.build())\n }\n }\n } else if (element.type === \"pcb_solder_paste\") {\n if (element.layer === layer) {\n const glayer = glayers[getGerberLayerName(layer, \"paste\")]\n const aperture_number = findApertureNumber(\n glayer,\n getApertureConfigFromPcbSolderPaste(element),\n )\n const rotation =\n \"ccw_rotation\" in element &&\n typeof element.ccw_rotation === \"number\"\n ? element.ccw_rotation\n : (rotationLookup.get(`${element.x}:${element.y}`) ?? 0)\n\n const gb = gerberBuilder().add(\"select_aperture\", {\n aperture_number,\n })\n if (rotation) {\n gb.add(\"load_rotation\", { rotation_degrees: rotation })\n }\n gb.add(\"flash_operation\", { x: element.x, y: mfy(element.y) })\n if (rotation) {\n gb.add(\"load_rotation\", { rotation_degrees: 0 })\n }\n glayer.push(...gb.build())\n }\n } else if (element.type === \"pcb_plated_hole\") {\n if (element.layers.includes(layer as any)) {\n for (const glayer of [\n glayers[getGerberLayerName(layer, \"copper\")],\n glayers[getGerberLayerName(layer, \"soldermask\")],\n ]) {\n // --- Compute effective copper pad dimensions ---\n const holeW =\n \"hole_width\" in element && typeof element.hole_width === \"number\"\n ? element.hole_width\n : 0\n const holeH =\n \"hole_height\" in element &&\n typeof element.hole_height === \"number\"\n ? element.hole_height\n : 0\n\n const padWidthCandidates: number[] = [holeW]\n if (\n \"outer_width\" in element &&\n typeof element.outer_width === \"number\"\n ) {\n padWidthCandidates.push(element.outer_width)\n }\n if (\n \"rect_pad_width\" in element &&\n typeof element.rect_pad_width === \"number\"\n ) {\n padWidthCandidates.push(element.rect_pad_width)\n }\n const padW = Math.max(...padWidthCandidates)\n\n const padHeightCandidates: number[] = [holeH]\n if (\n \"outer_height\" in element &&\n typeof element.outer_height === \"number\"\n ) {\n padHeightCandidates.push(element.outer_height)\n }\n if (\n \"rect_pad_height\" in element &&\n typeof element.rect_pad_height === \"number\"\n ) {\n padHeightCandidates.push(element.rect_pad_height)\n }\n const padH = Math.max(...padHeightCandidates)\n\n if (element.shape === \"pill\") {\n // Use min dimension as slot width (aperture circle)\n const circleApertureConfig = {\n standard_template_code: \"C\" as const,\n diameter: Math.min(padW, padH),\n }\n\n let aperture_number: number\n try {\n aperture_number = findApertureNumber(\n glayer,\n circleApertureConfig,\n )\n } catch {\n aperture_number =\n Math.max(\n ...glayer\n .filter((cmd) => \"aperture_number\" in cmd)\n .map((cmd) => cmd.aperture_number),\n 9,\n ) + 1\n\n glayer.push(\n ...gerberBuilder()\n .add(\"define_aperture_template\", {\n aperture_number,\n ...circleApertureConfig,\n })\n .build(),\n )\n }\n\n const gb = gerberBuilder().add(\"select_aperture\", {\n aperture_number,\n })\n\n const rotationRadians =\n ((element.ccw_rotation ?? 0) * Math.PI) / 180\n const cosTheta = Math.cos(rotationRadians)\n const sinTheta = Math.sin(rotationRadians)\n\n const rotateAndTranslate = (dx: number, dy: number) => {\n const rotatedX = dx * cosTheta - dy * sinTheta\n const rotatedY = dx * sinTheta + dy * cosTheta\n return {\n x: element.x + rotatedX,\n y: element.y + rotatedY,\n }\n }\n\n const isHorizontal = padW >= padH\n const offset = isHorizontal\n ? (padW - padH) / 2\n : (padH - padW) / 2\n\n if (offset <= 0) {\n const center = rotateAndTranslate(0, 0)\n gb.add(\"flash_operation\", { x: center.x, y: mfy(center.y) })\n } else {\n const startRelative = isHorizontal\n ? { x: -offset, y: 0 }\n : { x: 0, y: -offset }\n const endRelative = isHorizontal\n ? { x: offset, y: 0 }\n : { x: 0, y: offset }\n\n const startPoint = rotateAndTranslate(\n startRelative.x,\n startRelative.y,\n )\n const endPoint = rotateAndTranslate(\n endRelative.x,\n endRelative.y,\n )\n\n gb.add(\"flash_operation\", {\n x: startPoint.x,\n y: mfy(startPoint.y),\n })\n .add(\"move_operation\", {\n x: startPoint.x,\n y: mfy(startPoint.y),\n })\n .add(\"plot_operation\", {\n x: endPoint.x,\n y: mfy(endPoint.y),\n })\n .add(\"flash_operation\", {\n x: endPoint.x,\n y: mfy(endPoint.y),\n })\n }\n\n glayer.push(...gb.build())\n } else {\n // Non-pill shapes (rect, circle)\n const apertureConfig = getApertureConfigFromPcbPlatedHole({\n ...element,\n ...(element.shape !== \"circle\"\n ? { outer_width: padW, outer_height: padH }\n : {}),\n })\n const rotation =\n \"rect_ccw_rotation\" in element &&\n typeof element.rect_ccw_rotation === \"number\" &&\n Math.abs(padW - padH) > 1e-9\n ? element.rect_ccw_rotation\n : undefined\n\n const gb = gerberBuilder().add(\"select_aperture\", {\n aperture_number: findApertureNumber(glayer, apertureConfig),\n })\n\n if (rotation)\n gb.add(\"load_rotation\", { rotation_degrees: rotation })\n\n gb.add(\"flash_operation\", { x: element.x, y: mfy(element.y) })\n\n if (rotation) gb.add(\"load_rotation\", { rotation_degrees: 0 })\n\n glayer.push(...gb.build())\n }\n }\n }\n } else if (element.type === \"pcb_hole\") {\n if (layer !== \"edgecut\") {\n for (const glayer of [\n glayers[getGerberLayerName(layer, \"soldermask\")],\n ]) {\n if (element.hole_shape !== \"circle\") {\n console.warn(\n \"NOT IMPLEMENTED: drawing gerber for non-round holes\",\n )\n continue\n }\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(\n glayer,\n getApertureConfigFromCirclePcbHole(element),\n ),\n })\n .add(\"flash_operation\", { x: element.x, y: mfy(element.y) })\n .build(),\n )\n }\n }\n } else if (element.type === \"pcb_via\") {\n if (element.layers.includes(layer as any)) {\n for (const glayer of [glayers[getGerberLayerName(layer, \"copper\")]]) {\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(\n glayer,\n getApertureConfigFromPcbVia(element),\n ),\n })\n .add(\"flash_operation\", { x: element.x, y: mfy(element.y) })\n .build(),\n )\n }\n }\n } else if (element.type === \"pcb_board\" && layer === \"edgecut\") {\n // Skip boards when a panel exists\n if (hasPanel) continue\n\n const glayer = glayers.Edge_Cuts\n const { width, height, center, outline } = element\n const gerberBuild = gerberBuilder().add(\"select_aperture\", {\n aperture_number: 10,\n })\n if (outline && outline.length > 2) {\n const outlinePoints = outline.map((point) => ({\n x: point.x,\n y: mfy(point.y),\n }))\n\n const firstPoint = outlinePoints[0]\n gerberBuild.add(\"move_operation\", firstPoint)\n for (let i = 1; i < outlinePoints.length; i++) {\n gerberBuild.add(\"plot_operation\", outlinePoints[i])\n }\n\n const lastPoint = outlinePoints[outlinePoints.length - 1]\n if (lastPoint.x !== firstPoint.x || lastPoint.y !== firstPoint.y) {\n gerberBuild.add(\"plot_operation\", firstPoint)\n }\n } else {\n gerberBuild\n .add(\"move_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n .add(\"plot_operation\", {\n x: center!.x + width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n // .add(\"move_operation\", {\n // x: center.x + width / 2,\n // y: center.y - height / 2,\n // })\n .add(\"plot_operation\", {\n x: center!.x + width! / 2,\n y: mfy(center!.y + height! / 2),\n })\n // .add(\"move_operation\", {\n // x: center.x + width / 2,\n // y: center.y + height / 2,\n // })\n .add(\"plot_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y + height! / 2),\n })\n // .add(\"move_operation\", {\n // x: center.x - width / 2,\n // y: center.y + height / 2,\n // })\n .add(\"plot_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n }\n\n glayer.push(...gerberBuild.build())\n } else if (element.type === \"pcb_panel\" && layer === \"edgecut\") {\n const glayer = glayers.Edge_Cuts\n const panel = element\n const { width, height, center } = panel\n const gerberBuild = gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: 10,\n })\n .add(\"move_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n .add(\"plot_operation\", {\n x: center!.x + width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n .add(\"plot_operation\", {\n x: center!.x + width! / 2,\n y: mfy(center!.y + height! / 2),\n })\n .add(\"plot_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y + height! / 2),\n })\n .add(\"plot_operation\", {\n x: center!.x - width! / 2,\n y: mfy(center!.y - height! / 2),\n })\n\n glayer.push(...gerberBuild.build())\n } else if (element.type === \"pcb_cutout\") {\n if (layer === \"edgecut\") {\n const ec_layer = glayers.Edge_Cuts\n const cutout_builder = gerberBuilder().add(\"select_aperture\", {\n aperture_number: 10,\n })\n\n const el = element as PcbCutout\n\n if (el.shape === \"rect\") {\n const { center, width, height, rotation, corner_radius } = el\n const w = width / 2\n const h = height / 2\n const r = Math.max(\n 0,\n Math.min(corner_radius ?? 0, Math.abs(w), Math.abs(h)),\n )\n\n const makeTransformMatrix = () => {\n let transformMatrix = identity()\n if (rotation) {\n const angle_rad = (rotation * Math.PI) / 180\n transformMatrix = rotate(angle_rad)\n }\n return compose(translate(center.x, center.y), transformMatrix)\n }\n\n const transformMatrix = makeTransformMatrix()\n\n if (r > 0) {\n const startPoint = { x: -w + r, y: h }\n\n let currentPoint = applyToPoint(transformMatrix, startPoint)\n\n cutout_builder.add(\"move_operation\", {\n x: currentPoint.x,\n y: mfy(currentPoint.y),\n })\n\n const addLine = (point: { x: number; y: number }) => {\n const transformedPoint = applyToPoint(transformMatrix, point)\n cutout_builder.add(\"plot_operation\", {\n x: transformedPoint.x,\n y: mfy(transformedPoint.y),\n })\n currentPoint = transformedPoint\n }\n\n const addArc = (options: {\n point: { x: number; y: number }\n center: { x: number; y: number }\n }) => {\n const transformedPoint = applyToPoint(\n transformMatrix,\n options.point,\n )\n const transformedCenter = applyToPoint(\n transformMatrix,\n options.center,\n )\n\n cutout_builder\n .add(\"set_movement_mode_to_clockwise_circular\", {})\n .add(\"plot_operation\", {\n x: transformedPoint.x,\n y: mfy(transformedPoint.y),\n i: transformedCenter.x - currentPoint.x,\n j: mfy(transformedCenter.y) - mfy(currentPoint.y),\n })\n .add(\"set_movement_mode_to_linear\", {})\n\n currentPoint = transformedPoint\n }\n\n addLine({ x: w - r, y: h })\n addArc({\n point: { x: w, y: h - r },\n center: { x: w - r, y: h - r },\n })\n addLine({ x: w, y: -h + r })\n addArc({\n point: { x: w - r, y: -h },\n center: { x: w - r, y: -h + r },\n })\n addLine({ x: -w + r, y: -h })\n addArc({\n point: { x: -w, y: -h + r },\n center: { x: -w + r, y: -h + r },\n })\n addLine({ x: -w, y: h - r })\n addArc({\n point: { x: -w + r, y: h },\n center: { x: -w + r, y: h - r },\n })\n } else {\n const points = [\n { x: -w, y: h }, // Top-left\n { x: w, y: h }, // Top-right\n { x: w, y: -h }, // Bottom-right\n { x: -w, y: -h }, // Bottom-left\n ]\n\n const transformedPoints = points.map((p) =>\n applyToPoint(transformMatrix, p),\n )\n\n cutout_builder.add(\"move_operation\", {\n x: transformedPoints[0].x,\n y: mfy(transformedPoints[0].y),\n })\n for (let i = 1; i < transformedPoints.length; i++) {\n cutout_builder.add(\"plot_operation\", {\n x: transformedPoints[i].x,\n y: mfy(transformedPoints[i].y),\n })\n }\n cutout_builder.add(\"plot_operation\", {\n x: transformedPoints[0].x,\n y: mfy(transformedPoints[0].y),\n })\n }\n } else if (el.shape === \"circle\") {\n const { center, radius } = el\n\n // To draw a circle, we draw two semi-circles\n const p1 = { x: center.x + radius, y: center.y }\n const p2 = { x: center.x - radius, y: center.y }\n\n cutout_builder\n .add(\"move_operation\", {\n x: p1.x,\n y: mfy(p1.y),\n })\n .add(\"set_movement_mode_to_counterclockwise_circular\", {})\n // Draw the first semi-circle (top half if we start from rightmost point)\n .add(\"plot_operation\", {\n x: p2.x,\n y: mfy(p2.y),\n i: -radius,\n j: 0,\n })\n // Draw the second semi-circle (bottom half)\n .add(\"plot_operation\", {\n x: p1.x,\n y: mfy(p1.y),\n i: radius,\n j: 0,\n })\n .add(\"set_movement_mode_to_linear\", {})\n } else if (el.shape === \"polygon\") {\n const { points } = el\n if (points.length > 0) {\n cutout_builder.add(\"move_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n for (let i = 1; i < points.length; i++) {\n cutout_builder.add(\"plot_operation\", {\n x: points[i].x,\n y: mfy(points[i].y),\n })\n }\n cutout_builder.add(\"plot_operation\", {\n x: points[0].x,\n y: mfy(points[0].y),\n })\n }\n }\n ec_layer.push(...cutout_builder.build())\n }\n }\n }\n }\n\n for (const key of Object.keys(glayers)) {\n glayers[key as keyof LayerToGerberCommandsMap].push(\n ...gerberBuilder().add(\"end_of_file\", {}).build(),\n )\n }\n\n return glayers\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","transformMatrix"]}
|