jscad-electronics 0.0.202 → 0.0.203

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 { ButtonScrewModelPropsInput, CableGrommetModelPropsInput, CompressionSpringModelPropsInput, FlangedBushingModelPropsInput, FlatHeadScrewModelPropsInput, SpurGearModelPropsInput, HelicalGearModelPropsInput, HexBoltModelPropsInput, HexNutModelPropsInput, HexSocketBoltModelPropsInput, NemaMotorModelPropsInput, PanScrewModelPropsInput, PlainBushingModelPropsInput, SheetMetalModelPropsInput, WormGearModelPropsInput } from '@tscircuit/modelprinter';
6
+ import { ButtonScrewModelPropsInput, CableGrommetModelPropsInput, CompressionSpringModelPropsInput, FlangedBushingModelPropsInput, FlatHeadScrewModelPropsInput, SpurGearModelPropsInput, HelicalGearModelPropsInput, HexBoltModelPropsInput, HexNutModelPropsInput, HexSocketBoltModelPropsInput, NemaMotorModelPropsInput, PanScrewModelPropsInput, PlainBushingModelPropsInput, SheetMetalModelPropsInput, TSlotExtrusionModelPropsInput, WormGearModelPropsInput } from '@tscircuit/modelprinter';
7
7
 
8
8
  type VNode = {
9
9
  type: any;
@@ -269,6 +269,21 @@ type SpurGearProps = SpurGearModelPropsInput & {
269
269
  declare function createSpurGearGeom(input: SpurGearModelPropsInput): _jscad_modeling_src_geometries_types.Geom3;
270
270
  declare function SpurGear({ color, ...props }: SpurGearProps): react_jsx_runtime.JSX.Element;
271
271
 
272
+ interface TSlotExtrusionMesh {
273
+ positions: number[];
274
+ indices: number[];
275
+ }
276
+ /** Four straight-sided T grooves and an optional bore, all open at both ends.
277
+ * Section centered in XY; end mounting datum Z=0, length extends along +Z.
278
+ */
279
+ declare function createTSlotExtrusionMesh(input?: TSlotExtrusionModelPropsInput): TSlotExtrusionMesh;
280
+
281
+ type TSlotExtrusionProps = TSlotExtrusionModelPropsInput & {
282
+ color?: string;
283
+ };
284
+ declare function createTSlotExtrusionGeom(input?: TSlotExtrusionModelPropsInput): _jscad_modeling_src_geometries_types.Geom3;
285
+ declare function TSlotExtrusion({ color, ...props }: TSlotExtrusionProps): react_jsx_runtime.JSX.Element;
286
+
272
287
  /** Indexed triangles, counterclockwise from outside; millimeters, Z up. */
273
288
  interface WormGearMesh {
274
289
  positions: number[];
@@ -297,4 +312,4 @@ declare function createJSCADRenderer(jscad: typeof jscadModeling): {
297
312
  };
298
313
  };
299
314
 
300
- export { ButtonScrew, type ButtonScrewMesh, type ButtonScrewMeshOptions, type ButtonScrewProps, CableGrommet, type CableGrommetMesh, type CableGrommetMeshOptions, type CableGrommetProps, type ColoredGeom, CompressionSpring, type CompressionSpringMesh, type CompressionSpringMeshOptions, type CompressionSpringProps, FlangedBushing, type FlangedBushingMesh, type FlangedBushingProps, FlatHeadScrew, type FlatHeadScrewMesh, type FlatHeadScrewMeshOptions, type FlatHeadScrewProps, Fragment, HelicalGear, type HelicalGearMesh, type HelicalGearProps, HexBolt, type HexBoltMesh, type HexBoltMeshOptions, type HexBoltProps, HexNut, type HexNutMesh, type HexNutMeshOptions, type HexNutProps, HexSocketBolt, type HexSocketBoltMesh, type HexSocketBoltProps, NEMA17, NEMA23, NEMA8, type NemaFrameMotorProps, NemaMotor, type NemaMotorProps, PanScrew, type PanScrewMesh, type PanScrewMeshOptions, type PanScrewProps, PlainBushing, type PlainBushingMesh, type PlainBushingProps, type RenderResult, SheetMetal, type SheetMetalMesh, type SheetMetalProps, SpurGear, type SpurGearMesh, type SpurGearProps, type VNode, WormGear, type WormGearMesh, type WormGearProps, convertCSGToThreeGeom, createButtonScrewGeom, createButtonScrewMesh, createCableGrommetGeom, createCableGrommetMesh, createCompressionSpringGeom, createCompressionSpringMesh, createFlangedBushingGeom, createFlangedBushingMesh, createFlatHeadScrewGeom, createFlatHeadScrewMesh, createHelicalGearGeom, createHelicalGearMesh, createHexBoltGeom, createHexBoltMesh, createHexNutGeom, createHexNutMesh, createHexSocketBoltGeom, createHexSocketBoltMesh, createJSCADRenderer, createPanScrewGeom, createPanScrewMesh, createPlainBushingGeom, createPlainBushingMesh, createSheetMetalGeom, createSheetMetalMesh, createSpurGearGeom, createSpurGearMesh, createWormGearGeom, createWormGearMesh, getJscadModelForFootprint, getJscadModelForFootprintWithPads, h };
315
+ export { ButtonScrew, type ButtonScrewMesh, type ButtonScrewMeshOptions, type ButtonScrewProps, CableGrommet, type CableGrommetMesh, type CableGrommetMeshOptions, type CableGrommetProps, type ColoredGeom, CompressionSpring, type CompressionSpringMesh, type CompressionSpringMeshOptions, type CompressionSpringProps, FlangedBushing, type FlangedBushingMesh, type FlangedBushingProps, FlatHeadScrew, type FlatHeadScrewMesh, type FlatHeadScrewMeshOptions, type FlatHeadScrewProps, Fragment, HelicalGear, type HelicalGearMesh, type HelicalGearProps, HexBolt, type HexBoltMesh, type HexBoltMeshOptions, type HexBoltProps, HexNut, type HexNutMesh, type HexNutMeshOptions, type HexNutProps, HexSocketBolt, type HexSocketBoltMesh, type HexSocketBoltProps, NEMA17, NEMA23, NEMA8, type NemaFrameMotorProps, NemaMotor, type NemaMotorProps, PanScrew, type PanScrewMesh, type PanScrewMeshOptions, type PanScrewProps, PlainBushing, type PlainBushingMesh, type PlainBushingProps, type RenderResult, SheetMetal, type SheetMetalMesh, type SheetMetalProps, SpurGear, type SpurGearMesh, type SpurGearProps, TSlotExtrusion, type TSlotExtrusionMesh, type TSlotExtrusionProps, type VNode, WormGear, type WormGearMesh, type WormGearProps, convertCSGToThreeGeom, createButtonScrewGeom, createButtonScrewMesh, createCableGrommetGeom, createCableGrommetMesh, createCompressionSpringGeom, createCompressionSpringMesh, createFlangedBushingGeom, createFlangedBushingMesh, createFlatHeadScrewGeom, createFlatHeadScrewMesh, createHelicalGearGeom, createHelicalGearMesh, createHexBoltGeom, createHexBoltMesh, createHexNutGeom, createHexNutMesh, createHexSocketBoltGeom, createHexSocketBoltMesh, createJSCADRenderer, createPanScrewGeom, createPanScrewMesh, createPlainBushingGeom, createPlainBushingMesh, createSheetMetalGeom, createSheetMetalMesh, createSpurGearGeom, createSpurGearMesh, createTSlotExtrusionGeom, createTSlotExtrusionMesh, createWormGearGeom, createWormGearMesh, getJscadModelForFootprint, getJscadModelForFootprintWithPads, h };
package/dist/vanilla.js CHANGED
@@ -183,24 +183,24 @@ var FootprintPlatedHole = ({
183
183
  import { buttonScrewModelDefinitionSchema } from "@tscircuit/modelprinter";
184
184
 
185
185
  // lib/model-registry.ts
186
- function defineModelRenderer(model17) {
187
- return model17;
186
+ function defineModelRenderer(model18) {
187
+ return model18;
188
188
  }
189
189
  var ModelRendererRegistry = class {
190
190
  models = /* @__PURE__ */ new Map();
191
- register(model17) {
192
- if (typeof model17.name !== "string" || !/^[a-z]+$/.test(model17.name)) {
191
+ register(model18) {
192
+ if (typeof model18.name !== "string" || !/^[a-z]+$/.test(model18.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(model17.name)) {
198
- throw new Error(`Model renderer "${model17.name}" is already registered`);
197
+ if (this.models.has(model18.name)) {
198
+ throw new Error(`Model renderer "${model18.name}" is already registered`);
199
199
  }
200
- if (model17.pads !== "none" && model17.pads !== "footprinter") {
200
+ if (model18.pads !== "none" && model18.pads !== "footprinter") {
201
201
  throw new Error('Model renderer pads must be "none" or "footprinter"');
202
202
  }
203
- const { name, schema, render: render2, pads } = model17;
203
+ const { name, schema, render: render2, pads } = model18;
204
204
  this.models.set(name, {
205
205
  name,
206
206
  schema,
@@ -2919,6 +2919,144 @@ function register15(registry) {
2919
2919
  registry.register(model15);
2920
2920
  }
2921
2921
 
2922
+ // lib/models/tslotextrusion/register.tsx
2923
+ import { tSlotExtrusionModelDefinitionSchema } from "@tscircuit/modelprinter";
2924
+
2925
+ // lib/models/tslotextrusion/mesh.ts
2926
+ import {
2927
+ tSlotExtrusionModelPropsSchema
2928
+ } from "@tscircuit/modelprinter";
2929
+
2930
+ // lib/mechanical/extrude-planar-profile.ts
2931
+ import earcut4 from "earcut";
2932
+ function extrudePlanarProfile({
2933
+ outer,
2934
+ holes = [],
2935
+ start,
2936
+ end,
2937
+ project = (u, v, depth) => [u, v, depth],
2938
+ reverse = false,
2939
+ skipWall = () => false
2940
+ }) {
2941
+ const oriented = (loop, clockwise) => {
2942
+ loop = loop.filter((point, index) => {
2943
+ const previous = loop[(index + loop.length - 1) % loop.length];
2944
+ return point[0] !== previous[0] || point[1] !== previous[1];
2945
+ });
2946
+ const area = loop.reduce((sum, a, index) => {
2947
+ const b = loop[(index + 1) % loop.length];
2948
+ return sum + a[0] * b[1] - a[1] * b[0];
2949
+ }, 0);
2950
+ if (!Number.isFinite(area) || area === 0)
2951
+ throw new Error("Profile exceeds mesh resolution limits");
2952
+ return area < 0 === clockwise ? loop : [...loop].reverse();
2953
+ };
2954
+ const loops = [oriented(outer, false), ...holes.map((h2) => oriented(h2, true))];
2955
+ const points = loops.flat();
2956
+ const holeStarts = [];
2957
+ let count = loops[0].length;
2958
+ for (const hole of loops.slice(1)) {
2959
+ holeStarts.push(count);
2960
+ count += hole.length;
2961
+ }
2962
+ const faces = earcut4(points.flat(), holeStarts);
2963
+ const positions = [start, end].flatMap(
2964
+ (depth) => points.flatMap(([u, v]) => project(u, v, depth))
2965
+ );
2966
+ const indices = [];
2967
+ for (let i = 0; i < faces.length; i += 3) {
2968
+ const [a, b, c] = faces.slice(i, i + 3);
2969
+ indices.push(a, c, b, a + count, b + count, c + count);
2970
+ }
2971
+ let offset = 0;
2972
+ for (const [loopIndex, loop] of loops.entries()) {
2973
+ for (let i = 0; i < loop.length; i++) {
2974
+ const next = (i + 1) % loop.length;
2975
+ if (loopIndex === 0 && skipWall(loop[i], loop[next])) continue;
2976
+ const a = offset + i;
2977
+ const b = offset + next;
2978
+ indices.push(a, b, b + count, a, b + count, a + count);
2979
+ }
2980
+ offset += loop.length;
2981
+ }
2982
+ if (reverse)
2983
+ for (let i = 0; i < indices.length; i += 3)
2984
+ [indices[i + 1], indices[i + 2]] = [indices[i + 2], indices[i + 1]];
2985
+ return { positions, indices };
2986
+ }
2987
+ function circularProfile(x, y, radius, segments = 96) {
2988
+ return Array.from({ length: segments }, (_, index) => {
2989
+ const angle = index * 2 * Math.PI / segments;
2990
+ return [x + radius * Math.cos(angle), y + radius * Math.sin(angle)];
2991
+ });
2992
+ }
2993
+
2994
+ // lib/models/tslotextrusion/mesh.ts
2995
+ function createTSlotExtrusionMesh(input = {}) {
2996
+ const props = tSlotExtrusionModelPropsSchema.parse(input);
2997
+ const { width: width10, height: height10, length, cornerRadius, lipThickness, pocketDepth } = props;
2998
+ const slot = props.slotWidth / 2;
2999
+ const pocket = props.pocketWidth / 2;
3000
+ const depth = lipThickness + pocketDepth;
3001
+ const outer = [];
3002
+ for (let face2 = 0; face2 < 4; face2++) {
3003
+ const span = (face2 % 2 === 0 ? width10 : height10) / 2;
3004
+ const extent = (face2 % 2 === 0 ? height10 : width10) / 2;
3005
+ const local = [
3006
+ [-span + cornerRadius, -extent],
3007
+ [-slot, -extent],
3008
+ [-slot, -extent + lipThickness],
3009
+ [-pocket, -extent + lipThickness],
3010
+ [-pocket, -extent + depth],
3011
+ [pocket, -extent + depth],
3012
+ [pocket, -extent + lipThickness],
3013
+ [slot, -extent + lipThickness],
3014
+ [slot, -extent],
3015
+ [span - cornerRadius, -extent]
3016
+ ];
3017
+ if (cornerRadius > 0)
3018
+ for (let step = 1; step < 24; step++) {
3019
+ const angle = -Math.PI / 2 + step * Math.PI / 48;
3020
+ local.push([
3021
+ span - cornerRadius + cornerRadius * Math.cos(angle),
3022
+ -extent + cornerRadius + cornerRadius * Math.sin(angle)
3023
+ ]);
3024
+ }
3025
+ for (const [u, v] of local)
3026
+ outer.push(
3027
+ face2 === 0 ? [u, v] : face2 === 1 ? [-v, u] : face2 === 2 ? [-u, -v] : [v, -u]
3028
+ );
3029
+ }
3030
+ return extrudePlanarProfile({
3031
+ outer,
3032
+ holes: props.boreDiameter > 0 ? [circularProfile(0, 0, props.boreDiameter / 2)] : [],
3033
+ start: 0,
3034
+ end: length
3035
+ });
3036
+ }
3037
+
3038
+ // lib/models/tslotextrusion/TSlotExtrusion.tsx
3039
+ function createTSlotExtrusionGeom(input = {}) {
3040
+ return indexedMeshToGeom3(createTSlotExtrusionMesh(input));
3041
+ }
3042
+ function TSlotExtrusion({
3043
+ color = "#8995a3",
3044
+ ...props
3045
+ }) {
3046
+ return /* @__PURE__ */ jsx(Colorize, { color, children: /* @__PURE__ */ jsx(Custom, { geometry: createTSlotExtrusionGeom(props) }) });
3047
+ }
3048
+
3049
+ // lib/models/tslotextrusion/register.tsx
3050
+ var model16 = defineModelRenderer({
3051
+ name: "tslotextrusion",
3052
+ schema: tSlotExtrusionModelDefinitionSchema,
3053
+ render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TSlotExtrusion, { ...props }),
3054
+ pads: "none"
3055
+ });
3056
+ function register16(registry) {
3057
+ registry.register(model16);
3058
+ }
3059
+
2922
3060
  // lib/models/wormgear/register.tsx
2923
3061
  import { wormGearModelDefinitionSchema } from "@tscircuit/modelprinter";
2924
3062
 
@@ -2927,7 +3065,7 @@ import {
2927
3065
  getWormGearDimensions,
2928
3066
  wormGearModelPropsSchema
2929
3067
  } from "@tscircuit/modelprinter";
2930
- import earcut4 from "earcut";
3068
+ import earcut5 from "earcut";
2931
3069
  var createWormGearMesh = (input) => {
2932
3070
  const props = wormGearModelPropsSchema.parse(input);
2933
3071
  const { outsideDiameter, rootDiameter, axialPitch, lead, toothThickness } = getWormGearDimensions(props);
@@ -3080,7 +3218,7 @@ var createWormGearMesh = (input) => {
3080
3218
  positions[vertex * 3],
3081
3219
  positions[vertex * 3 + 1]
3082
3220
  ]);
3083
- const triangles = earcut4(flat, [count], 2);
3221
+ const triangles = earcut5(flat, [count], 2);
3084
3222
  for (let index = 0; index < triangles.length; index += 3) {
3085
3223
  const a = vertices[triangles[index]];
3086
3224
  const b = vertices[triangles[index + 1]];
@@ -3108,14 +3246,14 @@ function WormGear({ color = "#737e8f", ...props }) {
3108
3246
  }
3109
3247
 
3110
3248
  // lib/models/wormgear/register.tsx
3111
- var model16 = defineModelRenderer({
3249
+ var model17 = defineModelRenderer({
3112
3250
  name: "wormgear",
3113
3251
  schema: wormGearModelDefinitionSchema,
3114
3252
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(WormGear, { ...props }),
3115
3253
  pads: "none"
3116
3254
  });
3117
- function register16(registry) {
3118
- registry.register(model16);
3255
+ function register17(registry) {
3256
+ registry.register(model17);
3119
3257
  }
3120
3258
 
3121
3259
  // lib/generated/model-renderers.ts
@@ -3136,6 +3274,7 @@ function registerAllModelRenderers(registry) {
3136
3274
  register14(registry);
3137
3275
  register15(registry);
3138
3276
  register16(registry);
3277
+ register17(registry);
3139
3278
  }
3140
3279
 
3141
3280
  // lib/default-model-registry.ts
@@ -10692,10 +10831,10 @@ var SOT143 = ({ footprint = "sot143" }) => {
10692
10831
  var Footprinter3d = ({ footprint }) => {
10693
10832
  const modelFn = mp3.string(footprint.split("_", 1)[0]).params().fn;
10694
10833
  if (mp3.getModelNames().includes(modelFn)) {
10695
- const model17 = mp3.string(footprint).json();
10696
- const renderer = modelRendererRegistry.get(model17.fn);
10834
+ const model18 = mp3.string(footprint).json();
10835
+ const renderer = modelRendererRegistry.get(model18.fn);
10697
10836
  if (renderer) {
10698
- return renderer.render(model17);
10837
+ return renderer.render(model18);
10699
10838
  }
10700
10839
  }
10701
10840
  let normalizedFootprint = footprint;
@@ -11664,6 +11803,7 @@ export {
11664
11803
  PlainBushing,
11665
11804
  SheetMetal,
11666
11805
  SpurGear,
11806
+ TSlotExtrusion,
11667
11807
  WormGear,
11668
11808
  convertCSGToThreeGeom,
11669
11809
  createButtonScrewGeom,
@@ -11693,6 +11833,8 @@ export {
11693
11833
  createSheetMetalMesh,
11694
11834
  createSpurGearGeom,
11695
11835
  createSpurGearMesh,
11836
+ createTSlotExtrusionGeom,
11837
+ createTSlotExtrusionMesh,
11696
11838
  createWormGearGeom,
11697
11839
  createWormGearMesh,
11698
11840
  getJscadModelForFootprint,