@tscircuit/footprinter 0.0.316 → 0.0.317

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.d.ts CHANGED
@@ -1,6 +1,17 @@
1
1
  import { AnySoupElement, AnyCircuitElement } from 'circuit-json';
2
2
  import { z } from 'zod';
3
3
 
4
+ type StandardSize = {
5
+ imperial: string;
6
+ metric: string;
7
+ p_mm_min: number;
8
+ ph_mm_min: number;
9
+ pw_mm_min: number;
10
+ h_mm_min: number;
11
+ w_mm_min: number;
12
+ };
13
+ declare const footprintSizes: StandardSize[];
14
+
4
15
  type NowDefined<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
5
16
 
6
17
  declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
@@ -1724,17 +1735,6 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
1724
1735
  }>]>;
1725
1736
  type AnyFootprinterDefinitionOutput = z.infer<typeof any_footprinter_def>;
1726
1737
 
1727
- type StandardSize = {
1728
- imperial: string;
1729
- metric: string;
1730
- p_mm_min: number;
1731
- ph_mm_min: number;
1732
- pw_mm_min: number;
1733
- h_mm_min: number;
1734
- w_mm_min: number;
1735
- };
1736
- declare const footprintSizes: StandardSize[];
1737
-
1738
1738
  type BaseOptionKey = "origin" | "norefdes" | "invert" | "faceup" | "nosilkscreen";
