jscad-electronics 0.0.202 → 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, 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;
@@ -269,6 +269,36 @@ 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
+
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
+
272
302
  /** Indexed triangles, counterclockwise from outside; millimeters, Z up. */
273
303
  interface WormGearMesh {
274
304
  positions: number[];
@@ -297,4 +327,4 @@ declare function createJSCADRenderer(jscad: typeof jscadModeling): {
297
327
  };
298
328
  };
299
329
 
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 };
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(model17) {
187
- return model17;
186
+ function defineModelRenderer(model19) {
187
+ return model19;
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(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(model17.name)) {
198
- throw new Error(`Model renderer "${model17.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 (model17.pads !== "none" && model17.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 } = model17;
203
+ const { name, schema, render: render2, pads } = model19;
204
204
  this.models.set(name, {
205
205
  name,
206
206
  schema,
@@ -2919,6 +2919,250 @@ 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 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
+ }
3006
+ function circularProfile(x, y, radius, segments = 96) {
3007
+ return Array.from({ length: segments }, (_, index) => {
3008
+ const angle = index * 2 * Math.PI / segments;
3009
+ return [x + radius * Math.cos(angle), y + radius * Math.sin(angle)];
3010
+ });
3011
+ }
3012
+
3013
+ // lib/models/tslotextrusion/mesh.ts
3014
+ function createTSlotExtrusionMesh(input = {}) {
3015
+ const props = tSlotExtrusionModelPropsSchema.parse(input);
3016
+ const { width: width10, height: height10, length, cornerRadius, lipThickness, pocketDepth } = props;
3017
+ const slot = props.slotWidth / 2;
3018
+ const pocket = props.pocketWidth / 2;
3019
+ const depth = lipThickness + pocketDepth;
3020
+ const outer = [];
3021
+ for (let face2 = 0; face2 < 4; face2++) {
3022
+ const span = (face2 % 2 === 0 ? width10 : height10) / 2;
3023
+ const extent = (face2 % 2 === 0 ? height10 : width10) / 2;
3024
+ const local = [
3025
+ [-span + cornerRadius, -extent],
3026
+ [-slot, -extent],
3027
+ [-slot, -extent + lipThickness],
3028
+ [-pocket, -extent + lipThickness],
3029
+ [-pocket, -extent + depth],
3030
+ [pocket, -extent + depth],
3031
+ [pocket, -extent + lipThickness],
3032
+ [slot, -extent + lipThickness],
3033
+ [slot, -extent],
3034
+ [span - cornerRadius, -extent]
3035
+ ];
3036
+ if (cornerRadius > 0)
3037
+ for (let step = 1; step < 24; step++) {
3038
+ const angle = -Math.PI / 2 + step * Math.PI / 48;
3039
+ local.push([
3040
+ span - cornerRadius + cornerRadius * Math.cos(angle),
3041
+ -extent + cornerRadius + cornerRadius * Math.sin(angle)
3042
+ ]);
3043
+ }
3044
+ for (const [u, v] of local)
3045
+ outer.push(
3046
+ face2 === 0 ? [u, v] : face2 === 1 ? [-v, u] : face2 === 2 ? [-u, -v] : [v, -u]
3047
+ );
3048
+ }
3049
+ return extrudePlanarProfile({
3050
+ outer,
3051
+ holes: props.boreDiameter > 0 ? [circularProfile(0, 0, props.boreDiameter / 2)] : [],
3052
+ start: 0,
3053
+ end: length
3054
+ });
3055
+ }
3056
+
3057
+ // lib/models/tslotextrusion/TSlotExtrusion.tsx
3058
+ function createTSlotExtrusionGeom(input = {}) {
3059
+ return indexedMeshToGeom3(createTSlotExtrusionMesh(input));
3060
+ }
3061
+ function TSlotExtrusion({
3062
+ color = "#8995a3",
3063
+ ...props
3064
+ }) {
3065
+ return /* @__PURE__ */ jsx(Colorize, { color, children: /* @__PURE__ */ jsx(Custom, { geometry: createTSlotExtrusionGeom(props) }) });
3066
+ }
3067
+
3068
+ // lib/models/tslotextrusion/register.tsx
3069
+ var model16 = defineModelRenderer({
3070
+ name: "tslotextrusion",
3071
+ schema: tSlotExtrusionModelDefinitionSchema,
3072
+ render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TSlotExtrusion, { ...props }),
3073
+ pads: "none"
3074
+ });
3075
+ function register16(registry) {
3076
+ registry.register(model16);
3077
+ }
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
+
2922
3166
  // lib/models/wormgear/register.tsx
2923
3167
  import { wormGearModelDefinitionSchema } from "@tscircuit/modelprinter";
2924
3168
 
@@ -2927,7 +3171,7 @@ import {
2927
3171
  getWormGearDimensions,
2928
3172
  wormGearModelPropsSchema
2929
3173
  } from "@tscircuit/modelprinter";
2930
- import earcut4 from "earcut";
3174
+ import earcut5 from "earcut";
2931
3175
  var createWormGearMesh = (input) => {
2932
3176
  const props = wormGearModelPropsSchema.parse(input);
2933
3177
  const { outsideDiameter, rootDiameter, axialPitch, lead, toothThickness } = getWormGearDimensions(props);
@@ -3080,7 +3324,7 @@ var createWormGearMesh = (input) => {
3080
3324
  positions[vertex * 3],
3081
3325
  positions[vertex * 3 + 1]
3082
3326
  ]);
3083
- const triangles = earcut4(flat, [count], 2);
3327
+ const triangles = earcut5(flat, [count], 2);
3084
3328
  for (let index = 0; index < triangles.length; index += 3) {
3085
3329
  const a = vertices[triangles[index]];
3086
3330
  const b = vertices[triangles[index + 1]];
@@ -3108,14 +3352,14 @@ function WormGear({ color = "#737e8f", ...props }) {
3108
3352
  }
3109
3353
 
3110
3354
  // lib/models/wormgear/register.tsx
3111
- var model16 = defineModelRenderer({
3355
+ var model18 = defineModelRenderer({
3112
3356
  name: "wormgear",
3113
3357
  schema: wormGearModelDefinitionSchema,
3114
3358
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(WormGear, { ...props }),
3115
3359
  pads: "none"
3116
3360
  });
3117
- function register16(registry) {
3118
- registry.register(model16);
3361
+ function register18(registry) {
3362
+ registry.register(model18);
3119
3363
  }
3120
3364
 
3121
3365
  // lib/generated/model-renderers.ts
@@ -3136,6 +3380,8 @@ function registerAllModelRenderers(registry) {
3136
3380
  register14(registry);
3137
3381
  register15(registry);
3138
3382
  register16(registry);
3383
+ register17(registry);
3384
+ register18(registry);
3139
3385
  }
3140
3386
 
3141
3387
  // lib/default-model-registry.ts
@@ -10692,10 +10938,10 @@ var SOT143 = ({ footprint = "sot143" }) => {
10692
10938
  var Footprinter3d = ({ footprint }) => {
10693
10939
  const modelFn = mp3.string(footprint.split("_", 1)[0]).params().fn;
10694
10940
  if (mp3.getModelNames().includes(modelFn)) {
10695
- const model17 = mp3.string(footprint).json();
10696
- const renderer = modelRendererRegistry.get(model17.fn);
10941
+ const model19 = mp3.string(footprint).json();
10942
+ const renderer = modelRendererRegistry.get(model19.fn);
10697
10943
  if (renderer) {
10698
- return renderer.render(model17);
10944
+ return renderer.render(model19);
10699
10945
  }
10700
10946
  }
10701
10947
  let normalizedFootprint = footprint;
@@ -11664,6 +11910,8 @@ export {
11664
11910
  PlainBushing,
11665
11911
  SheetMetal,
11666
11912
  SpurGear,
11913
+ TSlotExtrusion,
11914
+ TSlotInsideCorner,
11667
11915
  WormGear,
11668
11916
  convertCSGToThreeGeom,
11669
11917
  createButtonScrewGeom,
@@ -11693,6 +11941,10 @@ export {
11693
11941
  createSheetMetalMesh,
11694
11942
  createSpurGearGeom,
11695
11943
  createSpurGearMesh,
11944
+ createTSlotExtrusionGeom,
11945
+ createTSlotExtrusionMesh,
11946
+ createTSlotInsideCornerGeom,
11947
+ createTSlotInsideCornerMesh,
11696
11948
  createWormGearGeom,
11697
11949
  createWormGearMesh,
11698
11950
  getJscadModelForFootprint,