jscad-electronics 0.0.194 → 0.0.195

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/vanilla.d.ts CHANGED
@@ -3,7 +3,7 @@ import { BufferGeometry } from 'three';
3
3
  import * as jscadModeling from '@jscad/modeling';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import * as _jscad_modeling_src_geometries_types from '@jscad/modeling/src/geometries/types';
6
- import { SpurGearModelPropsInput, HelicalGearModelPropsInput, HexBoltModelPropsInput, HexSocketBoltModelPropsInput, NemaMotorModelPropsInput, SheetMetalModelPropsInput, WormGearModelPropsInput } from '@tscircuit/modelprinter';
6
+ import { FlatHeadScrewModelPropsInput, SpurGearModelPropsInput, HelicalGearModelPropsInput, HexBoltModelPropsInput, HexSocketBoltModelPropsInput, NemaMotorModelPropsInput, SheetMetalModelPropsInput, WormGearModelPropsInput } from '@tscircuit/modelprinter';
7
7
 
8
8
  type VNode = {
9
9
  type: any;
@@ -26,6 +26,23 @@ type RenderResult = {
26
26
 
27
27
  declare function convertCSGToThreeGeom(csg: any): BufferGeometry;
28
28
 
29
+ interface FlatHeadScrewMeshOptions {
30
+ radialSegments?: number;
31
+ threadStepsPerTurn?: number;
32
+ }
33
+ /** Outward-oriented, welded indexed surface, in millimeters. */
34
+ interface FlatHeadScrewMesh {
35
+ positions: number[];
36
+ indices: number[];
37
+ }
38
+ declare function createFlatHeadScrewMesh(input: FlatHeadScrewModelPropsInput, options?: FlatHeadScrewMeshOptions): FlatHeadScrewMesh;
39
+
40
+ type FlatHeadScrewProps = FlatHeadScrewModelPropsInput & {
41
+ color?: string;
42
+ };
43
+ declare function createFlatHeadScrewGeom(input: FlatHeadScrewModelPropsInput, options?: FlatHeadScrewMeshOptions): _jscad_modeling_src_geometries_types.Geom3;
44
+ declare function FlatHeadScrew({ color, ...props }: FlatHeadScrewProps): react_jsx_runtime.JSX.Element;
45
+
29
46
  /** Indexed triangles, counterclockwise from outside; millimeters, Z up. */
30
47
  interface SpurGearMesh {
31
48
  positions: number[];
@@ -161,4 +178,4 @@ declare function createJSCADRenderer(jscad: typeof jscadModeling): {
161
178
  };
162
179
  };
163
180
 
164
- export { type ColoredGeom, Fragment, HelicalGear, type HelicalGearMesh, type HelicalGearProps, HexBolt, type HexBoltMesh, type HexBoltMeshOptions, type HexBoltProps, HexSocketBolt, type HexSocketBoltMesh, type HexSocketBoltProps, NEMA17, NEMA23, NEMA8, type NemaFrameMotorProps, NemaMotor, type NemaMotorProps, type RenderResult, SheetMetal, type SheetMetalMesh, type SheetMetalProps, SpurGear, type SpurGearMesh, type SpurGearProps, type VNode, WormGear, type WormGearMesh, type WormGearProps, convertCSGToThreeGeom, createHelicalGearGeom, createHelicalGearMesh, createHexBoltGeom, createHexBoltMesh, createHexSocketBoltGeom, createHexSocketBoltMesh, createJSCADRenderer, createSheetMetalGeom, createSheetMetalMesh, createSpurGearGeom, createSpurGearMesh, createWormGearGeom, createWormGearMesh, getJscadModelForFootprint, getJscadModelForFootprintWithPads, h };
181
+ export { type ColoredGeom, FlatHeadScrew, type FlatHeadScrewMesh, type FlatHeadScrewMeshOptions, type FlatHeadScrewProps, Fragment, HelicalGear, type HelicalGearMesh, type HelicalGearProps, HexBolt, type HexBoltMesh, type HexBoltMeshOptions, type HexBoltProps, HexSocketBolt, type HexSocketBoltMesh, type HexSocketBoltProps, NEMA17, NEMA23, NEMA8, type NemaFrameMotorProps, NemaMotor, type NemaMotorProps, type RenderResult, SheetMetal, type SheetMetalMesh, type SheetMetalProps, SpurGear, type SpurGearMesh, type SpurGearProps, type VNode, WormGear, type WormGearMesh, type WormGearProps, convertCSGToThreeGeom, createFlatHeadScrewGeom, createFlatHeadScrewMesh, createHelicalGearGeom, createHelicalGearMesh, createHexBoltGeom, createHexBoltMesh, createHexSocketBoltGeom, createHexSocketBoltMesh, createJSCADRenderer, createSheetMetalGeom, createSheetMetalMesh, createSpurGearGeom, createSpurGearMesh, createWormGearGeom, createWormGearMesh, getJscadModelForFootprint, getJscadModelForFootprintWithPads, h };
package/dist/vanilla.js CHANGED
@@ -179,28 +179,28 @@ var FootprintPlatedHole = ({
179
179
  throw new Error("Shape not supported: " + hole.shape);
180
180
  };
181
181
 
182
- // lib/models/flexscreen/register.tsx
183
- import { flexScreenModelDefinitionSchema } from "@tscircuit/modelprinter";
182
+ // lib/models/flatheadscrew/register.tsx
183
+ import { flatHeadScrewModelDefinitionSchema } from "@tscircuit/modelprinter";
184
184
 
185
185
  // lib/model-registry.ts
186
- function defineModelRenderer(model9) {
187
- return model9;
186
+ function defineModelRenderer(model10) {
187
+ return model10;
188
188
  }
189
189
  var ModelRendererRegistry = class {
190
190
  models = /* @__PURE__ */ new Map();
191
- register(model9) {
192
- if (typeof model9.name !== "string" || !/^[a-z]+$/.test(model9.name)) {
191
+ register(model10) {
192
+ if (typeof model10.name !== "string" || !/^[a-z]+$/.test(model10.name)) {
193
193
  throw new Error(
194
194
  "Model renderer names must contain only lowercase letters"
195
195
  );
196
196
  }
197
- if (this.models.has(model9.name)) {
198
- throw new Error(`Model renderer "${model9.name}" is already registered`);
197
+ if (this.models.has(model10.name)) {
198
+ throw new Error(`Model renderer "${model10.name}" is already registered`);
199
199
  }
200
- if (model9.pads !== "none" && model9.pads !== "footprinter") {
200
+ if (model10.pads !== "none" && model10.pads !== "footprinter") {
201
201
  throw new Error('Model renderer pads must be "none" or "footprinter"');
202
202
  }
203
- const { name, schema, render: render2, pads } = model9;
203
+ const { name, schema, render: render2, pads } = model10;
204
204
  this.models.set(name, {
205
205
  name,
206
206
  schema,
@@ -226,6 +226,161 @@ var ModelRendererRegistry = class {
226
226
  }
227
227
  };
228
228
 
229
+ // lib/models/flatheadscrew/mesh.ts
230
+ import {
231
+ flatHeadScrewModelPropsSchema
232
+ } from "@tscircuit/modelprinter";
233
+ function createFlatHeadScrewMesh(input, options = {}) {
234
+ const p = flatHeadScrewModelPropsSchema.parse(input);
235
+ const segments = options.radialSegments ?? 96;
236
+ const axial = options.threadStepsPerTurn ?? 24;
237
+ if (!Number.isInteger(segments) || segments < 24 || segments > 192 || segments % 24 !== 0 || !Number.isInteger(axial) || axial < 24 || axial > 96)
238
+ throw new Error(
239
+ "Screw mesh resolution requires 24..192 radial segments divisible by 24 and 24..96 thread steps"
240
+ );
241
+ const positions = [], indices = [];
242
+ const welded = /* @__PURE__ */ new Map();
243
+ const vertex = (x, y, z) => {
244
+ const key = [x, y, z].map((v) => Math.round(v * 1e10)).join(":");
245
+ const existing = welded.get(key);
246
+ if (existing !== void 0) return existing;
247
+ const index = positions.length / 3;
248
+ positions.push(x, y, z);
249
+ welded.set(key, index);
250
+ return index;
251
+ };
252
+ const triangle = (a, b, c) => {
253
+ if (a === b || b === c || c === a) return;
254
+ const point = (i) => positions.slice(3 * i, 3 * i + 3);
255
+ const A = point(a), B = point(b), C = point(c);
256
+ const u = B.map((v2, i) => v2 - A[i]), v = C.map((w, i) => w - A[i]);
257
+ const area = Math.hypot(
258
+ u[1] * v[2] - u[2] * v[1],
259
+ u[2] * v[0] - u[0] * v[2],
260
+ u[0] * v[1] - u[1] * v[0]
261
+ );
262
+ if (area > 1e-12) indices.push(a, b, c);
263
+ };
264
+ const ring = (radiusAt, zAt) => Array.from({ length: segments }, (_, i) => {
265
+ const theta = i * 2 * Math.PI / segments, r = radiusAt(theta);
266
+ return vertex(
267
+ r * Math.cos(theta),
268
+ r * Math.sin(theta),
269
+ typeof zAt === "number" ? zAt : zAt(theta)
270
+ );
271
+ });
272
+ const connect = (a, b) => {
273
+ for (let i = 0; i < segments; i++) {
274
+ const n = (i + 1) % segments;
275
+ triangle(a[i], a[n], b[n]);
276
+ triangle(a[i], b[n], b[i]);
277
+ }
278
+ };
279
+ const cap = (a, z, up) => {
280
+ const c = vertex(0, 0, z);
281
+ for (let i = 0; i < segments; i++) {
282
+ const n = (i + 1) % segments;
283
+ up ? triangle(c, a[i], a[n]) : triangle(c, a[n], a[i]);
284
+ }
285
+ };
286
+ let previous = [];
287
+ const add = (radiusAt, zAt) => {
288
+ const r = ring(radiusAt, zAt);
289
+ if (previous.length) connect(previous, r);
290
+ previous = r;
291
+ return r;
292
+ };
293
+ const major = p.diameter / 2, minor = p.threadRootDiameter / 2, pitch = p.threadPitch;
294
+ const shaftEnd = -p.headHeight - p.underHeadRadius * (Math.sqrt(2) - 1);
295
+ const steps = p.showThreads ? Math.ceil((shaftEnd + p.length) / pitch * axial) : 1;
296
+ if ((steps + 100) * segments > 4e5)
297
+ throw new Error("Screw exceeds mesh resolution limit");
298
+ const levels = /* @__PURE__ */ new Set([
299
+ -p.length,
300
+ -p.length + p.tipChamfer,
301
+ shaftEnd
302
+ ]);
303
+ if (p.showThreads)
304
+ for (let i = 0; i <= steps; i++)
305
+ levels.add(-p.length + (shaftEnd + p.length) * i / steps);
306
+ for (const z of [...levels].sort((a, b) => a - b)) {
307
+ const r = add((theta) => {
308
+ const phase = (((z + p.length) / pitch - (p.threadHand === "right" ? 1 : -1) * theta / (2 * Math.PI)) % 1 + 1) % 1;
309
+ const d = Math.min(phase, 1 - phase);
310
+ const groove = Math.min(
311
+ major - minor,
312
+ Math.max(0, (d - 1 / 16) * pitch * Math.sqrt(3))
313
+ );
314
+ const thread = p.showThreads ? major - groove : major;
315
+ return Math.min(
316
+ thread,
317
+ major - Math.max(0, p.tipChamfer - (z + p.length))
318
+ );
319
+ }, z);
320
+ if (z === -p.length) cap(r, z, false);
321
+ }
322
+ add(() => major, shaftEnd);
323
+ const filletCenterR = major + p.underHeadRadius;
324
+ const filletCenterZ = shaftEnd;
325
+ for (let i = 1; i <= 16; i++) {
326
+ const angle = Math.PI - (Math.PI - 3 * Math.PI / 4) * i / 16;
327
+ add(
328
+ () => filletCenterR + p.underHeadRadius * Math.cos(angle),
329
+ filletCenterZ + p.underHeadRadius * Math.sin(angle)
330
+ );
331
+ }
332
+ const hexRadius = (theta) => p.socketAcrossFlats / 2 / Math.max(
333
+ Math.abs(Math.sin(theta)),
334
+ Math.abs(Math.sin(theta + 2 * Math.PI / 3)),
335
+ Math.abs(Math.sin(theta + 4 * Math.PI / 3))
336
+ );
337
+ add(() => p.headDiameter / 2, 0);
338
+ add(hexRadius, 0);
339
+ add(hexRadius, -p.socketDepth);
340
+ cap(previous, -p.socketDepth, true);
341
+ return { positions, indices };
342
+ }
343
+
344
+ // lib/mechanical/indexedMeshToGeom3.ts
345
+ import jscad from "@jscad/modeling";
346
+ function indexedMeshToGeom3(mesh) {
347
+ const polygons = [];
348
+ for (let i = 0; i < mesh.indices.length; i += 3)
349
+ polygons.push(
350
+ mesh.indices.slice(i, i + 3).map((index) => [
351
+ mesh.positions[index * 3],
352
+ mesh.positions[index * 3 + 1],
353
+ mesh.positions[index * 3 + 2]
354
+ ])
355
+ );
356
+ return jscad.geometries.geom3.fromPoints(polygons);
357
+ }
358
+
359
+ // lib/models/flatheadscrew/FlatHeadScrew.tsx
360
+ function createFlatHeadScrewGeom(input, options) {
361
+ return indexedMeshToGeom3(createFlatHeadScrewMesh(input, options));
362
+ }
363
+ function FlatHeadScrew({
364
+ color = "#737e8f",
365
+ ...props
366
+ }) {
367
+ return /* @__PURE__ */ jsx(Colorize, { color, children: /* @__PURE__ */ jsx(Custom, { geometry: createFlatHeadScrewGeom(props) }) });
368
+ }
369
+
370
+ // lib/models/flatheadscrew/register.tsx
371
+ var model = defineModelRenderer({
372
+ name: "flatheadscrew",
373
+ schema: flatHeadScrewModelDefinitionSchema,
374
+ render: ({ fn, ...props }) => /* @__PURE__ */ jsx(FlatHeadScrew, { ...props }),
375
+ pads: "none"
376
+ });
377
+ function register(registry) {
378
+ registry.register(model);
379
+ }
380
+
381
+ // lib/models/flexscreen/register.tsx
382
+ import { flexScreenModelDefinitionSchema } from "@tscircuit/modelprinter";
383
+
229
384
  // lib/Screen.tsx
230
385
  var Screen = ({
231
386
  width: width10 = 30,
@@ -898,34 +1053,19 @@ var FlexScreen = (props) => {
898
1053
  };
899
1054
 
900
1055
  // lib/models/flexscreen/register.tsx
901
- var model = defineModelRenderer({
1056
+ var model2 = defineModelRenderer({
902
1057
  name: "flexscreen",
903
1058
  schema: flexScreenModelDefinitionSchema,
904
1059
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(FlexScreen, { ...props }),
905
1060
  pads: "footprinter"
906
1061
  });
907
- function register(registry) {
908
- registry.register(model);
1062
+ function register2(registry) {
1063
+ registry.register(model2);
909
1064
  }
910
1065
 
911
1066
  // lib/models/helicalgear/register.tsx
912
1067
  import { helicalGearModelDefinitionSchema } from "@tscircuit/modelprinter";
913
1068
 
914
- // lib/mechanical/indexedMeshToGeom3.ts
915
- import jscad from "@jscad/modeling";
916
- function indexedMeshToGeom3(mesh) {
917
- const polygons = [];
918
- for (let i = 0; i < mesh.indices.length; i += 3)
919
- polygons.push(
920
- mesh.indices.slice(i, i + 3).map((index) => [
921
- mesh.positions[index * 3],
922
- mesh.positions[index * 3 + 1],
923
- mesh.positions[index * 3 + 2]
924
- ])
925
- );
926
- return jscad.geometries.geom3.fromPoints(polygons);
927
- }
928
-
929
1069
  // lib/mechanical/helical-gear-mesh.ts
930
1070
  import {
931
1071
  getHelicalGearDimensions,
@@ -1126,14 +1266,14 @@ function HelicalGear({ color = "#737e8f", ...props }) {
1126
1266
  }
1127
1267
 
1128
1268
  // lib/models/helicalgear/register.tsx
1129
- var model2 = defineModelRenderer({
1269
+ var model3 = defineModelRenderer({
1130
1270
  name: "helicalgear",
1131
1271
  schema: helicalGearModelDefinitionSchema,
1132
1272
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(HelicalGear, { ...props }),
1133
1273
  pads: "none"
1134
1274
  });
1135
- function register2(registry) {
1136
- registry.register(model2);
1275
+ function register3(registry) {
1276
+ registry.register(model3);
1137
1277
  }
1138
1278
 
1139
1279
  // lib/models/hexbolt/register.tsx
@@ -1274,14 +1414,14 @@ function HexBolt({ color = "#737e8f", ...props }) {
1274
1414
  }
1275
1415
 
1276
1416
  // lib/models/hexbolt/register.tsx
1277
- var model3 = defineModelRenderer({
1417
+ var model4 = defineModelRenderer({
1278
1418
  name: "hexbolt",
1279
1419
  schema: hexBoltModelDefinitionSchema,
1280
1420
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(HexBolt, { ...props }),
1281
1421
  pads: "none"
1282
1422
  });
1283
- function register3(registry) {
1284
- registry.register(model3);
1423
+ function register4(registry) {
1424
+ registry.register(model4);
1285
1425
  }
1286
1426
 
1287
1427
  // lib/models/hexsocketbolt/register.tsx
@@ -1393,14 +1533,14 @@ function HexSocketBolt({
1393
1533
  }
1394
1534
 
1395
1535
  // lib/models/hexsocketbolt/register.tsx
1396
- var model4 = defineModelRenderer({
1536
+ var model5 = defineModelRenderer({
1397
1537
  name: "hexsocketbolt",
1398
1538
  schema: hexSocketBoltModelDefinitionSchema,
1399
1539
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(HexSocketBolt, { ...props }),
1400
1540
  pads: "none"
1401
1541
  });
1402
- function register4(registry) {
1403
- registry.register(model4);
1542
+ function register5(registry) {
1543
+ registry.register(model5);
1404
1544
  }
1405
1545
 
1406
1546
  // lib/models/nema/register.tsx
@@ -1669,14 +1809,14 @@ var NEMA17 = (props) => /* @__PURE__ */ jsx(NemaMotor, { ...props, nemaSize: 17
1669
1809
  var NEMA23 = (props) => /* @__PURE__ */ jsx(NemaMotor, { ...props, nemaSize: 23 });
1670
1810
 
1671
1811
  // lib/models/nema/register.tsx
1672
- var model5 = defineModelRenderer({
1812
+ var model6 = defineModelRenderer({
1673
1813
  name: "nema",
1674
1814
  schema: nemaMotorModelDefinitionSchema,
1675
1815
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(NemaMotor, { ...props }),
1676
1816
  pads: "none"
1677
1817
  });
1678
- function register5(registry) {
1679
- registry.register(model5);
1818
+ function register6(registry) {
1819
+ registry.register(model6);
1680
1820
  }
1681
1821
 
1682
1822
  // lib/models/sheetmetal/register.tsx
@@ -1836,14 +1976,14 @@ function SheetMetal({ color = "#737e8f", ...props }) {
1836
1976
  }
1837
1977
 
1838
1978
  // lib/models/sheetmetal/register.tsx
1839
- var model6 = defineModelRenderer({
1979
+ var model7 = defineModelRenderer({
1840
1980
  name: "sheetmetal",
1841
1981
  schema: sheetMetalModelDefinitionSchema,
1842
1982
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(SheetMetal, { ...props }),
1843
1983
  pads: "none"
1844
1984
  });
1845
- function register6(registry) {
1846
- registry.register(model6);
1985
+ function register7(registry) {
1986
+ registry.register(model7);
1847
1987
  }
1848
1988
 
1849
1989
  // lib/models/spurgear/register.tsx
@@ -1858,14 +1998,14 @@ function SpurGear({ color = "#737e8f", ...props }) {
1858
1998
  }
1859
1999
 
1860
2000
  // lib/models/spurgear/register.tsx
1861
- var model7 = defineModelRenderer({
2001
+ var model8 = defineModelRenderer({
1862
2002
  name: "spurgear",
1863
2003
  schema: spurGearModelDefinitionSchema,
1864
2004
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(SpurGear, { ...props }),
1865
2005
  pads: "none"
1866
2006
  });
1867
- function register7(registry) {
1868
- registry.register(model7);
2007
+ function register8(registry) {
2008
+ registry.register(model8);
1869
2009
  }
1870
2010
 
1871
2011
  // lib/models/wormgear/register.tsx
@@ -2057,14 +2197,14 @@ function WormGear({ color = "#737e8f", ...props }) {
2057
2197
  }
2058
2198
 
2059
2199
  // lib/models/wormgear/register.tsx
2060
- var model8 = defineModelRenderer({
2200
+ var model9 = defineModelRenderer({
2061
2201
  name: "wormgear",
2062
2202
  schema: wormGearModelDefinitionSchema,
2063
2203
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(WormGear, { ...props }),
2064
2204
  pads: "none"
2065
2205
  });
2066
- function register8(registry) {
2067
- registry.register(model8);
2206
+ function register9(registry) {
2207
+ registry.register(model9);
2068
2208
  }
2069
2209
 
2070
2210
  // lib/generated/model-renderers.ts
@@ -2077,6 +2217,7 @@ function registerAllModelRenderers(registry) {
2077
2217
  register6(registry);
2078
2218
  register7(registry);
2079
2219
  register8(registry);
2220
+ register9(registry);
2080
2221
  }
2081
2222
 
2082
2223
  // lib/default-model-registry.ts
@@ -9633,10 +9774,10 @@ var SOT143 = ({ footprint = "sot143" }) => {
9633
9774
  var Footprinter3d = ({ footprint }) => {
9634
9775
  const modelFn = mp3.string(footprint.split("_", 1)[0]).params().fn;
9635
9776
  if (mp3.getModelNames().includes(modelFn)) {
9636
- const model9 = mp3.string(footprint).json();
9637
- const renderer = modelRendererRegistry.get(model9.fn);
9777
+ const model10 = mp3.string(footprint).json();
9778
+ const renderer = modelRendererRegistry.get(model10.fn);
9638
9779
  if (renderer) {
9639
- return renderer.render(model9);
9780
+ return renderer.render(model10);
9640
9781
  }
9641
9782
  }
9642
9783
  let normalizedFootprint = footprint;
@@ -10587,6 +10728,7 @@ function createJSCADRenderer(jscad4) {
10587
10728
  return { createJSCADRoot };
10588
10729
  }
10589
10730
  export {
10731
+ FlatHeadScrew,
10590
10732
  Fragment,
10591
10733
  HelicalGear,
10592
10734
  HexBolt,
@@ -10599,6 +10741,8 @@ export {
10599
10741
  SpurGear,
10600
10742
  WormGear,
10601
10743
  convertCSGToThreeGeom,
10744
+ createFlatHeadScrewGeom,
10745
+ createFlatHeadScrewMesh,
10602
10746
  createHelicalGearGeom,
10603
10747
  createHelicalGearMesh,
10604
10748
  createHexBoltGeom,