jscad-electronics 0.0.203 → 0.0.204

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, TSlotInsideCornerModelPropsInput, WormGearModelPropsInput } from '@tscircuit/modelprinter';
7
7
 
8
8
  type VNode = {
9
9
  type: any;
@@ -284,6 +284,21 @@ 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 TSlotInsideCornerMesh {
288
+ positions: number[];
289
+ indices: number[];
290
+ }
291
+ /** Constant-thickness quarter bend joining two perpendicular drilled legs.
292
+ * Virtual inside corner is X=Z=0; width is centered on Y. No internal seam caps.
293
+ */
294
+ declare function createTSlotInsideCornerMesh(input?: TSlotInsideCornerModelPropsInput): TSlotInsideCornerMesh;
295
+
296
+ type TSlotInsideCornerProps = TSlotInsideCornerModelPropsInput & {
297
+ color?: string;
298
+ };
299
+ declare function createTSlotInsideCornerGeom(input?: TSlotInsideCornerModelPropsInput): _jscad_modeling_src_geometries_types.Geom3;
300
+ declare function TSlotInsideCorner({ color, ...props }: TSlotInsideCornerProps): react_jsx_runtime.JSX.Element;
301
+
287
302
  /** Indexed triangles, counterclockwise from outside; millimeters, Z up. */
288
303
  interface WormGearMesh {
289
304
  positions: number[];
@@ -312,4 +327,4 @@ declare function createJSCADRenderer(jscad: typeof jscadModeling): {
312
327
  };
313
328
  };
314
329
 
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 };
330
+ 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, 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, 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(model19) {
187
+ return model19;
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(model19) {
192
+ if (typeof model19.name !== "string" || !/^[a-z]+$/.test(model19.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(model19.name)) {
198
+ throw new Error(`Model renderer "${model19.name}" is already registered`);
199
199
  }
200
- if (model18.pads !== "none" && model18.pads !== "footprinter") {
200
+ if (model19.pads !== "none" && model19.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 } = model19;
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,93 @@ function register16(registry) {
3057
3076
  registry.register(model16);
3058
3077
  }
3059
3078
 
3079
+ // lib/models/tslotinsidecorner/register.tsx
3080
+ import { tSlotInsideCornerModelDefinitionSchema } from "@tscircuit/modelprinter";
3081
+
3082
+ // lib/models/tslotinsidecorner/mesh.ts
3083
+ import {
3084
+ tSlotInsideCornerModelPropsSchema
3085
+ } from "@tscircuit/modelprinter";
3086
+ function createTSlotInsideCornerMesh(input = {}) {
3087
+ const props = tSlotInsideCornerModelPropsSchema.parse(input);
3088
+ const { width: width10, legLength, thickness, bendRadius, holeOffset, holeDiameter } = props;
3089
+ const r = bendRadius;
3090
+ const outerRadius = r + thickness;
3091
+ const panel = [
3092
+ [r, -width10 / 2],
3093
+ [legLength, -width10 / 2],
3094
+ [legLength, width10 / 2],
3095
+ [r, width10 / 2]
3096
+ ];
3097
+ const holes = [circularProfile(holeOffset, 0, holeDiameter / 2)];
3098
+ const bend = [];
3099
+ if (r === 0) bend.push([0, 0]);
3100
+ else
3101
+ for (let step = 0; step <= 48; step++) {
3102
+ const angle = -Math.PI / 2 - step * Math.PI / 96;
3103
+ bend.push(
3104
+ step === 0 ? [r, 0] : step === 48 ? [0, r] : [r + r * Math.cos(angle), r + r * Math.sin(angle)]
3105
+ );
3106
+ }
3107
+ for (let step = 0; step <= 48; step++) {
3108
+ const angle = -Math.PI + step * Math.PI / 96;
3109
+ bend.push(
3110
+ step === 0 ? [-thickness, r] : step === 48 ? [r, -thickness] : [
3111
+ r + outerRadius * Math.cos(angle),
3112
+ r + outerRadius * Math.sin(angle)
3113
+ ]
3114
+ );
3115
+ }
3116
+ return joinProfileMeshes([
3117
+ extrudePlanarProfile({
3118
+ outer: panel,
3119
+ holes,
3120
+ start: -thickness,
3121
+ end: 0,
3122
+ skipWall: (a, b) => a[0] === r && b[0] === r
3123
+ }),
3124
+ extrudePlanarProfile({
3125
+ outer: panel,
3126
+ holes,
3127
+ start: -thickness,
3128
+ end: 0,
3129
+ project: (u, v, depth) => [depth, v, u],
3130
+ reverse: true,
3131
+ skipWall: (a, b) => a[0] === r && b[0] === r
3132
+ }),
3133
+ extrudePlanarProfile({
3134
+ outer: bend,
3135
+ start: -width10 / 2,
3136
+ end: width10 / 2,
3137
+ project: (u, v, depth) => [u, depth, v],
3138
+ reverse: true,
3139
+ skipWall: (a, b) => a[0] === r && b[0] === r || a[1] === r && b[1] === r
3140
+ })
3141
+ ]);
3142
+ }
3143
+
3144
+ // lib/models/tslotinsidecorner/TSlotInsideCorner.tsx
3145
+ function createTSlotInsideCornerGeom(input = {}) {
3146
+ return indexedMeshToGeom3(createTSlotInsideCornerMesh(input));
3147
+ }
3148
+ function TSlotInsideCorner({
3149
+ color = "#8995a3",
3150
+ ...props
3151
+ }) {
3152
+ return /* @__PURE__ */ jsx(Colorize, { color, children: /* @__PURE__ */ jsx(Custom, { geometry: createTSlotInsideCornerGeom(props) }) });
3153
+ }
3154
+
3155
+ // lib/models/tslotinsidecorner/register.tsx
3156
+ var model17 = defineModelRenderer({
3157
+ name: "tslotinsidecorner",
3158
+ schema: tSlotInsideCornerModelDefinitionSchema,
3159
+ render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TSlotInsideCorner, { ...props }),
3160
+ pads: "none"
3161
+ });
3162
+ function register17(registry) {
3163
+ registry.register(model17);
3164
+ }
3165
+
3060
3166
  // lib/models/wormgear/register.tsx
3061
3167
  import { wormGearModelDefinitionSchema } from "@tscircuit/modelprinter";
3062
3168
 
@@ -3246,14 +3352,14 @@ function WormGear({ color = "#737e8f", ...props }) {
3246
3352
  }
3247
3353
 
3248
3354
  // lib/models/wormgear/register.tsx
3249
- var model17 = defineModelRenderer({
3355
+ var model18 = defineModelRenderer({
3250
3356
  name: "wormgear",
3251
3357
  schema: wormGearModelDefinitionSchema,
3252
3358
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(WormGear, { ...props }),
3253
3359
  pads: "none"
3254
3360
  });
3255
- function register17(registry) {
3256
- registry.register(model17);
3361
+ function register18(registry) {
3362
+ registry.register(model18);
3257
3363
  }
3258
3364
 
3259
3365
  // lib/generated/model-renderers.ts
@@ -3275,6 +3381,7 @@ function registerAllModelRenderers(registry) {
3275
3381
  register15(registry);
3276
3382
  register16(registry);
3277
3383
  register17(registry);
3384
+ register18(registry);
3278
3385
  }
3279
3386
 
3280
3387
  // lib/default-model-registry.ts
@@ -10831,10 +10938,10 @@ var SOT143 = ({ footprint = "sot143" }) => {
10831
10938
  var Footprinter3d = ({ footprint }) => {
10832
10939
  const modelFn = mp3.string(footprint.split("_", 1)[0]).params().fn;
10833
10940
  if (mp3.getModelNames().includes(modelFn)) {
10834
- const model18 = mp3.string(footprint).json();
10835
- const renderer = modelRendererRegistry.get(model18.fn);
10941
+ const model19 = mp3.string(footprint).json();
10942
+ const renderer = modelRendererRegistry.get(model19.fn);
10836
10943
  if (renderer) {
10837
- return renderer.render(model18);
10944
+ return renderer.render(model19);
10838
10945
  }
10839
10946
  }
10840
10947
  let normalizedFootprint = footprint;
@@ -11804,6 +11911,7 @@ export {
11804
11911
  SheetMetal,
11805
11912
  SpurGear,
11806
11913
  TSlotExtrusion,
11914
+ TSlotInsideCorner,
11807
11915
  WormGear,
11808
11916
  convertCSGToThreeGeom,
11809
11917
  createButtonScrewGeom,
@@ -11835,6 +11943,8 @@ export {
11835
11943
  createSpurGearMesh,
11836
11944
  createTSlotExtrusionGeom,
11837
11945
  createTSlotExtrusionMesh,
11946
+ createTSlotInsideCornerGeom,
11947
+ createTSlotInsideCornerMesh,
11838
11948
  createWormGearGeom,
11839
11949
  createWormGearMesh,
11840
11950
  getJscadModelForFootprint,