circuit-json-to-gerber 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +28 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -967,8 +967,7 @@ var getApertureConfigFromCirclePcbPlatedHole = (elm) => {
|
|
|
967
967
|
}
|
|
968
968
|
return {
|
|
969
969
|
standard_template_code: "C",
|
|
970
|
-
diameter: elm.outer_diameter
|
|
971
|
-
hole_diameter: elm.hole_diameter
|
|
970
|
+
diameter: elm.outer_diameter
|
|
972
971
|
};
|
|
973
972
|
};
|
|
974
973
|
var getApertureConfigFromCirclePcbHole = (elm) => {
|
|
@@ -982,6 +981,17 @@ var getApertureConfigFromCirclePcbHole = (elm) => {
|
|
|
982
981
|
diameter: elm.hole_diameter
|
|
983
982
|
};
|
|
984
983
|
};
|
|
984
|
+
var getApertureConfigFromPcbVia = (elm) => {
|
|
985
|
+
if (!("outer_diameter" in elm)) {
|
|
986
|
+
throw new Error(
|
|
987
|
+
"outer_diameter not specified in getApertureConfigFromPcbVia"
|
|
988
|
+
);
|
|
989
|
+
}
|
|
990
|
+
return {
|
|
991
|
+
standard_template_code: "C",
|
|
992
|
+
diameter: elm.outer_diameter
|
|
993
|
+
};
|
|
994
|
+
};
|
|
985
995
|
function getAllApertureTemplateConfigsForLayer(soup, layer) {
|
|
986
996
|
const configs = [];
|
|
987
997
|
const configHashMap = /* @__PURE__ */ new Set();
|
|
@@ -1011,6 +1021,8 @@ function getAllApertureTemplateConfigsForLayer(soup, layer) {
|
|
|
1011
1021
|
if (elm.hole_shape === "circle")
|
|
1012
1022
|
addConfigIfNew(getApertureConfigFromCirclePcbHole(elm));
|
|
1013
1023
|
else console.warn("NOT IMPLEMENTED: drawing gerber for non circle holes");
|
|
1024
|
+
} else if (elm.type === "pcb_via") {
|
|
1025
|
+
addConfigIfNew(getApertureConfigFromPcbVia(elm));
|
|
1014
1026
|
}
|
|
1015
1027
|
}
|
|
1016
1028
|
return configs;
|
|
@@ -1042,7 +1054,7 @@ var findApertureNumber = (glayer, search_params) => {
|
|
|
1042
1054
|
// package.json
|
|
1043
1055
|
var package_default = {
|
|
1044
1056
|
name: "circuit-json-to-gerber",
|
|
1045
|
-
version: "0.0.
|
|
1057
|
+
version: "0.0.8",
|
|
1046
1058
|
main: "dist/index.js",
|
|
1047
1059
|
type: "module",
|
|
1048
1060
|
scripts: {
|
|
@@ -1252,6 +1264,19 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
|
|
|
1252
1264
|
);
|
|
1253
1265
|
}
|
|
1254
1266
|
}
|
|
1267
|
+
} else if (element.type === "pcb_via") {
|
|
1268
|
+
if (element.layers.includes(layer)) {
|
|
1269
|
+
for (const glayer of [glayers[getGerberLayerName(layer, "copper")]]) {
|
|
1270
|
+
glayer.push(
|
|
1271
|
+
...gerberBuilder().add("select_aperture", {
|
|
1272
|
+
aperture_number: findApertureNumber(
|
|
1273
|
+
glayer,
|
|
1274
|
+
getApertureConfigFromPcbVia(element)
|
|
1275
|
+
)
|
|
1276
|
+
}).add("flash_operation", { x: element.x, y: mfy(element.y) }).build()
|
|
1277
|
+
);
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1255
1280
|
} else if (element.type === "pcb_board" && layer === "edgecut") {
|
|
1256
1281
|
const glayer = glayers.Edge_Cuts;
|
|
1257
1282
|
const { width, height, center, outline } = element;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/excellon-drill/commands/FMAT.ts","../src/excellon-drill/define-excellon-drill-command.ts","../src/excellon-drill/commands/G05.ts","../src/excellon-drill/commands/G90.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/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\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 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\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 if (!is_plated) {\n throw new Error(\"not implemented\")\n }\n return \"; #@! TA.AperFunction,Plated,PTH,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 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 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 soup,\n is_plated,\n flip_y_axis = false,\n}: {\n soup: 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: \"Plated,1,2,PTH\",\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 soup) {\n if (\n element.type === \"pcb_plated_hole\" ||\n element.type === \"pcb_hole\" ||\n element.type === \"pcb_via\"\n ) {\n if (!(\"hole_diameter\" in element)) continue\n if (!diameterToToolNumber[element.hole_diameter]) {\n builder.add(\"aper_function_header\", {\n is_plated: true,\n })\n builder.add(\"define_tool\", {\n tool_number: tool_counter,\n diameter: element.hole_diameter,\n })\n diameterToToolNumber[element.hole_diameter] = tool_counter\n tool_counter++\n }\n }\n }\n\n builder.add(\"percent_sign\", {})\n builder.add(\"G90\", {})\n builder.add(\"G05\", {})\n\n // Execute drills for tool N\n for (let i = 10; i < tool_counter; i++) {\n builder.add(\"use_tool\", { tool_number: i })\n for (const element of soup) {\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 if (!(\"hole_diameter\" in element)) continue\n if (diameterToToolNumber[element.hole_diameter] === i) {\n builder.add(\"drill_at\", {\n x: element.x,\n y: element.y * (flip_y_axis ? -1 : 1),\n })\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 arc_parameters: z.string(),\n })\n .describe(\n \"Create arc: A G75 must be called before creating the first arc.\",\n ),\n stringify() {\n return \"\"\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\"\n\nexport const end_region_statement = z\n .object({\n command_code: z.literal(\"G37\"),\n statement: z.string(),\n })\n .describe(\"End region statement: Ends the region statement\")\n\nexport type EndRegionStatement = z.infer<typeof end_region_statement>\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\"\n\nexport const load_rotation = z\n .object({\n command_code: z.literal(\"LR\"),\n rotation: z.string(),\n })\n .describe(\n \"Load rotation: Loads the rotation object transformation parameter.\",\n )\n\nexport type LoadRotation = z.infer<typeof load_rotation>\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 })\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 }) {\n const [gx, gy] = [x, y].map((coord) =>\n getGerberCoordinateWithPadding(coord),\n )\n return `X${gx}Y${gy}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\"),\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\"),\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\"\n\nexport const start_region_statement = z\n .object({\n command_code: z.literal(\"G36\"),\n statement: z.string(),\n })\n .describe(\n \"Start region statement: Starts a region statement which creates a region by defining its contours.\",\n )\n\nexport type StartRegionStatement = z.infer<typeof start_region_statement>\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 aperture_template_config = z.discriminatedUnion(\n \"standard_template_code\",\n [circle_template, rectangle_template, obround_template, polygon_template],\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 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})\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 // flash_operation,\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 { PCBHole, LayerRef, PCBPlatedHole, PCBSMTPad } 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 throw new Error(`Unsupported shape ${(elm as any).shape}`)\n}\nexport const getApertureConfigFromCirclePcbPlatedHole = (\n elm: PCBPlatedHole,\n): ApertureTemplateConfig => {\n if (!(\"outer_diameter\" in elm && \"hole_diameter\" in elm)) {\n throw new Error(\n `Invalid shape called in getApertureConfigFromCirclePcbPlatedHole: ${elm.shape}`,\n )\n }\n return {\n standard_template_code: \"C\",\n diameter: elm.outer_diameter,\n hole_diameter: elm.hole_diameter,\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\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) {\n addConfigIfNew(getApertureConfigFromPcbSmtpad(elm))\n }\n } else if (elm.type === \"pcb_plated_hole\") {\n if (elm.layers.includes(layer)) {\n if (elm.shape === \"circle\") {\n addConfigIfNew(getApertureConfigFromCirclePcbPlatedHole(elm))\n } else if (elm.shape === \"oval\") {\n console.warn(\"NOT IMPLEMENTED: drawing gerber for oval plated hole\")\n } else if (elm.shape === \"pill\") {\n console.warn(\"NOT IMPLEMENTED: drawing gerber for oval plated pill\")\n }\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 }\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 command.command_code === \"ADD\" &&\n command.standard_template_code === \"C\" &&\n command.diameter === trace_width,\n )\n } else if (\"standard_template_code\" in search_params) {\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.6\",\n \"main\": \"dist/index.js\",\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"tsup-node src/index.ts --format esm --dts --sourcemap\",\n \"format\": \"biome format --write .\",\n \"format:check\": \"biome format .\"\n },\n \"files\": [\n \"dist\"\n ],\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.8.3\",\n \"@types/bun\": \"^1.1.8\",\n \"@types/node\": \"^22.5.2\",\n \"bun-match-svg\": \"^0.0.3\",\n \"gerber-to-svg\": \"^4.2.8\",\n \"pcb-stackup\": \"^4.2.8\",\n \"tsup\": \"^8.2.4\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5.0.0\"\n },\n \"dependencies\": {\n \"circuit-json\": \"^0.0.82\",\n \"fast-json-stable-stringify\": \"^2.1.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,builder,${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 .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 {\n defineAperturesForLayer,\n getApertureConfigFromCirclePcbHole,\n getApertureConfigFromCirclePcbPlatedHole,\n getApertureConfigFromPcbSmtpad,\n} from \"./defineAperturesForLayer\"\nimport { findApertureNumber } from \"./findApertureNumber\"\nimport { getCommandHeaders } from \"./getCommandHeaders\"\nimport { getGerberLayerName } from \"./getGerberLayerName\"\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 glayers: LayerToGerberCommandsMap = {\n F_Cu: getCommandHeaders({\n layer: \"top\",\n layer_type: \"copper\",\n }),\n F_SilkScreen: [],\n F_Mask: getCommandHeaders({\n layer: \"top\",\n layer_type: \"soldermask\",\n }),\n F_Paste: [],\n B_Cu: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"copper\",\n }),\n B_SilkScreen: [],\n B_Mask: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"soldermask\",\n }),\n B_Paste: [],\n Edge_Cuts: getCommandHeaders({\n layer: \"edgecut\",\n }),\n }\n\n for (const glayer_name of [\"F_Cu\", \"B_Cu\", \"F_Mask\", \"B_Mask\"] 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 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_smtpad\") {\n if (element.layer === layer) {\n for (const glayer of [\n glayers[getGerberLayerName(layer, \"copper\")],\n glayers[getGerberLayerName(layer, \"soldermask\")],\n ]) {\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(\n glayer,\n getApertureConfigFromPcbSmtpad(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_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 if (element.shape !== \"circle\") {\n console.warn(\n \"NOT IMPLEMENTED: drawing gerber for non-circle plated hole\",\n )\n continue\n }\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(\n glayer,\n getApertureConfigFromCirclePcbPlatedHole(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_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_board\" && layer === \"edgecut\") {\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 gerberBuild.add(\"move_operation\", outline[0])\n for (let i = 1; i < outline.length; i++) {\n gerberBuild.add(\"plot_operation\", outline[i])\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 }\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/excellon-drill/commands/FMAT.ts","../src/excellon-drill/define-excellon-drill-command.ts","../src/excellon-drill/commands/G05.ts","../src/excellon-drill/commands/G90.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/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\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 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\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 if (!is_plated) {\n throw new Error(\"not implemented\")\n }\n return \"; #@! TA.AperFunction,Plated,PTH,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 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 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 soup,\n is_plated,\n flip_y_axis = false,\n}: {\n soup: 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: \"Plated,1,2,PTH\",\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 soup) {\n if (\n element.type === \"pcb_plated_hole\" ||\n element.type === \"pcb_hole\" ||\n element.type === \"pcb_via\"\n ) {\n if (!(\"hole_diameter\" in element)) continue\n if (!diameterToToolNumber[element.hole_diameter]) {\n builder.add(\"aper_function_header\", {\n is_plated: true,\n })\n builder.add(\"define_tool\", {\n tool_number: tool_counter,\n diameter: element.hole_diameter,\n })\n diameterToToolNumber[element.hole_diameter] = tool_counter\n tool_counter++\n }\n }\n }\n\n builder.add(\"percent_sign\", {})\n builder.add(\"G90\", {})\n builder.add(\"G05\", {})\n\n // Execute drills for tool N\n for (let i = 10; i < tool_counter; i++) {\n builder.add(\"use_tool\", { tool_number: i })\n for (const element of soup) {\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 if (!(\"hole_diameter\" in element)) continue\n if (diameterToToolNumber[element.hole_diameter] === i) {\n builder.add(\"drill_at\", {\n x: element.x,\n y: element.y * (flip_y_axis ? -1 : 1),\n })\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 arc_parameters: z.string(),\n })\n .describe(\n \"Create arc: A G75 must be called before creating the first arc.\",\n ),\n stringify() {\n return \"\"\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\"\n\nexport const end_region_statement = z\n .object({\n command_code: z.literal(\"G37\"),\n statement: z.string(),\n })\n .describe(\"End region statement: Ends the region statement\")\n\nexport type EndRegionStatement = z.infer<typeof end_region_statement>\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\"\n\nexport const load_rotation = z\n .object({\n command_code: z.literal(\"LR\"),\n rotation: z.string(),\n })\n .describe(\n \"Load rotation: Loads the rotation object transformation parameter.\",\n )\n\nexport type LoadRotation = z.infer<typeof load_rotation>\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 })\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 }) {\n const [gx, gy] = [x, y].map((coord) =>\n getGerberCoordinateWithPadding(coord),\n )\n return `X${gx}Y${gy}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\"),\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\"),\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\"\n\nexport const start_region_statement = z\n .object({\n command_code: z.literal(\"G36\"),\n statement: z.string(),\n })\n .describe(\n \"Start region statement: Starts a region statement which creates a region by defining its contours.\",\n )\n\nexport type StartRegionStatement = z.infer<typeof start_region_statement>\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 aperture_template_config = z.discriminatedUnion(\n \"standard_template_code\",\n [circle_template, rectangle_template, obround_template, polygon_template],\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 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})\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 // flash_operation,\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 {\n PCBHole,\n LayerRef,\n PCBPlatedHole,\n PCBSMTPad,\n PcbVia,\n PcbHole,\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 throw new Error(`Unsupported shape ${(elm as any).shape}`)\n}\nexport const getApertureConfigFromCirclePcbPlatedHole = (\n elm: PCBPlatedHole,\n): ApertureTemplateConfig => {\n if (!(\"outer_diameter\" in elm && \"hole_diameter\" in elm)) {\n throw new Error(\n `Invalid shape called in getApertureConfigFromCirclePcbPlatedHole: ${elm.shape}`,\n )\n }\n return {\n standard_template_code: \"C\",\n diameter: elm.outer_diameter,\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) {\n addConfigIfNew(getApertureConfigFromPcbSmtpad(elm))\n }\n } else if (elm.type === \"pcb_plated_hole\") {\n if (elm.layers.includes(layer)) {\n if (elm.shape === \"circle\") {\n addConfigIfNew(getApertureConfigFromCirclePcbPlatedHole(elm))\n } else if (elm.shape === \"oval\") {\n console.warn(\"NOT IMPLEMENTED: drawing gerber for oval plated hole\")\n } else if (elm.shape === \"pill\") {\n console.warn(\"NOT IMPLEMENTED: drawing gerber for oval plated pill\")\n }\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 }\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 command.command_code === \"ADD\" &&\n command.standard_template_code === \"C\" &&\n command.diameter === trace_width,\n )\n } else if (\"standard_template_code\" in search_params) {\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.8\",\n \"main\": \"dist/index.js\",\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"tsup-node src/index.ts --format esm --dts --sourcemap\",\n \"format\": \"biome format --write .\",\n \"format:check\": \"biome format .\"\n },\n \"files\": [\n \"dist\"\n ],\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.8.3\",\n \"@types/bun\": \"^1.1.8\",\n \"@types/node\": \"^22.5.2\",\n \"bun-match-svg\": \"^0.0.3\",\n \"gerber-to-svg\": \"^4.2.8\",\n \"pcb-stackup\": \"^4.2.8\",\n \"tsup\": \"^8.2.4\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5.0.0\"\n },\n \"dependencies\": {\n \"circuit-json\": \"^0.0.82\",\n \"fast-json-stable-stringify\": \"^2.1.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,builder,${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 .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 {\n defineAperturesForLayer,\n getApertureConfigFromCirclePcbHole,\n getApertureConfigFromCirclePcbPlatedHole,\n getApertureConfigFromPcbSmtpad,\n getApertureConfigFromPcbVia,\n} from \"./defineAperturesForLayer\"\nimport { findApertureNumber } from \"./findApertureNumber\"\nimport { getCommandHeaders } from \"./getCommandHeaders\"\nimport { getGerberLayerName } from \"./getGerberLayerName\"\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 glayers: LayerToGerberCommandsMap = {\n F_Cu: getCommandHeaders({\n layer: \"top\",\n layer_type: \"copper\",\n }),\n F_SilkScreen: [],\n F_Mask: getCommandHeaders({\n layer: \"top\",\n layer_type: \"soldermask\",\n }),\n F_Paste: [],\n B_Cu: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"copper\",\n }),\n B_SilkScreen: [],\n B_Mask: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"soldermask\",\n }),\n B_Paste: [],\n Edge_Cuts: getCommandHeaders({\n layer: \"edgecut\",\n }),\n }\n\n for (const glayer_name of [\"F_Cu\", \"B_Cu\", \"F_Mask\", \"B_Mask\"] 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 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_smtpad\") {\n if (element.layer === layer) {\n for (const glayer of [\n glayers[getGerberLayerName(layer, \"copper\")],\n glayers[getGerberLayerName(layer, \"soldermask\")],\n ]) {\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(\n glayer,\n getApertureConfigFromPcbSmtpad(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_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 if (element.shape !== \"circle\") {\n console.warn(\n \"NOT IMPLEMENTED: drawing gerber for non-circle plated hole\",\n )\n continue\n }\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(\n glayer,\n getApertureConfigFromCirclePcbPlatedHole(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_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 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 gerberBuild.add(\"move_operation\", outline[0])\n for (let i = 1; i < outline.length; i++) {\n gerberBuild.add(\"plot_operation\", outline[i])\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 }\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"]}
|