jscad-electronics 0.0.216 → 0.0.218

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 from 'react';
5
5
  import * as _jscad_modeling_src_geometries_types from '@jscad/modeling/src/geometries/types';
6
- import { BallBearingModelPropsInput, BallTransferUnitModelPropsInput, ButtonScrewModelPropsInput, CableGrommetModelPropsInput, ClampingShaftCollarModelPropsInput, CompressionSpringModelPropsInput, FlangedBushingModelPropsInput, FlatHeadScrewModelPropsInput, SpurGearModelPropsInput, HelicalGearModelPropsInput, HexBoltModelPropsInput, HexNutModelPropsInput, HexSocketBoltModelPropsInput, HollowPositioningArmTubeModelPropsInput, NemaMotorModelPropsInput, PanScrewModelPropsInput, PlainBushingModelPropsInput, RigidCouplerModelPropsInput, ShaftCollarModelPropsInput, SheetMetalModelPropsInput, ThreadedRodModelPropsInput, TorsionSpringModelPropsInput, TSlotExtrusionModelPropsInput, TSlotGussetModelPropsInput, TSlotInsideCornerModelPropsInput, WormGearModelPropsInput } from '@tscircuit/modelprinter';
6
+ import { BallBearingModelPropsInput, BallTransferUnitModelPropsInput, ButtonScrewModelPropsInput, CableGrommetModelPropsInput, ClampingShaftCollarModelPropsInput, CompressionSpringModelPropsInput, FlangedBushingModelPropsInput, FlatHeadScrewModelPropsInput, SpurGearModelPropsInput, HelicalGearModelPropsInput, HexBoltModelPropsInput, HexNutModelPropsInput, HexSocketBoltModelPropsInput, HollowPositioningArmTubeModelPropsInput, NemaMotorModelPropsInput, PanScrewModelPropsInput, PlainBushingModelPropsInput, RigidCouplerModelPropsInput, ShaftCollarModelPropsInput, SheetMetalModelPropsInput, SplitWasherModelPropsInput, ThreadedRodModelPropsInput, TorsionSpringModelPropsInput, TSlotExtrusionModelPropsInput, TSlotGussetModelPropsInput, TSlotInsideCornerModelPropsInput, WormGearModelPropsInput } from '@tscircuit/modelprinter';
7
7
 
