circuit-json-to-gerber 0.0.8 → 0.0.10

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 CHANGED
@@ -959,6 +959,22 @@ var getApertureConfigFromPcbSmtpad = (elm) => {
959
959
  }
960
960
  throw new Error(`Unsupported shape ${elm.shape}`);
961
961
  };
962
+ var getApertureConfigFromPcbSolderPaste = (elm) => {
963
+ if (elm.shape === "rect") {
964
+ return {
965
+ standard_template_code: "R",
966
+ x_size: elm.width,
967
+ y_size: elm.height
968
+ };
969
+ }
970
+ if (elm.shape === "circle") {
971
+ return {
972
+ standard_template_code: "C",
973
+ diameter: elm.radius * 2
974
+ };
975
+ }
976
+ throw new Error(`Unsupported shape ${elm.shape}`);
977
+ };
962
978
  var getApertureConfigFromCirclePcbPlatedHole = (elm) => {
963
979
  if (!("outer_diameter" in elm && "hole_diameter" in elm)) {
964
980
  throw new Error(
@@ -981,6 +997,17 @@ var getApertureConfigFromCirclePcbHole = (elm) => {
981
997
  diameter: elm.hole_diameter
982
998
  };
983
999
  };
1000
+ var getApertureConfigFromPcbVia = (elm) => {
1001
+ if (!("outer_diameter" in elm)) {
1002
+ throw new Error(
1003
+ "outer_diameter not specified in getApertureConfigFromPcbVia"
1004
+ );
1005
+ }
1006
+ return {
1007
+ standard_template_code: "C",
1008
+ diameter: elm.outer_diameter
1009
+ };
1010
+ };
984
1011
  function getAllApertureTemplateConfigsForLayer(soup, layer) {
985
1012
  const configs = [];
986
1013
  const configHashMap = /* @__PURE__ */ new Set();
@@ -996,6 +1023,10 @@ function getAllApertureTemplateConfigsForLayer(soup, layer) {
996
1023
  if (elm.layer === layer) {
997
1024
  addConfigIfNew(getApertureConfigFromPcbSmtpad(elm));
998
1025
  }
1026
+ } else if (elm.type === "pcb_solder_paste") {
1027
+ if (elm.layer === layer) {
1028
+ addConfigIfNew(getApertureConfigFromPcbSolderPaste(elm));
1029
+ }
999
1030
  } else if (elm.type === "pcb_plated_hole") {
1000
1031
  if (elm.layers.includes(layer)) {
1001
1032
  if (elm.shape === "circle") {
@@ -1010,6 +1041,8 @@ function getAllApertureTemplateConfigsForLayer(soup, layer) {
1010
1041
  if (elm.hole_shape === "circle")
1011
1042
  addConfigIfNew(getApertureConfigFromCirclePcbHole(elm));
1012
1043
  else console.warn("NOT IMPLEMENTED: drawing gerber for non circle holes");
1044
+ } else if (elm.type === "pcb_via") {
1045
+ addConfigIfNew(getApertureConfigFromPcbVia(elm));
1013
1046
  }
1014
1047
  }
1015
1048
  return configs;
@@ -1041,7 +1074,7 @@ var findApertureNumber = (glayer, search_params) => {
1041
1074
  // package.json
1042
1075
  var package_default = {
1043
1076
  name: "circuit-json-to-gerber",
1044
- version: "0.0.7",
1077
+ version: "0.0.9",
1045
1078
  main: "dist/index.js",
1046
1079
  type: "module",
1047
1080
  scripts: {
@@ -1054,8 +1087,10 @@ var package_default = {
1054
1087
  ],
1055
1088
  devDependencies: {
1056
1089
  "@biomejs/biome": "^1.8.3",
1090
+ "@tscircuit/core": "^0.0.102",
1057
1091
  "@types/bun": "^1.1.8",
1058
1092
  "@types/node": "^22.5.2",
1093
+ "@types/react": "^18.3.11",
1059
1094
  "bun-match-svg": "^0.0.3",
1060
1095
  "gerber-to-svg": "^4.2.8",
1061
1096
  "pcb-stackup": "^4.2.8",
@@ -1065,7 +1100,7 @@ var package_default = {
1065
1100
  typescript: "^5.0.0"
1066
1101
  },
1067
1102
  dependencies: {
1068
- "circuit-json": "^0.0.82",
1103
+ "circuit-json": "^0.0.83",
1069
1104
  "fast-json-stable-stringify": "^2.1.0"
1070
1105
  }
1071
1106
  };
@@ -1142,7 +1177,10 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
1142
1177
  layer: "top",
1143
1178
  layer_type: "soldermask"
1144
1179
  }),
1145
- F_Paste: [],
1180
+ F_Paste: getCommandHeaders({
1181
+ layer: "top",
1182
+ layer_type: "paste"
1183
+ }),
1146
1184
  B_Cu: getCommandHeaders({
1147
1185
  layer: "bottom",
1148
1186
  layer_type: "copper"
@@ -1152,12 +1190,22 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
1152
1190
  layer: "bottom",
1153
1191
  layer_type: "soldermask"
1154
1192
  }),
1155
- B_Paste: [],
1193
+ B_Paste: getCommandHeaders({
1194
+ layer: "bottom",
1195
+ layer_type: "paste"
1196
+ }),
1156
1197
  Edge_Cuts: getCommandHeaders({
1157
1198
  layer: "edgecut"
1158
1199
  })
1159
1200
  };
1160
- for (const glayer_name of ["F_Cu", "B_Cu", "F_Mask", "B_Mask"]) {
1201
+ for (const glayer_name of [
1202
+ "F_Cu",
1203
+ "B_Cu",
1204
+ "F_Mask",
1205
+ "B_Mask",
1206
+ "F_Paste",
1207
+ "B_Paste"
1208
+ ]) {
1161
1209
  const glayer = glayers[glayer_name];
1162
1210
  defineAperturesForLayer({
1163
1211
  soup,
@@ -1208,6 +1256,19 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
1208
1256
  );
1209
1257
  }
1210
1258
  }
1259
+ } else if (element.type === "pcb_solder_paste") {
1260
+ if (element.layer === layer) {
1261
+ for (const glayer of [glayers[getGerberLayerName(layer, "paste")]]) {
1262
+ glayer.push(
1263
+ ...gerberBuilder().add("select_aperture", {
1264
+ aperture_number: findApertureNumber(
1265
+ glayer,
1266
+ getApertureConfigFromPcbSolderPaste(element)
1267
+ )
1268
+ }).add("flash_operation", { x: element.x, y: mfy(element.y) }).build()
1269
+ );
1270
+ }
1271
+ }
1211
1272
  } else if (element.type === "pcb_plated_hole") {
1212
1273
  if (element.layers.includes(layer)) {
1213
1274
  for (const glayer of [
@@ -1251,6 +1312,19 @@ var convertSoupToGerberCommands = (soup, opts = {}) => {
1251
1312
  );
1252
1313
  }
1253
1314
  }
1315
+ } else if (element.type === "pcb_via") {
1316
+ if (element.layers.includes(layer)) {
1317
+ for (const glayer of [glayers[getGerberLayerName(layer, "copper")]]) {
1318
+ glayer.push(
1319
+ ...gerberBuilder().add("select_aperture", {
1320
+ aperture_number: findApertureNumber(
1321
+ glayer,
1322
+ getApertureConfigFromPcbVia(element)
1323
+ )
1324
+ }).add("flash_operation", { x: element.x, y: mfy(element.y) }).build()
1325
+ );
1326
+ }
1327
+ }
1254
1328
  } else if (element.type === "pcb_board" && layer === "edgecut") {
1255
1329
  const glayer = glayers.Edge_Cuts;
1256
1330
  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 }\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.7\",\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 PcbSolderPaste,\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}\n\nexport const getApertureConfigFromPcbSolderPaste = (\n elm: PcbSolderPaste,\n): ApertureTemplateConfig => {\n if (elm.shape === \"rect\") {\n return {\n standard_template_code: \"R\",\n x_size: elm.width,\n y_size: elm.height,\n }\n }\n if (elm.shape === \"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}\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_solder_paste\") {\n if (elm.layer === layer) {\n addConfigIfNew(getApertureConfigFromPcbSolderPaste(elm))\n }\n } else if (elm.type === \"pcb_plated_hole\") {\n if (elm.layers.includes(layer)) {\n 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.9\",\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 \"@tscircuit/core\": \"^0.0.102\",\n \"@types/bun\": \"^1.1.8\",\n \"@types/node\": \"^22.5.2\",\n \"@types/react\": \"^18.3.11\",\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.83\",\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 getApertureConfigFromPcbSolderPaste,\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: getCommandHeaders({\n layer: \"top\",\n layer_type: \"paste\",\n }),\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: getCommandHeaders({\n layer: \"bottom\",\n layer_type: \"paste\",\n }),\n Edge_Cuts: getCommandHeaders({\n layer: \"edgecut\",\n }),\n }\n\n for (const glayer_name of [\n \"F_Cu\",\n \"B_Cu\",\n \"F_Mask\",\n \"B_Mask\",\n \"F_Paste\",\n \"B_Paste\",\n ] 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_solder_paste\") {\n if (element.layer === layer) {\n for (const glayer of [glayers[getGerberLayerName(layer, \"paste\")]]) {\n glayer.push(\n ...gerberBuilder()\n .add(\"select_aperture\", {\n aperture_number: findApertureNumber(\n glayer,\n getApertureConfigFromPcbSolderPaste(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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "circuit-json-to-gerber",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
4
4
  "main": "dist/index.js",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -13,8 +13,10 @@
13
13
  ],
14
14
  "devDependencies": {
15
15
  "@biomejs/biome": "^1.8.3",
16
+ "@tscircuit/core": "^0.0.102",
16
17
  "@types/bun": "^1.1.8",
17
18
  "@types/node": "^22.5.2",
19
+ "@types/react": "^18.3.11",
18
20
  "bun-match-svg": "^0.0.3",
19
21
  "gerber-to-svg": "^4.2.8",
20
22
  "pcb-stackup": "^4.2.8",
@@ -24,7 +26,7 @@
24
26
  "typescript": "^5.0.0"
25
27
  },
26
28
  "dependencies": {
27
- "circuit-json": "^0.0.82",
29
+ "circuit-json": "^0.0.83",
28
30
  "fast-json-stable-stringify": "^2.1.0"
29
31
  }
30
32
  }