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/index.d.ts +17 -2
- package/dist/index.js +975 -828
- package/dist/index.js.map +1 -1
- package/dist/vanilla.d.ts +17 -2
- package/dist/vanilla.js +158 -16
- package/dist/vanilla.js.map +1 -1
- package/package.json +1 -1
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(
|
|
187
|
-
return
|
|
186
|
+
function defineModelRenderer(model18) {
|
|
187
|
+
return model18;
|
|
188
188
|
}
|
|
189
189
|
var ModelRendererRegistry = class {
|
|
190
190
|
models = /* @__PURE__ */ new Map();
|
|
191
|
-
register(
|
|
192
|
-
if (typeof
|
|
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(
|
|
198
|
-
throw new Error(`Model renderer "${
|
|
197
|
+
if (this.models.has(model18.name)) {
|
|
198
|
+
throw new Error(`Model renderer "${model18.name}" is already registered`);
|
|
199
199
|
}
|
|
200
|
-
if (
|
|
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 } =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
3118
|
-
registry.register(
|
|
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
|
|
10696
|
-
const renderer = modelRendererRegistry.get(
|
|
10834
|
+
const model18 = mp3.string(footprint).json();
|
|
10835
|
+
const renderer = modelRendererRegistry.get(model18.fn);
|
|
10697
10836
|
if (renderer) {
|
|
10698
|
-
return renderer.render(
|
|
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,
|