8
8
  type VNode = {
9
9
  type: any;
@@ -370,6 +370,22 @@ type SheetMetalProps = SheetMetalModelPropsInput & {
370
370
  declare function createSheetMetalGeom(input: SheetMetalModelPropsInput): _jscad_modeling_src_geometries_types.Geom3;
371
371
  declare function SheetMetal({ color, ...props }: SheetMetalProps): react.JSX.Element;
372
372
 
373
+ interface SplitWasherMesh {
374
+ positions: number[];
375
+ indices: number[];
376
+ }
377
+ interface SplitWasherMeshOptions {
378
+ angularSegments?: number;
379
+ }
380
+ /** One capped radial/vertical rectangular sweep. The minimum Z datum is zero. */
381
+ declare function createSplitWasherMesh(input: SplitWasherModelPropsInput, options?: SplitWasherMeshOptions): SplitWasherMesh;
382
+
383
+ type SplitWasherProps = SplitWasherModelPropsInput & {
384
+ color?: string;
385
+ };
386
+ declare function createSplitWasherGeom(input: SplitWasherModelPropsInput): _jscad_modeling_src_geometries_types.Geom3;
387
+ declare function SplitWasher({ color, ...props }: SplitWasherProps): react.JSX.Element;
388
+
373
389
  type SpurGearProps = SpurGearModelPropsInput & {
374
390
  color?: string;
375
391
  };
@@ -486,4 +502,4 @@ declare function createJSCADRenderer(jscad: typeof jscadModeling): {
486
502
  };
487
503
  };
488
504
 
489
- export { BallBearing, type BallBearingMesh, type BallBearingMeshOptions, type BallBearingMeshPart, type BallBearingProps, BallTransferUnit, type BallTransferUnitMesh, type BallTransferUnitMeshPart, type BallTransferUnitProps, ButtonScrew, type ButtonScrewMesh, type ButtonScrewMeshOptions, type ButtonScrewProps, CableGrommet, type CableGrommetMesh, type CableGrommetMeshOptions, type CableGrommetProps, ClampingShaftCollar, type ClampingShaftCollarMesh, type ClampingShaftCollarProps, 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, HollowPositioningArmTube, type HollowPositioningArmTubeMesh, type HollowPositioningArmTubeMeshOptions, type HollowPositioningArmTubeProps, NEMA17, NEMA23, NEMA8, type NemaFrameMotorProps, NemaMotor, type NemaMotorProps, PanScrew, type PanScrewMesh, type PanScrewMeshOptions, type PanScrewProps, PlainBushing, type PlainBushingMesh, type PlainBushingProps, type RenderResult, RigidCoupler, type RigidCouplerMesh, type RigidCouplerProps, ShaftCollar, type ShaftCollarMesh, type ShaftCollarProps, 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, ThreadedRod, type ThreadedRodMesh, type ThreadedRodMeshOptions, type ThreadedRodProps, TorsionSpring, type TorsionSpringMesh, type TorsionSpringMeshOptions, type TorsionSpringProps, type VNode, WormGear, type WormGearMesh, type WormGearProps, convertCSGToThreeGeom, createBallBearingGeom, createBallBearingMesh, createBallTransferUnitGeom, createBallTransferUnitMesh, createButtonScrewGeom, createButtonScrewMesh, createCableGrommetGeom, createCableGrommetMesh, createClampingShaftCollarGeom, createClampingShaftCollarMesh, createCompressionSpringGeom, createCompressionSpringMesh, createFlangedBushingGeom, createFlangedBushingMesh, createFlatHeadScrewGeom, createFlatHeadScrewMesh, createHelicalGearGeom, createHelicalGearMesh, createHexBoltGeom, createHexBoltMesh, createHexNutGeom, createHexNutMesh, createHexSocketBoltGeom, createHexSocketBoltMesh, createHollowPositioningArmTubeGeom, createHollowPositioningArmTubeMesh, createJSCADRenderer, createPanScrewGeom, createPanScrewMesh, createPlainBushingGeom, createPlainBushingMesh, createRigidCouplerGeom, createRigidCouplerMesh, createShaftCollarGeom, createShaftCollarMesh, createSheetMetalGeom, createSheetMetalMesh, createSpurGearGeom, createSpurGearMesh, createTSlotExtrusionGeom, createTSlotExtrusionMesh, createTSlotGussetGeom, createTSlotGussetMesh, createTSlotInsideCornerGeom, createTSlotInsideCornerMesh, createThreadedRodGeom, createThreadedRodMesh, createTorsionSpringGeom, createTorsionSpringMesh, createWormGearGeom, createWormGearMesh, getJscadModelForFootprint, getJscadModelForFootprintWithPads, h };
505
+ export { BallBearing, type BallBearingMesh, type BallBearingMeshOptions, type BallBearingMeshPart, type BallBearingProps, BallTransferUnit, type BallTransferUnitMesh, type BallTransferUnitMeshPart, type BallTransferUnitProps, ButtonScrew, type ButtonScrewMesh, type ButtonScrewMeshOptions, type ButtonScrewProps, CableGrommet, type CableGrommetMesh, type CableGrommetMeshOptions, type CableGrommetProps, ClampingShaftCollar, type ClampingShaftCollarMesh, type ClampingShaftCollarProps, 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, HollowPositioningArmTube, type HollowPositioningArmTubeMesh, type HollowPositioningArmTubeMeshOptions, type HollowPositioningArmTubeProps, NEMA17, NEMA23, NEMA8, type NemaFrameMotorProps, NemaMotor, type NemaMotorProps, PanScrew, type PanScrewMesh, type PanScrewMeshOptions, type PanScrewProps, PlainBushing, type PlainBushingMesh, type PlainBushingProps, type RenderResult, RigidCoupler, type RigidCouplerMesh, type RigidCouplerProps, ShaftCollar, type ShaftCollarMesh, type ShaftCollarProps, SheetMetal, type SheetMetalMesh, type SheetMetalProps, SplitWasher, type SplitWasherMesh, type SplitWasherMeshOptions, type SplitWasherProps, SpurGear, type SpurGearMesh, type SpurGearProps, TSlotExtrusion, type TSlotExtrusionMesh, type TSlotExtrusionProps, TSlotGusset, type TSlotGussetMesh, type TSlotGussetProps, TSlotInsideCorner, type TSlotInsideCornerMesh, type TSlotInsideCornerProps, ThreadedRod, type ThreadedRodMesh, type ThreadedRodMeshOptions, type ThreadedRodProps, TorsionSpring, type TorsionSpringMesh, type TorsionSpringMeshOptions, type TorsionSpringProps, type VNode, WormGear, type WormGearMesh, type WormGearProps, convertCSGToThreeGeom, createBallBearingGeom, createBallBearingMesh, createBallTransferUnitGeom, createBallTransferUnitMesh, createButtonScrewGeom, createButtonScrewMesh, createCableGrommetGeom, createCableGrommetMesh, createClampingShaftCollarGeom, createClampingShaftCollarMesh, createCompressionSpringGeom, createCompressionSpringMesh, createFlangedBushingGeom, createFlangedBushingMesh, createFlatHeadScrewGeom, createFlatHeadScrewMesh, createHelicalGearGeom, createHelicalGearMesh, createHexBoltGeom, createHexBoltMesh, createHexNutGeom, createHexNutMesh, createHexSocketBoltGeom, createHexSocketBoltMesh, createHollowPositioningArmTubeGeom, createHollowPositioningArmTubeMesh, createJSCADRenderer, createPanScrewGeom, createPanScrewMesh, createPlainBushingGeom, createPlainBushingMesh, createRigidCouplerGeom, createRigidCouplerMesh, createShaftCollarGeom, createShaftCollarMesh, createSheetMetalGeom, createSheetMetalMesh, createSplitWasherGeom, createSplitWasherMesh, createSpurGearGeom, createSpurGearMesh, createTSlotExtrusionGeom, createTSlotExtrusionMesh, createTSlotGussetGeom, createTSlotGussetMesh, createTSlotInsideCornerGeom, createTSlotInsideCornerMesh, createThreadedRodGeom, createThreadedRodMesh, createTorsionSpringGeom, createTorsionSpringMesh, createWormGearGeom, createWormGearMesh, getJscadModelForFootprint, getJscadModelForFootprintWithPads, h };
package/dist/vanilla.js CHANGED
@@ -183,24 +183,24 @@ var FootprintPlatedHole = ({
183
183
  import { ballBearingModelDefinitionSchema } from "@tscircuit/modelprinter";
184
184
 
185
185
  // lib/model-registry.ts
186
- function defineModelRenderer(model28) {
187
- return model28;
186
+ function defineModelRenderer(model29) {
187
+ return model29;
188
188
  }
189
189
  var ModelRendererRegistry = class {
190
190
  models = /* @__PURE__ */ new Map();
191
- register(model28) {
192
- if (typeof model28.name !== "string" || !/^[a-z]+$/.test(model28.name)) {
191
+ register(model29) {
192
+ if (typeof model29.name !== "string" || !/^[a-z]+$/.test(model29.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(model28.name)) {
198
- throw new Error(`Model renderer "${model28.name}" is already registered`);
197
+ if (this.models.has(model29.name)) {
198
+ throw new Error(`Model renderer "${model29.name}" is already registered`);
199
199
  }
200
- if (model28.pads !== "none" && model28.pads !== "footprinter") {
200
+ if (model29.pads !== "none" && model29.pads !== "footprinter") {
201
201
  throw new Error('Model renderer pads must be "none" or "footprinter"');
202
202
  }
203
- const { name, schema, render: render2, pads } = model28;
203
+ const { name, schema, render: render2, pads } = model29;
204
204
  this.models.set(name, {
205
205
  name,
206
206
  schema,
@@ -2838,7 +2838,10 @@ function createHexNutMesh(input, options = {}) {
2838
2838
  previous = current;
2839
2839
  }
2840
2840
  const levels = new Set(
2841
- props.showThreads ? Array.from({ length: steps + 1 }, (_, i) => d.height * i / steps) : [0, d.height]
2841
+ props.showThreads ? Array.from(
2842
+ { length: steps + 1 },
2843
+ (_, i) => i === steps ? d.height : d.height * i / steps
2844
+ ) : [0, d.height]
2842
2845
  );
2843
2846
  levels.add(d.boreChamferDepth);
2844
2847
  levels.add(d.height - d.boreChamferDepth);
@@ -3958,6 +3961,82 @@ function register20(registry) {
3958
3961
  registry.register(model20);
3959
3962
  }
3960
3963
 
3964
+ // lib/models/splitwasher/register.tsx
3965
+ import { splitWasherModelDefinitionSchema } from "@tscircuit/modelprinter";
3966
+
3967
+ // lib/models/splitwasher/mesh.ts
3968
+ import {
3969
+ splitWasherModelPropsSchema
3970
+ } from "@tscircuit/modelprinter";
3971
+ function createSplitWasherMesh(input, options = {}) {
3972
+ const p = splitWasherModelPropsSchema.parse(input);
3973
+ const segments = options.angularSegments ?? 360;
3974
+ if (!Number.isInteger(segments) || segments < 24 || segments > 1440)
3975
+ throw new Error(
3976
+ "Split washer angular segments must be an integer from 24 to 1440"
3977
+ );
3978
+ const sweep = (360 - p.gapAngle) * Math.PI / 180;
3979
+ const ri = p.innerDiameter / 2, ro = p.outerDiameter / 2;
3980
+ const scale = Math.max(p.outerDiameter, p.thickness + p.rise);
3981
+ if (Math.min(ro - ri, p.thickness, ri * sweep / segments) <= scale * 1e-12)
3982
+ throw new Error(
3983
+ "Split washer dimensions exceed mesh precision at this resolution"
3984
+ );
3985
+ const positions = [], indices = [];
3986
+ for (let i = 0; i <= segments; i++) {
3987
+ const f = i / segments, theta = sweep * f;
3988
+ const c = Math.cos(theta), s = Math.sin(theta) * (p.leftHanded ? -1 : 1);
3989
+ for (const [radius, z] of [
3990
+ [ri, 0],
3991
+ [ro, 0],
3992
+ [ro, p.thickness],
3993
+ [ri, p.thickness]
3994
+ ])
3995
+ positions.push(radius * c, radius * s, z + p.rise * f);
3996
+ }
3997
+ const triangle = (a, b, c) => {
3998
+ indices.push(a, p.leftHanded ? c : b, p.leftHanded ? b : c);
3999
+ };
4000
+ for (let i = 0; i < segments; i++) {
4001
+ for (let j = 0; j < 4; j++) {
4002
+ const a = 4 * i + j, b = 4 * i + (j + 1) % 4;
4003
+ const c = b + 4, d = a + 4;
4004
+ if (j === 2) {
4005
+ triangle(a, d, b);
4006
+ triangle(d, c, b);
4007
+ } else {
4008
+ triangle(a, d, c);
4009
+ triangle(a, c, b);
4010
+ }
4011
+ }
4012
+ }
4013
+ triangle(0, 1, 2);
4014
+ triangle(0, 2, 3);
4015
+ const end = 4 * segments;
4016
+ triangle(end, end + 2, end + 1);
4017
+ triangle(end, end + 3, end + 2);
4018
+ return { positions, indices };
4019
+ }
4020
+
4021
+ // lib/models/splitwasher/SplitWasher.tsx
4022
+ function createSplitWasherGeom(input) {
4023
+ return indexedMeshToGeom3(createSplitWasherMesh(input));
4024
+ }
4025
+ function SplitWasher({ color = "#929ba6", ...props }) {
4026
+ return /* @__PURE__ */ jsx(Colorize, { color, children: /* @__PURE__ */ jsx(Custom, { geometry: createSplitWasherGeom(props) }) });
4027
+ }
4028
+
4029
+ // lib/models/splitwasher/register.tsx
4030
+ var model21 = defineModelRenderer({
4031
+ name: "splitwasher",
4032
+ schema: splitWasherModelDefinitionSchema,
4033
+ render: ({ fn, ...props }) => /* @__PURE__ */ jsx(SplitWasher, { ...props }),
4034
+ pads: "none"
4035
+ });
4036
+ function register21(registry) {
4037
+ registry.register(model21);
4038
+ }
4039
+
3961
4040
  // lib/models/spurgear/register.tsx
3962
4041
  import { spurGearModelDefinitionSchema } from "@tscircuit/modelprinter";
3963
4042
 
@@ -3970,14 +4049,14 @@ function SpurGear({ color = "#737e8f", ...props }) {
3970
4049
  }
3971
4050
 
3972
4051
  // lib/models/spurgear/register.tsx
3973
- var model21 = defineModelRenderer({
4052
+ var model22 = defineModelRenderer({
3974
4053
  name: "spurgear",
3975
4054
  schema: spurGearModelDefinitionSchema,
3976
4055
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(SpurGear, { ...props }),
3977
4056
  pads: "none"
3978
4057
  });
3979
- function register21(registry) {
3980
- registry.register(model21);
4058
+ function register22(registry) {
4059
+ registry.register(model22);
3981
4060
  }
3982
4061
 
3983
4062
  // lib/models/threadedrod/register.tsx
@@ -4074,14 +4153,14 @@ function ThreadedRod({ color = "#737e8f", ...props }) {
4074
4153
  }
4075
4154
 
4076
4155
  // lib/models/threadedrod/register.tsx
4077
- var model22 = defineModelRenderer({
4156
+ var model23 = defineModelRenderer({
4078
4157
  name: "threadedrod",
4079
4158
  schema: threadedRodModelDefinitionSchema,
4080
4159
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(ThreadedRod, { ...props }),
4081
4160
  pads: "none"
4082
4161
  });
4083
- function register22(registry) {
4084
- registry.register(model22);
4162
+ function register23(registry) {
4163
+ registry.register(model23);
4085
4164
  }
4086
4165
 
4087
4166
  // lib/models/torsionspring/register.tsx
@@ -4178,14 +4257,14 @@ function TorsionSpring({
4178
4257
  }
4179
4258
 
4180
4259
  // lib/models/torsionspring/register.tsx
4181
- var model23 = defineModelRenderer({
4260
+ var model24 = defineModelRenderer({
4182
4261
  name: "torsionspring",
4183
4262
  schema: torsionSpringModelDefinitionSchema,
4184
4263
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TorsionSpring, { ...props }),
4185
4264
  pads: "none"
4186
4265
  });
4187
- function register23(registry) {
4188
- registry.register(model23);
4266
+ function register24(registry) {
4267
+ registry.register(model24);
4189
4268
  }
4190
4269
 
4191
4270
  // lib/models/tslotextrusion/register.tsx
@@ -4250,14 +4329,14 @@ function TSlotExtrusion({
4250
4329
  }
4251
4330
 
4252
4331
  // lib/models/tslotextrusion/register.tsx
4253
- var model24 = defineModelRenderer({
4332
+ var model25 = defineModelRenderer({
4254
4333
  name: "tslotextrusion",
4255
4334
  schema: tSlotExtrusionModelDefinitionSchema,
4256
4335
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TSlotExtrusion, { ...props }),
4257
4336
  pads: "none"
4258
4337
  });
4259
- function register24(registry) {
4260
- registry.register(model24);
4338
+ function register25(registry) {
4339
+ registry.register(model25);
4261
4340
  }
4262
4341
 
4263
4342
  // lib/models/tslotgusset/register.tsx
@@ -4310,14 +4389,14 @@ function TSlotGusset({ color = "#8995a3", ...props }) {
4310
4389
  }
4311
4390
 
4312
4391
  // lib/models/tslotgusset/register.tsx
4313
- var model25 = defineModelRenderer({
4392
+ var model26 = defineModelRenderer({
4314
4393
  name: "tslotgusset",
4315
4394
  schema: tSlotGussetModelDefinitionSchema,
4316
4395
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TSlotGusset, { ...props }),
4317
4396
  pads: "none"
4318
4397
  });
4319
- function register25(registry) {
4320
- registry.register(model25);
4398
+ function register26(registry) {
4399
+ registry.register(model26);
4321
4400
  }
4322
4401
 
4323
4402
  // lib/models/tslotinsidecorner/register.tsx
@@ -4397,14 +4476,14 @@ function TSlotInsideCorner({
4397
4476
  }
4398
4477
 
4399
4478
  // lib/models/tslotinsidecorner/register.tsx
4400
- var model26 = defineModelRenderer({
4479
+ var model27 = defineModelRenderer({
4401
4480
  name: "tslotinsidecorner",
4402
4481
  schema: tSlotInsideCornerModelDefinitionSchema,
4403
4482
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(TSlotInsideCorner, { ...props }),
4404
4483
  pads: "none"
4405
4484
  });
4406
- function register26(registry) {
4407
- registry.register(model26);
4485
+ function register27(registry) {
4486
+ registry.register(model27);
4408
4487
  }
4409
4488
 
4410
4489
  // lib/models/wormgear/register.tsx
@@ -4596,14 +4675,14 @@ function WormGear({ color = "#737e8f", ...props }) {
4596
4675
  }
4597
4676
 
4598
4677
  // lib/models/wormgear/register.tsx
4599
- var model27 = defineModelRenderer({
4678
+ var model28 = defineModelRenderer({
4600
4679
  name: "wormgear",
4601
4680
  schema: wormGearModelDefinitionSchema,
4602
4681
  render: ({ fn, ...props }) => /* @__PURE__ */ jsx(WormGear, { ...props }),
4603
4682
  pads: "none"
4604
4683
  });
4605
- function register27(registry) {
4606
- registry.register(model27);
4684
+ function register28(registry) {
4685
+ registry.register(model28);
4607
4686
  }
4608
4687
 
4609
4688
  // lib/generated/model-renderers.ts
@@ -4635,6 +4714,7 @@ function registerAllModelRenderers(registry) {
4635
4714
  register25(registry);
4636
4715
  register26(registry);
4637
4716
  register27(registry);
4717
+ register28(registry);
4638
4718
  }
4639
4719
 
4640
4720
  // lib/default-model-registry.ts
@@ -12197,10 +12277,10 @@ var SOT143 = ({ footprint = "sot143" }) => {
12197
12277
  var Footprinter3d = ({ footprint }) => {
12198
12278
  const modelFn = mp3.string(footprint.split("_", 1)[0]).params().fn;
12199
12279
  if (mp3.getModelNames().includes(modelFn)) {
12200
- const model28 = mp3.string(footprint).json();
12201
- const renderer = modelRendererRegistry.get(model28.fn);
12280
+ const model29 = mp3.string(footprint).json();
12281
+ const renderer = modelRendererRegistry.get(model29.fn);
12202
12282
  if (renderer) {
12203
- return renderer.render(model28);
12283
+ return renderer.render(model29);
12204
12284
  }
12205
12285
  }
12206
12286
  let normalizedFootprint = footprint;
@@ -13174,6 +13254,7 @@ export {
13174
13254
  RigidCoupler,
13175
13255
  ShaftCollar,
13176
13256
  SheetMetal,
13257
+ SplitWasher,
13177
13258
  SpurGear,
13178
13259
  TSlotExtrusion,
13179
13260
  TSlotGusset,
@@ -13219,6 +13300,8 @@ export {
13219
13300
  createShaftCollarMesh,
13220
13301
  createSheetMetalGeom,
13221
13302
  createSheetMetalMesh,
13303
+ createSplitWasherGeom,
13304
+ createSplitWasherMesh,
13222
13305
  createSpurGearGeom,
13223
13306
  createSpurGearMesh,
13224
13307
  createTSlotExtrusionGeom,