jscad-electronics 0.0.203 → 0.0.205

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, TSlotExtrusionModelPropsInput, WormGearModelPropsInput } from '@tscircuit/modelprinter';
6
+ import { ButtonScrewModelPropsInput, CableGrommetModelPropsInput, CompressionSpringModelPropsInput, FlangedBushingModelPropsInput, FlatHeadScrewModelPropsInput, SpurGearModelPropsInput, HelicalGearModelPropsInput, HexBoltModelPropsInput, HexNutModelPropsInput, HexSocketBoltModelPropsInput, NemaMotorModelPropsInput, PanScrewModelPropsInput, PlainBushingModelPropsInput, SheetMetalModelPropsInput, TSlotExtrusionModelPropsInput, TSlotGussetModelPropsInput, TSlotInsideCornerModelPropsInput, WormGearModelPropsInput } from '@tscircuit/modelprinter';
7
7
 
8
8
  type VNode = {
9
9
  type: any;
@@ -284,6 +284,36 @@ type TSlotExtrusionProps = TSlotExtrusionModelPropsInput & {
284
284
  declare function createTSlotExtrusionGeom(input?: TSlotExtrusionModelPropsInput): _jscad_modeling_src_geometries_types.Geom3;
285
285
  declare function TSlotExtrusion({ color, ...props }: TSlotExtrusionProps): react_jsx_runtime.JSX.Element;
286
286
 
287
+ interface TSlotGussetMesh {
288
+ positions: number[];
289
+ indices: number[];
290
+ }
291
+ /** Right triangular flat plate at Z=0..thickness, with both complete through
292
+ * capsules at the mounting centers/orientations resolved by modelprinter.
293
+ */
294
+ declare function createTSlotGussetMesh(input?: TSlotGussetModelPropsInput): TSlotGussetMesh;
295
+
296
+ type TSlotGussetProps = TSlotGussetModelPropsInput & {
297
+ color?: string;
298
+ };
299
+ declare function createTSlotGussetGeom(input?: TSlotGussetModelPropsInput): _jscad_modeling_src_geometries_types.Geom3;
300
+ declare function TSlotGusset({ color, ...props }: TSlotGussetProps): react_jsx_runtime.JSX.Element;
301
+
302
+ interface TSlotInsideCornerMesh {
303
+ positions: number[];
304
+ indices: number[];
305
+ }
306
+ /** Constant-thickness quarter bend joining two perpendicular drilled legs.
307
+ * Virtual inside corner is X=Z=0; width is centered on Y. No internal seam caps.
308
+ */
309
+ declare function createTSlotInsideCornerMesh(input?: TSlotInsideCornerModelPropsInput): TSlotInsideCornerMesh;
310
+
311
+ type TSlotInsideCornerProps = TSlotInsideCornerModelPropsInput & {
312
+ color?: string;
313
+ };
314
+ declare function createTSlotInsideCornerGeom(input?: TSlotInsideCornerModelPropsInput): _jscad_modeling_src_geometries_types.Geom3;
315
+ declare function TSlotInsideCorner({ color, ...props }: TSlotInsideCornerProps): react_jsx_runtime.JSX.Element;
316
+
287
317
  /** Indexed triangles, counterclockwise from outside; millimeters, Z up. */
288
318
  interface WormGearMesh {
289
319
  positions: number[];
@@ -312,4 +342,4 @@ declare function createJSCADRenderer(jscad: typeof jscadModeling): {
312
342
  };
313
343
  };
314
344
 
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 };
345
+ 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, TSlotGusset, type TSlotGussetMesh, type TSlotGussetProps, TSlotInsideCorner, type TSlotInsideCornerMesh, type TSlotInsideCornerProps, 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, createTSlotGussetGeom, createTSlotGussetMesh, createTSlotInsideCornerGeom, createTSlotInsideCornerMesh, 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(model18) {
187
- return model18;
186
+ function defineModelRenderer(model20) {
187
+ return model20;
188
188
  }
189
189
  var ModelRendererRegistry = class {
190
190
  models = /* @__PURE__ */ new Map();
191
- register(model18) {
192
- if (typeof model18.name !== "string" || !/^[a-z]+$/.test(model18.name)) {
191
+ register(model20) {
192
+ if (typeof model20.name !== "string" || !/^[a-z]+$/.test(model20.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(model18.name)) {
198
- throw new Error(`Model renderer "${model18.name}" is already registered`);
197
+ if (this.models.has(model20.name)) {
198
+ throw new Error(`Model renderer "${model20.name}" is already registered`);
199
199
  }
200
- if (model18.pads !== "none" && model18.pads !== "footprinter") {
200
+ if (model20.pads !== "none" && model20.pads !== "footprinter") {
201
201
  throw new Error('Model renderer pads must be "none" or "footprinter"');
202
202
  }
203
- const { name, schema, render: render2, pads } = model18;
203
+ const { name, schema, render: render2, pads } = model20;
204
204
  this.models.set(name, {
205
205
  name,
206
206
  schema,
@@ -2984,6 +2984,25 @@ function extrudePlanarProfile({
2984
2984
  [indices[i + 1], indices[i + 2]] = [indices[i + 2], indices[i + 1]];
2985
2985
  return { positions, indices };
2986
2986
  }
2987
+ function joinProfileMeshes(meshes) {
2988
+ const positions = [];
2989
+ const indices = [];
2990
+ const vertices = /* @__PURE__ */ new Map();
2991
+ for (const mesh of meshes) {
2992
+ for (const index of mesh.indices) {
2993
+ const point = mesh.positions.slice(index * 3, index * 3 + 3);
2994
+ const key = point.map((value) => value.toFixed(12)).join(",");
2995
+ let shared = vertices.get(key);
2996
+ if (shared === void 0) {
2997
+ shared = positions.length / 3;
2998
+ vertices.set(key, shared);
2999
+ positions.push(...point);
3000
+ }
3001
+ indices.push(shared);
3002
+ }
3003
+ }
3004
+ return { positions, indices };
3005
+ }
2987
3006
  function circularProfile(x, y, radius, segments = 96) {
2988
3007
  return Array.from({ length: segments }, (_, index) => {
2989
3008
  const angle = index * 2 * Math.PI / segments;
@@ -3057,6 +3076,153 @@ function register16(registry) {
3057
3076
  registry.register(model16);
3058
3077
  }
3059
3078
 
3079
+ // lib/models/tslotgusset/register.tsx
3080
+ import { tSlotGussetModelDefinitionSchema } from "@tscircuit/modelprinter";
3081
+
3082
+ // lib/models/tslotgusset/mesh.ts
3083
+ import {
3084
+ getTSlotGussetMountingSlots,
3085
+ tSlotGussetModelPropsSchema
3086
+ } from "@tscircuit/modelprinter";
3087
+ function createTSlotGussetMesh(input = {}) {
3088
+ const props = tSlotGussetModelPropsSchema.parse(input);
3089
+ const holes = getTSlotGussetMountingSlots(props).map((slot) => {
3090
+ const radius = slot.width / 2;
3091
+ const halfStraight = (slot.length - slot.width) / 2;
3092
+ const rotate = (u, v) => slot.orientation === 0 ? [slot.center.x + u, slot.center.y + v] : [slot.center.x - v, slot.center.y + u];
3093
+ if (halfStraight === 0)
3094
+ return circularProfile(0, 0, radius).map(([u, v]) => rotate(u, v));
3095
+ const loop = [];
3096
+ for (const side of [1, -1])
3097
+ for (let step = 0; step <= 48; step++) {
3098
+ const angle = -Math.PI / 2 + step * Math.PI / 48 + (side < 0 ? Math.PI : 0);
3099
+ loop.push(
3100
+ rotate(
3101
+ side * halfStraight + radius * Math.cos(angle),
3102
+ radius * Math.sin(angle)
3103
+ )
3104
+ );
3105
+ }
3106
+ return loop;
3107
+ });
3108
+ return extrudePlanarProfile({
3109
+ outer: [
3110
+ [0, 0],
3111
+ [props.width, 0],
3112
+ [0, props.height]
3113
+ ],
3114
+ holes,
3115
+ start: 0,
3116
+ end: props.thickness
3117
+ });
3118
+ }
3119
+
3120
+ // lib/models/tslotgusset/TSlotGusset.tsx
3121
+ function createTSlotGussetGeom(input = {}) {
3122
+ return indexedMeshToGeom3(createTSlotGussetMesh(input));
3123
+ }
3124
+ function TSlotGusset({ color = "#8995a3", ...props }) {
3125
+ return /* @__PURE__ */ jsx(Colorize, { color, children: /* @__PURE__ */ jsx(Custom, { geometry: createTSlotGussetGeom(props) }) });
3126
+ }
3127
+
3128
+ // lib/models/tslotgusset/register.tsx
3129
+ var model17 = defineModelRenderer({
3130
+ name: "tslotgusset",
3131
+ schema: tSlotGussetModelDefinitionSchema,
3132
+ render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TSlotGusset, { ...props }),
3133
+ pads: "none"
3134
+ });
3135
+ function register17(registry) {
3136
+ registry.register(model17);
3137
+ }
3138
+
3139
+ // lib/models/tslotinsidecorner/register.tsx
3140
+ import { tSlotInsideCornerModelDefinitionSchema } from "@tscircuit/modelprinter";
3141
+
3142
+ // lib/models/tslotinsidecorner/mesh.ts
3143
+ import {
3144
+ tSlotInsideCornerModelPropsSchema
3145
+ } from "@tscircuit/modelprinter";
3146
+ function createTSlotInsideCornerMesh(input = {}) {
3147
+ const props = tSlotInsideCornerModelPropsSchema.parse(input);
3148
+ const { width: width10, legLength, thickness, bendRadius, holeOffset, holeDiameter } = props;
3149
+ const r = bendRadius;
3150
+ const outerRadius = r + thickness;
3151
+ const panel = [
3152
+ [r, -width10 / 2],
3153
+ [legLength, -width10 / 2],
3154
+ [legLength, width10 / 2],
3155
+ [r, width10 / 2]
3156
+ ];
3157
+ const holes = [circularProfile(holeOffset, 0, holeDiameter / 2)];
3158
+ const bend = [];
3159
+ if (r === 0) bend.push([0, 0]);
3160
+ else
3161
+ for (let step = 0; step <= 48; step++) {
3162
+ const angle = -Math.PI / 2 - step * Math.PI / 96;
3163
+ bend.push(
3164
+ step === 0 ? [r, 0] : step === 48 ? [0, r] : [r + r * Math.cos(angle), r + r * Math.sin(angle)]
3165
+ );
3166
+ }
3167
+ for (let step = 0; step <= 48; step++) {
3168
+ const angle = -Math.PI + step * Math.PI / 96;
3169
+ bend.push(
3170
+ step === 0 ? [-thickness, r] : step === 48 ? [r, -thickness] : [
3171
+ r + outerRadius * Math.cos(angle),
3172
+ r + outerRadius * Math.sin(angle)
3173
+ ]
3174
+ );
3175
+ }
3176
+ return joinProfileMeshes([
3177
+ extrudePlanarProfile({
3178
+ outer: panel,
3179
+ holes,
3180
+ start: -thickness,
3181
+ end: 0,
3182
+ skipWall: (a, b) => a[0] === r && b[0] === r
3183
+ }),
3184
+ extrudePlanarProfile({
3185
+ outer: panel,
3186
+ holes,
3187
+ start: -thickness,
3188
+ end: 0,
3189
+ project: (u, v, depth) => [depth, v, u],
3190
+ reverse: true,
3191
+ skipWall: (a, b) => a[0] === r && b[0] === r
3192
+ }),
3193
+ extrudePlanarProfile({
3194
+ outer: bend,
3195
+ start: -width10 / 2,
3196
+ end: width10 / 2,
3197
+ project: (u, v, depth) => [u, depth, v],
3198
+ reverse: true,
3199
+ skipWall: (a, b) => a[0] === r && b[0] === r || a[1] === r && b[1] === r
3200
+ })
3201
+ ]);
3202
+ }
3203
+
3204
+ // lib/models/tslotinsidecorner/TSlotInsideCorner.tsx
3205
+ function createTSlotInsideCornerGeom(input = {}) {
3206
+ return indexedMeshToGeom3(createTSlotInsideCornerMesh(input));
3207
+ }
3208
+ function TSlotInsideCorner({
3209
+ color = "#8995a3",
3210
+ ...props
3211
+ }) {
3212
+ return /* @__PURE__ */ jsx(Colorize, { color, children: /* @__PURE__ */ jsx(Custom, { geometry: createTSlotInsideCornerGeom(props) }) });
3213
+ }
3214
+
3215
+ // lib/models/tslotinsidecorner/register.tsx
3216
+ var model18 = defineModelRenderer({
3217
+ name: "tslotinsidecorner",
3218
+ schema: tSlotInsideCornerModelDefinitionSchema,
3219
+ render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TSlotInsideCorner, { ...props }),
3220
+ pads: "none"
3221
+ });
3222
+ function register18(registry) {
3223
+ registry.register(model18);
3224
+ }
3225
+
3060
3226
  // lib/models/wormgear/register.tsx
3061
3227
  import { wormGearModelDefinitionSchema } from "@tscircuit/modelprinter";
3062
3228
 
@@ -3246,14 +3412,14 @@ function WormGear({ color = "#737e8f", ...props }) {
3246
3412
  }
3247
3413
 
3248
3414
  // lib/models/wormgear/register.tsx
3249
- var model17 = defineModelRenderer({
3415
+ var model19 = defineModelRenderer({
3250
3416
  name: "wormgear",
3251
3417
  schema: wormGearModelDefinitionSchema,
3252
3418
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(WormGear, { ...props }),
3253
3419
  pads: "none"
3254
3420
  });
3255
- function register17(registry) {
3256
- registry.register(model17);
3421
+ function register19(registry) {
3422
+ registry.register(model19);
3257
3423
  }
3258
3424
 
3259
3425
  // lib/generated/model-renderers.ts
@@ -3275,6 +3441,8 @@ function registerAllModelRenderers(registry) {
3275
3441
  register15(registry);
3276
3442
  register16(registry);
3277
3443
  register17(registry);
3444
+ register18(registry);
3445
+ register19(registry);
3278
3446
  }
3279
3447
 
3280
3448
  // lib/default-model-registry.ts
@@ -10831,10 +10999,10 @@ var SOT143 = ({ footprint = "sot143" }) => {
10831
10999
  var Footprinter3d = ({ footprint }) => {
10832
11000
  const modelFn = mp3.string(footprint.split("_", 1)[0]).params().fn;
10833
11001
  if (mp3.getModelNames().includes(modelFn)) {
10834
- const model18 = mp3.string(footprint).json();
10835
- const renderer = modelRendererRegistry.get(model18.fn);
11002
+ const model20 = mp3.string(footprint).json();
11003
+ const renderer = modelRendererRegistry.get(model20.fn);
10836
11004
  if (renderer) {
10837
- return renderer.render(model18);
11005
+ return renderer.render(model20);
10838
11006
  }
10839
11007
  }
10840
11008
  let normalizedFootprint = footprint;
@@ -11804,6 +11972,8 @@ export {
11804
11972
  SheetMetal,
11805
11973
  SpurGear,
11806
11974
  TSlotExtrusion,
11975
+ TSlotGusset,
11976
+ TSlotInsideCorner,
11807
11977
  WormGear,
11808
11978
  convertCSGToThreeGeom,
11809
11979
  createButtonScrewGeom,
@@ -11835,6 +12005,10 @@ export {
11835
12005
  createSpurGearMesh,
11836
12006
  createTSlotExtrusionGeom,
11837
12007
  createTSlotExtrusionMesh,
12008
+ createTSlotGussetGeom,
12009
+ createTSlotGussetMesh,
12010
+ createTSlotInsideCornerGeom,
12011
+ createTSlotInsideCornerMesh,
11838
12012
  createWormGearGeom,
11839
12013
  createWormGearMesh,
11840
12014
  getJscadModelForFootprint,