1739
1739
  type FootprinterParamsBuilder<K extends string> = {
1740
1740
  [P in K | BaseOptionKey | "params" | "soup" | "circuitJson"]: P extends "params" | "soup" | "circuitJson" ? Footprinter[P] : (v?: number | string | boolean) => FootprinterParamsBuilder<K>;
package/dist/index.js CHANGED
@@ -146,7 +146,8 @@ var platedHoleWithRectPad = (options) => {
146
146
  rectPadWidth,
147
147
  rectPadHeight,
148
148
  holeOffsetX = 0,
149
- holeOffsetY = 0
149
+ holeOffsetY = 0,
150
+ rectBorderRadius
150
151
  } = options;
151
152
  return {
152
153
  pcb_plated_hole_id: "",
@@ -159,6 +160,9 @@ var platedHoleWithRectPad = (options) => {
159
160
  pad_shape: "rect",
160
161
  rect_pad_width: mm2(rectPadWidth),
161
162
  rect_pad_height: mm2(rectPadHeight),
163
+ ...rectBorderRadius !== void 0 && {
164
+ rect_border_radius: rectBorderRadius
165
+ },
162
166
  pcb_port_id: "",
163
167
  layers: ["top", "bottom"],
164
168
  port_hints: [pn.toString()],
@@ -6500,6 +6504,9 @@ var jst_def = base_def.extend({
6500
6504
  ph: z60.boolean().optional().describe(
6501
6505
  'JST PH (Through-hole) connector family. PH stands for "Pin Header".'
6502
6506
  ),
6507
+ zh: z60.boolean().optional().describe(
6508
+ "JST ZH (Through-hole) connector family. 1.5mm pitch wire-to-board."
6509
+ ),
6503
6510
  string: z60.string().optional()
6504
6511
  });
6505
6512
  var variantDefaults = {
@@ -6517,11 +6524,20 @@ var variantDefaults = {
6517
6524
  pl: length47.parse("1.55mm"),
6518
6525
  w: length47.parse("5.8mm"),
6519
6526
  h: length47.parse("7.8mm")
6527
+ },
6528
+ zh: {
6529
+ p: length47.parse("1.5mm"),
6530
+ id: length47.parse("0.73mm"),
6531
+ pw: length47.parse("1.03mm"),
6532
+ pl: length47.parse("1.73mm"),
6533
+ w: length47.parse("3mm"),
6534
+ h: length47.parse("3.5mm")
6520
6535
  }
6521
6536
  };
6522
6537
  function getVariant(params) {
6523
6538
  if (params.sh) return "sh";
6524
6539
  if (params.ph) return "ph";
6540
+ if (params.zh) return "zh";
6525
6541
  return "ph";
6526
6542
  }
6527
6543
  function generatePads(variant, numPins, p, id, pw, pl) {
@@ -6541,6 +6557,26 @@ function generatePads(variant, numPins, p, id, pw, pl) {
6541
6557
  })
6542
6558
  );
6543
6559
  }
6560
+ } else if (variant === "zh") {
6561
+ const startX = -((numPins - 1) / 2) * p;
6562
+ for (let i = 0; i < numPins; i++) {
6563
+ const x = startX + i * p;
6564
+ if (i === 0) {
6565
+ pads.push(
6566
+ platedHoleWithRectPad({
6567
+ pn: i + 1,
6568
+ x,
6569
+ y: 0,
6570
+ holeDiameter: id,
6571
+ rectPadWidth: pw,
6572
+ rectPadHeight: pl,
6573
+ rectBorderRadius: 0.12499977
6574
+ })
6575
+ );
6576
+ } else {
6577
+ pads.push(platedHolePill(i + 1, x, 0, id, pw, pl));
6578
+ }
6579
+ }
6544
6580
  } else {
6545
6581
  const startX = -((numPins - 1) / 2) * p;
6546
6582
  for (let i = 0; i < numPins; i++) {
@@ -6553,7 +6589,7 @@ function generatePads(variant, numPins, p, id, pw, pl) {
6553
6589
  }
6554
6590
  return pads;
6555
6591
  }
6556
- function generateSilkscreenBody(variant, w, h) {
6592
+ function generateSilkscreenBody(variant, w, h, numPins, p) {
6557
6593
  if (variant === "ph") {
6558
6594
  return {
6559
6595
  type: "pcb_silkscreen_path",
@@ -6569,6 +6605,26 @@ function generateSilkscreenBody(variant, w, h) {
6569
6605
  stroke_width: 0.1,
6570
6606
  pcb_silkscreen_path_id: ""
6571
6607
  };
6608
+ } else if (variant === "zh" && numPins && p) {
6609
+ const pinSpan = (numPins - 1) * p;
6610
+ const bodyLeft = -pinSpan / 2 - 1.5;
6611
+ const bodyRight = pinSpan / 2 + 1.5;
6612
+ const bodyTop = -h / 2;
6613
+ const bodyBottom = h / 2;
6614
+ return {
6615
+ type: "pcb_silkscreen_path",
6616
+ layer: "top",
6617
+ pcb_component_id: "",
6618
+ route: [
6619
+ { x: bodyLeft, y: bodyTop },
6620
+ { x: bodyRight, y: bodyTop },
6621
+ { x: bodyRight, y: bodyBottom },
6622
+ { x: bodyLeft, y: bodyBottom },
6623
+ { x: bodyLeft, y: bodyTop }
6624
+ ],
6625
+ stroke_width: 0.1,
6626
+ pcb_silkscreen_path_id: ""
6627
+ };
6572
6628
  } else {
6573
6629
  return {
6574
6630
  type: "pcb_silkscreen_path",
@@ -6597,8 +6653,15 @@ var jst = (raw_params) => {
6597
6653
  }
6598
6654
  const str = typeof raw_params.string === "string" ? raw_params.string : "";
6599
6655
  const match = str.match(/(?:^|_)jst(\d+)(?:_|$)/);
6656
+ const zhMatch = str.match(/(?:^|_)zh(\d+)(?:_|$)/);
6600
6657
  if (match && match[1]) {
6601
- const parsed = parseInt(match[1], 10);
6658
+ const parsed = Number.parseInt(match[1], 10);
6659
+ if (!Number.isNaN(parsed)) {
6660
+ numPins = parsed;
6661
+ }
6662
+ }
6663
+ if (zhMatch && zhMatch[1]) {
6664
+ const parsed = Number.parseInt(zhMatch[1], 10);
6602
6665
  if (!Number.isNaN(parsed)) {
6603
6666
  numPins = parsed;
6604
6667
  }
@@ -6609,7 +6672,7 @@ var jst = (raw_params) => {
6609
6672
  );
6610
6673
  }
6611
6674
  const pads = generatePads(variant, numPins, p, id, pw, pl);
6612
- const silkscreenBody = generateSilkscreenBody(variant, w, h);
6675
+ const silkscreenBody = generateSilkscreenBody(variant, w, h, numPins, p);
6613
6676
  const silkscreenRefText = silkscreenRef(0, h / 2 + 1, 0.5);
6614
6677
  return {
6615
6678
  circuitJson: [...pads, silkscreenBody, silkscreenRefText],
@@ -6623,7 +6686,8 @@ var jst = (raw_params) => {
6623
6686
  h,
6624
6687
  num_pins: numPins,
6625
6688
  sh: variant === "sh",
6626
- ph: variant === "ph"
6689
+ ph: variant === "ph",
6690
+ zh: variant === "zh"
6627
6691
  }
6628
6692
  };
6629
6693
  };
@@ -9109,10 +9173,27 @@ var to92l = (raw_params) => {
9109
9173
  };
9110
9174
  };
9111
9175
 
9112
- // src/helpers/is-not-null.ts
9113
- function isNotNull(value) {
9114
- return value !== null && value !== void 0;
9115
- }
9176
+ // src/helpers/apply-norefdes.ts
9177
+ var applyNoRefDes = (elements, parameters) => {
9178
+ const refs = elements.filter(
9179
+ (el) => el.type === "pcb_silkscreen_text"
9180
+ );
9181
+ if (refs.length === 0) return elements;
9182
+ for (const ref of refs) {
9183
+ if (parameters.norefdes) {
9184
+ ref.text = "";
9185
+ }
9186
+ }
9187
+ return elements;
9188
+ };
9189
+
9190
+ // src/helpers/apply-nosilkscreen.ts
9191
+ var applyNoSilkscreen = (elements, parameters) => {
9192
+ if (!parameters.nosilkscreen) return elements;
9193
+ return elements.filter((element) => {
9194
+ return element.type !== "pcb_silkscreen_path" && element.type !== "pcb_silkscreen_text";
9195
+ });
9196
+ };
9116
9197
 
9117
9198
  // src/helpers/apply-origin.ts
9118
9199
  var applyOrigin = (elements, origin) => {
@@ -9208,32 +9289,15 @@ var applyOrigin = (elements, origin) => {
9208
9289
  return elements;
9209
9290
  };
9210
9291
 
9211
- // src/helpers/apply-norefdes.ts
9212
- var applyNoRefDes = (elements, parameters) => {
9213
- const refs = elements.filter(
9214
- (el) => el.type === "pcb_silkscreen_text"
9215
- );
9216
- if (refs.length === 0) return elements;
9217
- for (const ref of refs) {
9218
- if (parameters.norefdes) {
9219
- ref.text = "";
9220
- }
9221
- }
9222
- return elements;
9223
- };
9224
-
9225
- // src/helpers/apply-nosilkscreen.ts
9226
- var applyNoSilkscreen = (elements, parameters) => {
9227
- if (!parameters.nosilkscreen) return elements;
9228
- return elements.filter((element) => {
9229
- return element.type !== "pcb_silkscreen_path" && element.type !== "pcb_silkscreen_text";
9230
- });
9231
- };
9292
+ // src/helpers/is-not-null.ts
9293
+ function isNotNull(value) {
9294
+ return value !== null && value !== void 0;
9295
+ }
9232
9296
 
9233
9297
  // src/footprinter.ts
9234
9298
  var string2 = (def) => {
9235
9299
  let fp2 = footprinter();
9236
- const modifiedDef = def.replace(/^((?:\d{4}|\d{5}))(?=$|_|x)/, "res$1");
9300
+ const modifiedDef = def.replace(/^((?:\d{4}|\d{5}))(?=$|_|x)/, "res$1").replace(/^zh(\d+)(?:$|_)/, "jst$1_zh");
9237
9301
  const def_parts = modifiedDef.split(/_(?!metric)/).map((s) => {
9238
9302
  const m = s.match(/([a-zA-Z]+)([\(\d\.\+\?].*)?/);
9239
9303
  if (!m) return null;