circuit-json-to-gerber 0.0.67 → 0.0.69

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.
@@ -1403,6 +1403,10 @@ function defineAperturesForLayer({
1403
1403
  ...gerberBuilder().add("delete_attribute", {}).add("comment", { comment: "aperture END LIST" }).build()
1404
1404
  );
1405
1405
  }
1406
+ var REGION_APERTURE_CONFIG = {
1407
+ standard_template_code: "C",
1408
+ diameter: 1e-3
1409
+ };
1406
1410
  var getApertureConfigFromPcbSmtpad = (elm) => {
1407
1411
  if (elm.shape === "rect") {
1408
1412
  return {
@@ -1737,6 +1741,7 @@ function getAllApertureTemplateConfigsForLayer({
1737
1741
  const configs = [];
1738
1742
  const configHashMap = /* @__PURE__ */ new Set();
1739
1743
  const isSoldermaskLayer = glayer_name.endsWith("_Mask");
1744
+ const isCopperLayer = glayer_name.endsWith("_Cu");
1740
1745
  const addConfigIfNew = (config) => {
1741
1746
  const hash = stableStringify(config);
1742
1747
  if (!configHashMap.has(hash)) {
@@ -1768,6 +1773,9 @@ function getAllApertureTemplateConfigsForLayer({
1768
1773
  }
1769
1774
  } else if (elm.type === "pcb_plated_hole") {
1770
1775
  if (elm.layers.includes(layer)) {
1776
+ if (elm.shape === "hole_with_polygon_pad") {
1777
+ continue;
1778
+ }
1771
1779
  if (glayer_name.endsWith("_Mask") && elm.is_covered_with_solder_mask === true) {
1772
1780
  continue;
1773
1781
  }
@@ -1806,6 +1814,27 @@ function getAllApertureTemplateConfigsForLayer({
1806
1814
  addConfigIfNew(getApertureConfigFromPcbCopperText(elm));
1807
1815
  }
1808
1816
  }
1817
+ const needsRegionAperture = circuitJson.some((elm) => {
1818
+ if (elm.type === "pcb_copper_pour") {
1819
+ if (elm.layer !== layer) return false;
1820
+ if (isCopperLayer) return true;
1821
+ return isSoldermaskLayer && elm.covered_with_solder_mask === false;
1822
+ }
1823
+ if (elm.type === "pcb_smtpad" && elm.shape === "polygon") {
1824
+ if (elm.layer !== layer) return false;
1825
+ if (isCopperLayer) return true;
1826
+ return isSoldermaskLayer && elm.is_covered_with_solder_mask !== true;
1827
+ }
1828
+ if (elm.type === "pcb_plated_hole" && elm.shape === "hole_with_polygon_pad") {
1829
+ if (!elm.layers.includes(layer)) return false;
1830
+ if (isCopperLayer) return true;
1831
+ return isSoldermaskLayer && elm.is_covered_with_solder_mask !== true;
1832
+ }
1833
+ return false;
1834
+ });
1835
+ if (needsRegionAperture) {
1836
+ addConfigIfNew(REGION_APERTURE_CONFIG);
1837
+ }
1809
1838
  return configs;
1810
1839
  }
1811
1840
 
@@ -1835,7 +1864,7 @@ var findApertureNumber = (glayer, search_params) => {
1835
1864
  // package.json
1836
1865
  var package_default = {
1837
1866
  name: "circuit-json-to-gerber",
1838
- version: "0.0.66",
1867
+ version: "0.0.68",
1839
1868
  main: "dist/index.js",
1840
1869
  type: "module",
1841
1870
  scripts: {
@@ -2068,6 +2097,34 @@ var convertSoupToGerberCommands = (circuitJson, opts = {}) => {
2068
2097
  }).build()
2069
2098
  );
2070
2099
  const mfy = (y) => opts.flip_y_axis ? -y : y;
2100
+ const getRegionApertureNumber = (glayer) => findApertureNumber(glayer, REGION_APERTURE_CONFIG);
2101
+ const addClosedRegionFromPoints = ({
2102
+ target,
2103
+ apertureSource,
2104
+ points
2105
+ }) => {
2106
+ if (points.length === 0) return;
2107
+ const regionApertureNumber = getRegionApertureNumber(apertureSource);
2108
+ const regionBuilder = gerberBuilder().add("select_aperture", {
2109
+ aperture_number: regionApertureNumber
2110
+ }).add("start_region_statement", {});
2111
+ regionBuilder.add("move_operation", {
2112
+ x: points[0].x,
2113
+ y: mfy(points[0].y)
2114
+ });
2115
+ for (let i = 1; i < points.length; i++) {
2116
+ regionBuilder.add("plot_operation", {
2117
+ x: points[i].x,
2118
+ y: mfy(points[i].y)
2119
+ });
2120
+ }
2121
+ regionBuilder.add("plot_operation", {
2122
+ x: points[0].x,
2123
+ y: mfy(points[0].y)
2124
+ });
2125
+ regionBuilder.add("end_region_statement", {});
2126
+ target.push(...regionBuilder.build());
2127
+ };
2071
2128
  const renderVectorText = (element, layer, layerType, getApertureConfig) => {
2072
2129
  if (element.layer !== layer) return;
2073
2130
  const CAP_HEIGHT_SCALE = 0.7;
@@ -2308,7 +2365,8 @@ var convertSoupToGerberCommands = (circuitJson, opts = {}) => {
2308
2365
  const { brep_shape } = element;
2309
2366
  if (!brep_shape) continue;
2310
2367
  const { outer_ring, inner_rings } = brep_shape;
2311
- const outer_builder = gerberBuilder().add("select_aperture", { aperture_number: 10 }).add("start_region_statement", {});
2368
+ const regionApertureNumber = getRegionApertureNumber(copper_glayer);
2369
+ const outer_builder = gerberBuilder().add("select_aperture", { aperture_number: regionApertureNumber }).add("start_region_statement", {});
2312
2370
  drawRingToBuilder(outer_builder, reverseRing(outer_ring));
2313
2371
  outer_builder.add("end_region_statement", {});
2314
2372
  all_pour_commands.push(...outer_builder.build());
@@ -2317,7 +2375,9 @@ var convertSoupToGerberCommands = (circuitJson, opts = {}) => {
2317
2375
  ...gerberBuilder().add("set_layer_polarity", { polarity: "C" }).build()
2318
2376
  );
2319
2377
  for (const inner_ring of inner_rings) {
2320
- const inner_builder = gerberBuilder().add("select_aperture", { aperture_number: 10 }).add("start_region_statement", {});
2378
+ const inner_builder = gerberBuilder().add("select_aperture", {
2379
+ aperture_number: regionApertureNumber
2380
+ }).add("start_region_statement", {});
2321
2381
  drawRingToBuilder(inner_builder, inner_ring);
2322
2382
  inner_builder.add("end_region_statement", {});
2323
2383
  all_pour_commands.push(...inner_builder.build());
@@ -2352,7 +2412,8 @@ var convertSoupToGerberCommands = (circuitJson, opts = {}) => {
2352
2412
  const transformedPoints = points.map(
2353
2413
  (p) => applyToPoint(transformMatrix, p)
2354
2414
  );
2355
- const rect_builder = gerberBuilder().add("select_aperture", { aperture_number: 10 }).add("start_region_statement", {});
2415
+ const regionApertureNumber = getRegionApertureNumber(copper_glayer);
2416
+ const rect_builder = gerberBuilder().add("select_aperture", { aperture_number: regionApertureNumber }).add("start_region_statement", {});
2356
2417
  rect_builder.add("move_operation", {
2357
2418
  x: transformedPoints[0].x,
2358
2419
  y: mfy(transformedPoints[0].y)
@@ -2371,25 +2432,11 @@ var convertSoupToGerberCommands = (circuitJson, opts = {}) => {
2371
2432
  all_pour_commands.push(...rect_builder.build());
2372
2433
  } else if (element.shape === "polygon") {
2373
2434
  const { points } = element;
2374
- if (points.length > 0) {
2375
- const poly_builder = gerberBuilder().add("select_aperture", { aperture_number: 10 }).add("start_region_statement", {});
2376
- poly_builder.add("move_operation", {
2377
- x: points[0].x,
2378
- y: mfy(points[0].y)
2379
- });
2380
- for (let i = 1; i < points.length; i++) {
2381
- poly_builder.add("plot_operation", {
2382
- x: points[i].x,
2383
- y: mfy(points[i].y)
2384
- });
2385
- }
2386
- poly_builder.add("plot_operation", {
2387
- x: points[0].x,
2388
- y: mfy(points[0].y)
2389
- });
2390
- poly_builder.add("end_region_statement", {});
2391
- all_pour_commands.push(...poly_builder.build());
2392
- }
2435
+ addClosedRegionFromPoints({
2436
+ target: all_pour_commands,
2437
+ apertureSource: copper_glayer,
2438
+ points
2439
+ });
2393
2440
  }
2394
2441
  copper_glayer.push(...all_pour_commands);
2395
2442
  if (element.covered_with_solder_mask === false) {
@@ -2540,26 +2587,13 @@ var convertSoupToGerberCommands = (circuitJson, opts = {}) => {
2540
2587
  );
2541
2588
  }
2542
2589
  for (const glayer of layers_to_add_to) {
2543
- const pad_builder = gerberBuilder().add("select_aperture", { aperture_number: 10 }).add("start_region_statement", {});
2544
2590
  const { points } = element;
2545
- if (points && points.length > 0) {
2546
- pad_builder.add("move_operation", {
2547
- x: points[0].x,
2548
- y: mfy(points[0].y)
2549
- });
2550
- for (let i = 1; i < points.length; i++) {
2551
- pad_builder.add("plot_operation", {
2552
- x: points[i].x,
2553
- y: mfy(points[i].y)
2554
- });
2555
- }
2556
- pad_builder.add("plot_operation", {
2557
- x: points[0].x,
2558
- y: mfy(points[0].y)
2559
- });
2560
- }
2561
- pad_builder.add("end_region_statement", {});
2562
- glayer.push(...pad_builder.build());
2591
+ if (!points) continue;
2592
+ addClosedRegionFromPoints({
2593
+ target: glayer,
2594
+ apertureSource: glayer,
2595
+ points
2596
+ });
2563
2597
  }
2564
2598
  }
2565
2599
  } else if (element.type === "pcb_solder_paste") {
@@ -2609,6 +2643,16 @@ var convertSoupToGerberCommands = (circuitJson, opts = {}) => {
2609
2643
  layersToAddTo.push(glayers[getGerberLayerName(layer, "soldermask")]);
2610
2644
  }
2611
2645
  for (const glayer of layersToAddTo) {
2646
+ if (element.shape === "hole_with_polygon_pad") {
2647
+ const { pad_outline } = element;
2648
+ if (!pad_outline?.length) continue;
2649
+ addClosedRegionFromPoints({
2650
+ target: glayer,
2651
+ apertureSource: glayer,
2652
+ points: pad_outline
2653
+ });
2654
+ continue;
2655
+ }
2612
2656
  const holeW = "hole_width" in element && typeof element.hole_width === "number" ? element.hole_width : 0;
2613
2657
  const holeH = "hole_height" in element && typeof element.hole_height === "number" ? element.hole_height : 0;
2614
2658
  const padWidthCandidates = [holeW];
@@ -2988,4 +3032,4 @@ export {
2988
3032
  stringifyGerberCommands,
2989
3033
  convertSoupToGerberCommands
2990
3034
  };
2991
- //# sourceMappingURL=chunk-FVXN6IX5.js.map
3035
+ //# sourceMappingURL=chunk-ERVO7VGV.js.map