jscad-electronics 0.0.195 → 0.0.197
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 +34 -2
- package/dist/index.js +1149 -842
- package/dist/index.js.map +1 -1
- package/dist/vanilla.d.ts +34 -2
- package/dist/vanilla.js +317 -20
- 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 { FlatHeadScrewModelPropsInput, SpurGearModelPropsInput, HelicalGearModelPropsInput, HexBoltModelPropsInput, HexSocketBoltModelPropsInput, NemaMotorModelPropsInput, SheetMetalModelPropsInput, WormGearModelPropsInput } from '@tscircuit/modelprinter';
|
|
6
|
+
import { FlatHeadScrewModelPropsInput, SpurGearModelPropsInput, HelicalGearModelPropsInput, HexBoltModelPropsInput, HexSocketBoltModelPropsInput, NemaMotorModelPropsInput, PanScrewModelPropsInput, PlainBushingModelPropsInput, SheetMetalModelPropsInput, WormGearModelPropsInput } from '@tscircuit/modelprinter';
|
|
7
7
|
|
|
8
8
|
type VNode = {
|
|
9
9
|
type: any;
|
|
@@ -124,6 +124,38 @@ declare const NEMA8: (props: NemaFrameMotorProps) => react_jsx_runtime.JSX.Eleme
|
|
|
124
124
|
declare const NEMA17: (props: NemaFrameMotorProps) => react_jsx_runtime.JSX.Element;
|
|
125
125
|
declare const NEMA23: (props: NemaFrameMotorProps) => react_jsx_runtime.JSX.Element;
|
|
126
126
|
|
|
127
|
+
interface PanScrewMeshOptions {
|
|
128
|
+
radialSegments?: number;
|
|
129
|
+
threadStepsPerTurn?: number;
|
|
130
|
+
}
|
|
131
|
+
/** Outward-oriented, welded indexed surface, in millimeters. */
|
|
132
|
+
interface PanScrewMesh {
|
|
133
|
+
positions: number[];
|
|
134
|
+
indices: number[];
|
|
135
|
+
}
|
|
136
|
+
declare function createPanScrewMesh(input: PanScrewModelPropsInput, options?: PanScrewMeshOptions): PanScrewMesh;
|
|
137
|
+
|
|
138
|
+
type PanScrewProps = PanScrewModelPropsInput & {
|
|
139
|
+
color?: string;
|
|
140
|
+
};
|
|
141
|
+
declare function createPanScrewGeom(input: PanScrewModelPropsInput, options?: PanScrewMeshOptions): _jscad_modeling_src_geometries_types.Geom3;
|
|
142
|
+
declare function PanScrew({ color, ...props }: PanScrewProps): react_jsx_runtime.JSX.Element;
|
|
143
|
+
|
|
144
|
+
/** Shared ring vertices and outward counterclockwise triangles, in millimeters. */
|
|
145
|
+
interface PlainBushingMesh {
|
|
146
|
+
positions: number[];
|
|
147
|
+
indices: number[];
|
|
148
|
+
}
|
|
149
|
+
/** Annular end faces at Z=0/length; chamfers cut all four bore/outside rims. */
|
|
150
|
+
declare function createPlainBushingMesh(input: PlainBushingModelPropsInput): PlainBushingMesh;
|
|
151
|
+
|
|
152
|
+
type PlainBushingProps = PlainBushingModelPropsInput & {
|
|
153
|
+
color?: string;
|
|
154
|
+
};
|
|
155
|
+
/** Through sleeve from Z=0 to length, with four optional 45-degree rim chamfers. */
|
|
156
|
+
declare function createPlainBushingGeom(input: PlainBushingModelPropsInput): _jscad_modeling_src_geometries_types.Geom3;
|
|
157
|
+
declare function PlainBushing({ color, ...props }: PlainBushingProps): react_jsx_runtime.JSX.Element;
|
|
158
|
+
|
|
127
159
|
interface SheetMetalMesh {
|
|
128
160
|
positions: number[];
|
|
129
161
|
indices: number[];
|
|
@@ -178,4 +210,4 @@ declare function createJSCADRenderer(jscad: typeof jscadModeling): {
|
|
|
178
210
|
};
|
|
179
211
|
};
|
|
180
212
|
|
|
181
|
-
export { type ColoredGeom, FlatHeadScrew, type FlatHeadScrewMesh, type FlatHeadScrewMeshOptions, type FlatHeadScrewProps, Fragment, HelicalGear, type HelicalGearMesh, type HelicalGearProps, HexBolt, type HexBoltMesh, type HexBoltMeshOptions, type HexBoltProps, HexSocketBolt, type HexSocketBoltMesh, type HexSocketBoltProps, NEMA17, NEMA23, NEMA8, type NemaFrameMotorProps, NemaMotor, type NemaMotorProps, type RenderResult, SheetMetal, type SheetMetalMesh, type SheetMetalProps, SpurGear, type SpurGearMesh, type SpurGearProps, type VNode, WormGear, type WormGearMesh, type WormGearProps, convertCSGToThreeGeom, createFlatHeadScrewGeom, createFlatHeadScrewMesh, createHelicalGearGeom, createHelicalGearMesh, createHexBoltGeom, createHexBoltMesh, createHexSocketBoltGeom, createHexSocketBoltMesh, createJSCADRenderer, createSheetMetalGeom, createSheetMetalMesh, createSpurGearGeom, createSpurGearMesh, createWormGearGeom, createWormGearMesh, getJscadModelForFootprint, getJscadModelForFootprintWithPads, h };
|
|
213
|
+
export { type ColoredGeom, FlatHeadScrew, type FlatHeadScrewMesh, type FlatHeadScrewMeshOptions, type FlatHeadScrewProps, Fragment, HelicalGear, type HelicalGearMesh, type HelicalGearProps, HexBolt, type HexBoltMesh, type HexBoltMeshOptions, type HexBoltProps, 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, createFlatHeadScrewGeom, createFlatHeadScrewMesh, createHelicalGearGeom, createHelicalGearMesh, createHexBoltGeom, createHexBoltMesh, createHexSocketBoltGeom, createHexSocketBoltMesh, createJSCADRenderer, createPanScrewGeom, createPanScrewMesh, createPlainBushingGeom, createPlainBushingMesh, createSheetMetalGeom, createSheetMetalMesh, createSpurGearGeom, createSpurGearMesh, createWormGearGeom, createWormGearMesh, getJscadModelForFootprint, getJscadModelForFootprintWithPads, h };
|
package/dist/vanilla.js
CHANGED
|
@@ -183,24 +183,24 @@ var FootprintPlatedHole = ({
|
|
|
183
183
|
import { flatHeadScrewModelDefinitionSchema } from "@tscircuit/modelprinter";
|
|
184
184
|
|
|
185
185
|
// lib/model-registry.ts
|
|
186
|
-
function defineModelRenderer(
|
|
187
|
-
return
|
|
186
|
+
function defineModelRenderer(model12) {
|
|
187
|
+
return model12;
|
|
188
188
|
}
|
|
189
189
|
var ModelRendererRegistry = class {
|
|
190
190
|
models = /* @__PURE__ */ new Map();
|
|
191
|
-
register(
|
|
192
|
-
if (typeof
|
|
191
|
+
register(model12) {
|
|
192
|
+
if (typeof model12.name !== "string" || !/^[a-z]+$/.test(model12.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(model12.name)) {
|
|
198
|
+
throw new Error(`Model renderer "${model12.name}" is already registered`);
|
|
199
199
|
}
|
|
200
|
-
if (
|
|
200
|
+
if (model12.pads !== "none" && model12.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 } = model12;
|
|
204
204
|
this.models.set(name, {
|
|
205
205
|
name,
|
|
206
206
|
schema,
|
|
@@ -1819,6 +1819,295 @@ function register6(registry) {
|
|
|
1819
1819
|
registry.register(model6);
|
|
1820
1820
|
}
|
|
1821
1821
|
|
|
1822
|
+
// lib/models/panscrew/register.tsx
|
|
1823
|
+
import { panScrewModelDefinitionSchema } from "@tscircuit/modelprinter";
|
|
1824
|
+
|
|
1825
|
+
// lib/models/panscrew/mesh.ts
|
|
1826
|
+
import {
|
|
1827
|
+
panScrewModelPropsSchema
|
|
1828
|
+
} from "@tscircuit/modelprinter";
|
|
1829
|
+
function createPanScrewMesh(input, options = {}) {
|
|
1830
|
+
const p = panScrewModelPropsSchema.parse(input);
|
|
1831
|
+
const segments = options.radialSegments ?? 96;
|
|
1832
|
+
const axial = options.threadStepsPerTurn ?? 24;
|
|
1833
|
+
if (!Number.isInteger(segments) || segments < 24 || segments > 192 || segments % 24 !== 0 || !Number.isInteger(axial) || axial < 24 || axial > 96)
|
|
1834
|
+
throw new Error(
|
|
1835
|
+
"Screw mesh resolution requires 24..192 radial segments divisible by 24 and 24..96 thread steps"
|
|
1836
|
+
);
|
|
1837
|
+
const positions = [], indices = [];
|
|
1838
|
+
const welded = /* @__PURE__ */ new Map();
|
|
1839
|
+
const vertex = (x, y, z) => {
|
|
1840
|
+
const key = [x, y, z].map((v) => Math.round(v * 1e10)).join(":");
|
|
1841
|
+
const existing = welded.get(key);
|
|
1842
|
+
if (existing !== void 0) return existing;
|
|
1843
|
+
const index = positions.length / 3;
|
|
1844
|
+
positions.push(x, y, z);
|
|
1845
|
+
welded.set(key, index);
|
|
1846
|
+
return index;
|
|
1847
|
+
};
|
|
1848
|
+
const triangle = (a, b, c) => {
|
|
1849
|
+
if (a === b || b === c || c === a) return;
|
|
1850
|
+
const point2 = (i) => positions.slice(3 * i, 3 * i + 3);
|
|
1851
|
+
const A = point2(a), B = point2(b), C = point2(c);
|
|
1852
|
+
const u = B.map((v2, i) => v2 - A[i]), v = C.map((w, i) => w - A[i]);
|
|
1853
|
+
const area = Math.hypot(
|
|
1854
|
+
u[1] * v[2] - u[2] * v[1],
|
|
1855
|
+
u[2] * v[0] - u[0] * v[2],
|
|
1856
|
+
u[0] * v[1] - u[1] * v[0]
|
|
1857
|
+
);
|
|
1858
|
+
if (area > 1e-12) indices.push(a, b, c);
|
|
1859
|
+
};
|
|
1860
|
+
const ring = (radiusAt, zAt) => Array.from({ length: segments }, (_, i) => {
|
|
1861
|
+
const theta = i * 2 * Math.PI / segments, r = radiusAt(theta);
|
|
1862
|
+
return vertex(
|
|
1863
|
+
r * Math.cos(theta),
|
|
1864
|
+
r * Math.sin(theta),
|
|
1865
|
+
typeof zAt === "number" ? zAt : zAt(theta)
|
|
1866
|
+
);
|
|
1867
|
+
});
|
|
1868
|
+
const connect = (a, b) => {
|
|
1869
|
+
for (let i = 0; i < segments; i++) {
|
|
1870
|
+
const n = (i + 1) % segments;
|
|
1871
|
+
triangle(a[i], a[n], b[n]);
|
|
1872
|
+
triangle(a[i], b[n], b[i]);
|
|
1873
|
+
}
|
|
1874
|
+
};
|
|
1875
|
+
const cap = (a, z, up) => {
|
|
1876
|
+
const c = vertex(0, 0, z);
|
|
1877
|
+
for (let i = 0; i < segments; i++) {
|
|
1878
|
+
const n = (i + 1) % segments;
|
|
1879
|
+
up ? triangle(c, a[i], a[n]) : triangle(c, a[n], a[i]);
|
|
1880
|
+
}
|
|
1881
|
+
};
|
|
1882
|
+
let previous = [];
|
|
1883
|
+
const add = (radiusAt, zAt) => {
|
|
1884
|
+
const r = ring(radiusAt, zAt);
|
|
1885
|
+
if (previous.length) connect(previous, r);
|
|
1886
|
+
previous = r;
|
|
1887
|
+
return r;
|
|
1888
|
+
};
|
|
1889
|
+
const major = p.diameter / 2, minor = p.threadRootDiameter / 2, pitch = p.threadPitch;
|
|
1890
|
+
const shaftEnd = -p.underHeadRadius;
|
|
1891
|
+
const steps = p.showThreads ? Math.ceil((shaftEnd + p.length) / pitch * axial) : 1;
|
|
1892
|
+
if ((steps + 160) * segments > 4e5)
|
|
1893
|
+
throw new Error("Screw exceeds mesh resolution limit");
|
|
1894
|
+
const levels = /* @__PURE__ */ new Set([
|
|
1895
|
+
-p.length,
|
|
1896
|
+
-p.length + p.tipChamfer,
|
|
1897
|
+
shaftEnd
|
|
1898
|
+
]);
|
|
1899
|
+
if (p.showThreads)
|
|
1900
|
+
for (let i = 0; i <= steps; i++)
|
|
1901
|
+
levels.add(-p.length + (shaftEnd + p.length) * i / steps);
|
|
1902
|
+
for (const z of [...levels].sort((a, b) => a - b)) {
|
|
1903
|
+
const r = add((theta) => {
|
|
1904
|
+
const phase = (((z + p.length) / pitch - (p.threadHand === "right" ? 1 : -1) * theta / (2 * Math.PI)) % 1 + 1) % 1;
|
|
1905
|
+
const d = Math.min(phase, 1 - phase);
|
|
1906
|
+
const groove = Math.min(
|
|
1907
|
+
major - minor,
|
|
1908
|
+
Math.max(0, (d - 1 / 16) * pitch * Math.sqrt(3))
|
|
1909
|
+
);
|
|
1910
|
+
const thread = p.showThreads ? major - groove : major;
|
|
1911
|
+
return Math.min(
|
|
1912
|
+
thread,
|
|
1913
|
+
major - Math.max(0, p.tipChamfer - (z + p.length))
|
|
1914
|
+
);
|
|
1915
|
+
}, z);
|
|
1916
|
+
if (z === -p.length) cap(r, z, false);
|
|
1917
|
+
}
|
|
1918
|
+
add(() => major, shaftEnd);
|
|
1919
|
+
const filletCenterR = major + p.underHeadRadius;
|
|
1920
|
+
const filletCenterZ = shaftEnd;
|
|
1921
|
+
for (let i = 1; i <= 16; i++) {
|
|
1922
|
+
const angle = Math.PI - (Math.PI - Math.PI / 2) * i / 16;
|
|
1923
|
+
add(
|
|
1924
|
+
() => filletCenterR + p.underHeadRadius * Math.cos(angle),
|
|
1925
|
+
filletCenterZ + p.underHeadRadius * Math.sin(angle)
|
|
1926
|
+
);
|
|
1927
|
+
}
|
|
1928
|
+
const crown = (r) => p.headHeight - p.crownRadius + Math.sqrt(p.crownRadius * p.crownRadius - r * r);
|
|
1929
|
+
const rad265 = p.recessOuterWingAngle * Math.PI / 180, rad28 = p.recessInnerWingAngle * Math.PI / 180;
|
|
1930
|
+
const tg = (p.recessReferenceDiameter - p.recessG) / 2 / Math.tan(rad265);
|
|
1931
|
+
const totalDepth = tg + p.recessG / 2 * Math.tan(rad28);
|
|
1932
|
+
const tb = tg + (p.recessG - p.recessB) / 2 * Math.tan(rad28);
|
|
1933
|
+
const beta = p.recessBeta * Math.PI / 180;
|
|
1934
|
+
const alphaProjected = Math.atan(
|
|
1935
|
+
Math.tan(p.recessAlpha * Math.PI / 360) / Math.cos(beta)
|
|
1936
|
+
);
|
|
1937
|
+
const cornerProjected = Math.atan(
|
|
1938
|
+
Math.tan(46 * Math.PI / 180) / Math.cos(beta)
|
|
1939
|
+
);
|
|
1940
|
+
const dre = p.recessE / 2 / Math.tan(alphaProjected);
|
|
1941
|
+
const cornerRadius = (z, theta) => {
|
|
1942
|
+
const depth = p.recessReferencePlaneHeight - z;
|
|
1943
|
+
const b = p.recessB / 2 - (depth - tb) * Math.tan(beta);
|
|
1944
|
+
const delta = Math.abs(
|
|
1945
|
+
(theta - Math.PI / 4 + Math.PI / 4 + 4 * Math.PI) % (Math.PI / 2) - Math.PI / 4
|
|
1946
|
+
);
|
|
1947
|
+
const ca = Math.cos(delta), sa = Math.sin(delta);
|
|
1948
|
+
const tanA = Math.tan(alphaProjected), tanC = Math.tan(cornerProjected);
|
|
1949
|
+
const first = tanA * b / (tanA * ca - sa);
|
|
1950
|
+
const corner = first * ca <= b + dre ? first : (tanC * (b + dre) - p.recessE / 2) / (tanC * ca - sa);
|
|
1951
|
+
return Math.max(0, corner);
|
|
1952
|
+
};
|
|
1953
|
+
const recessRadius = (z, theta) => {
|
|
1954
|
+
const depth = p.recessReferencePlaneHeight - z;
|
|
1955
|
+
const outer = depth <= tg ? p.recessReferenceDiameter / 2 - depth * Math.tan(rad265) : (totalDepth - depth) / Math.tan(rad28);
|
|
1956
|
+
return Math.max(0, Math.min(outer, cornerRadius(z, theta)));
|
|
1957
|
+
};
|
|
1958
|
+
const entryRadius = p.recessRadius, sphereZ = p.headHeight - p.crownRadius, slope = Math.tan(rad265), line = p.recessReferenceDiameter / 2 - slope * p.recessReferencePlaneHeight + entryRadius / Math.cos(rad265), offset = slope * sphereZ + line, innerSphere = p.crownRadius - entryRadius, centerAboveSphere = (-slope * offset + Math.sqrt((1 + slope * slope) * innerSphere ** 2 - offset ** 2)) / (1 + slope * slope), entryCenterZ = sphereZ + centerAboveSphere, entryCenterR = slope * entryCenterZ + line, entryStart = Math.atan2(centerAboveSphere, entryCenterR), entryEnd = Math.PI - rad265, mouthR = entryCenterR + entryRadius * Math.cos(entryStart), wallZ = entryCenterZ + entryRadius * Math.sin(entryEnd);
|
|
1959
|
+
add(() => p.headDiameter / 2, 0);
|
|
1960
|
+
add(() => p.headDiameter / 2, crown(p.headDiameter / 2));
|
|
1961
|
+
const opening = Array.from({ length: segments }, (_, i) => {
|
|
1962
|
+
const theta = i * 2 * Math.PI / segments;
|
|
1963
|
+
let lo = 0, hi = mouthR;
|
|
1964
|
+
for (let n = 0; n < 48; n++) {
|
|
1965
|
+
const r = (lo + hi) / 2;
|
|
1966
|
+
if (r < cornerRadius(crown(r), theta)) lo = r;
|
|
1967
|
+
else hi = r;
|
|
1968
|
+
}
|
|
1969
|
+
return (lo + hi) / 2;
|
|
1970
|
+
});
|
|
1971
|
+
for (let n = 1; n <= 20; n++) {
|
|
1972
|
+
const r = (theta) => {
|
|
1973
|
+
const i = Math.round(theta * segments / (2 * Math.PI)) % segments;
|
|
1974
|
+
return p.headDiameter / 2 + (opening[i] - p.headDiameter / 2) * n / 20;
|
|
1975
|
+
};
|
|
1976
|
+
add(r, (theta) => crown(r(theta)));
|
|
1977
|
+
}
|
|
1978
|
+
const entryClips = Array.from({ length: segments }, (_, i) => {
|
|
1979
|
+
const theta = i * 2 * Math.PI / segments;
|
|
1980
|
+
const point2 = (angle2) => ({
|
|
1981
|
+
r: entryCenterR + entryRadius * Math.cos(angle2),
|
|
1982
|
+
z: entryCenterZ + entryRadius * Math.sin(angle2)
|
|
1983
|
+
});
|
|
1984
|
+
const outside = (angle2) => {
|
|
1985
|
+
const q = point2(angle2);
|
|
1986
|
+
return q.r > cornerRadius(q.z, theta);
|
|
1987
|
+
};
|
|
1988
|
+
if (!outside(entryStart)) return { angle: entryStart, ...point2(entryStart) };
|
|
1989
|
+
if (outside(entryEnd))
|
|
1990
|
+
return { angle: entryEnd, r: cornerRadius(wallZ, theta), z: wallZ };
|
|
1991
|
+
let lo = entryStart, hi = entryEnd;
|
|
1992
|
+
for (let n = 0; n < 48; n++) {
|
|
1993
|
+
const angle2 = (lo + hi) / 2;
|
|
1994
|
+
if (outside(angle2)) lo = angle2;
|
|
1995
|
+
else hi = angle2;
|
|
1996
|
+
}
|
|
1997
|
+
const angle = (lo + hi) / 2;
|
|
1998
|
+
return { angle, ...point2(angle) };
|
|
1999
|
+
});
|
|
2000
|
+
for (let n = 0; n <= 24; n++) {
|
|
2001
|
+
const angle = entryStart + (entryEnd - entryStart) * n / 24;
|
|
2002
|
+
const r = entryCenterR + entryRadius * Math.cos(angle), z = entryCenterZ + entryRadius * Math.sin(angle);
|
|
2003
|
+
const clip = (theta) => entryClips[Math.round(theta * segments / (2 * Math.PI)) % segments];
|
|
2004
|
+
add(
|
|
2005
|
+
(theta) => angle <= clip(theta).angle ? clip(theta).r : r,
|
|
2006
|
+
(theta) => angle <= clip(theta).angle ? clip(theta).z : z
|
|
2007
|
+
);
|
|
2008
|
+
}
|
|
2009
|
+
const floor = p.recessReferencePlaneHeight - totalDepth;
|
|
2010
|
+
const driveLevels = /* @__PURE__ */ new Set([p.recessReferencePlaneHeight - tg]);
|
|
2011
|
+
for (let n = 1; n < 48; n++)
|
|
2012
|
+
driveLevels.add(wallZ + (floor - wallZ) * n / 48);
|
|
2013
|
+
for (const z of [...driveLevels].filter((z2) => z2 < wallZ && z2 > floor).sort((a, b) => b - a)) {
|
|
2014
|
+
add((theta) => recessRadius(z, theta), z);
|
|
2015
|
+
}
|
|
2016
|
+
const point = vertex(0, 0, floor);
|
|
2017
|
+
for (let i = 0; i < segments; i++)
|
|
2018
|
+
triangle(point, previous[i], previous[(i + 1) % segments]);
|
|
2019
|
+
return { positions, indices };
|
|
2020
|
+
}
|
|
2021
|
+
|
|
2022
|
+
// lib/models/panscrew/PanScrew.tsx
|
|
2023
|
+
function createPanScrewGeom(input, options) {
|
|
2024
|
+
return indexedMeshToGeom3(createPanScrewMesh(input, options));
|
|
2025
|
+
}
|
|
2026
|
+
function PanScrew({ color = "#737e8f", ...props }) {
|
|
2027
|
+
return /* @__PURE__ */ jsx(Colorize, { color, children: /* @__PURE__ */ jsx(Custom, { geometry: createPanScrewGeom(props) }) });
|
|
2028
|
+
}
|
|
2029
|
+
|
|
2030
|
+
// lib/models/panscrew/register.tsx
|
|
2031
|
+
var model7 = defineModelRenderer({
|
|
2032
|
+
name: "panscrew",
|
|
2033
|
+
schema: panScrewModelDefinitionSchema,
|
|
2034
|
+
render: ({ fn, ...props }) => /* @__PURE__ */ jsx(PanScrew, { ...props }),
|
|
2035
|
+
pads: "none"
|
|
2036
|
+
});
|
|
2037
|
+
function register7(registry) {
|
|
2038
|
+
registry.register(model7);
|
|
2039
|
+
}
|
|
2040
|
+
|
|
2041
|
+
// lib/models/plainbushing/register.tsx
|
|
2042
|
+
import { plainBushingModelDefinitionSchema } from "@tscircuit/modelprinter";
|
|
2043
|
+
|
|
2044
|
+
// lib/models/plainbushing/mesh.ts
|
|
2045
|
+
import {
|
|
2046
|
+
getPlainBushingDimensions,
|
|
2047
|
+
plainBushingModelPropsSchema
|
|
2048
|
+
} from "@tscircuit/modelprinter";
|
|
2049
|
+
function createPlainBushingMesh(input) {
|
|
2050
|
+
const props = plainBushingModelPropsSchema.parse(input);
|
|
2051
|
+
const d = getPlainBushingDimensions(props);
|
|
2052
|
+
const ri = d.innerDiameter / 2;
|
|
2053
|
+
const ro = d.outerDiameter / 2;
|
|
2054
|
+
const c = props.edgeChamfer;
|
|
2055
|
+
const profile = c > 0 ? [
|
|
2056
|
+
[d.endOuterDiameter / 2, 0],
|
|
2057
|
+
[ro, c],
|
|
2058
|
+
[ro, d.length - c],
|
|
2059
|
+
[d.endOuterDiameter / 2, d.length],
|
|
2060
|
+
[d.endInnerDiameter / 2, d.length],
|
|
2061
|
+
[ri, d.length - c],
|
|
2062
|
+
[ri, c],
|
|
2063
|
+
[d.endInnerDiameter / 2, 0]
|
|
2064
|
+
] : [
|
|
2065
|
+
[ro, 0],
|
|
2066
|
+
[ro, d.length],
|
|
2067
|
+
[ri, d.length],
|
|
2068
|
+
[ri, 0]
|
|
2069
|
+
];
|
|
2070
|
+
const segments = 96;
|
|
2071
|
+
const positions = [];
|
|
2072
|
+
const indices = [];
|
|
2073
|
+
for (const [radius, z] of profile)
|
|
2074
|
+
for (let i = 0; i < segments; i++) {
|
|
2075
|
+
const angle = i * Math.PI * 2 / segments;
|
|
2076
|
+
positions.push(radius * Math.cos(angle), radius * Math.sin(angle), z);
|
|
2077
|
+
}
|
|
2078
|
+
for (let ring = 0; ring < profile.length; ring++) {
|
|
2079
|
+
const a = ring * segments;
|
|
2080
|
+
const b = (ring + 1) % profile.length * segments;
|
|
2081
|
+
for (let i = 0; i < segments; i++) {
|
|
2082
|
+
const next = (i + 1) % segments;
|
|
2083
|
+
indices.push(a + i, a + next, b + next, a + i, b + next, b + i);
|
|
2084
|
+
}
|
|
2085
|
+
}
|
|
2086
|
+
return { positions, indices };
|
|
2087
|
+
}
|
|
2088
|
+
|
|
2089
|
+
// lib/models/plainbushing/PlainBushing.tsx
|
|
2090
|
+
function createPlainBushingGeom(input) {
|
|
2091
|
+
return indexedMeshToGeom3(createPlainBushingMesh(input));
|
|
2092
|
+
}
|
|
2093
|
+
function PlainBushing({
|
|
2094
|
+
color = "#a18450",
|
|
2095
|
+
...props
|
|
2096
|
+
}) {
|
|
2097
|
+
return /* @__PURE__ */ jsx(Colorize, { color, children: /* @__PURE__ */ jsx(Custom, { geometry: createPlainBushingGeom(props) }) });
|
|
2098
|
+
}
|
|
2099
|
+
|
|
2100
|
+
// lib/models/plainbushing/register.tsx
|
|
2101
|
+
var model8 = defineModelRenderer({
|
|
2102
|
+
name: "plainbushing",
|
|
2103
|
+
schema: plainBushingModelDefinitionSchema,
|
|
2104
|
+
render: ({ fn, ...props }) => /* @__PURE__ */ jsx(PlainBushing, { ...props }),
|
|
2105
|
+
pads: "none"
|
|
2106
|
+
});
|
|
2107
|
+
function register8(registry) {
|
|
2108
|
+
registry.register(model8);
|
|
2109
|
+
}
|
|
2110
|
+
|
|
1822
2111
|
// lib/models/sheetmetal/register.tsx
|
|
1823
2112
|
import { sheetMetalModelDefinitionSchema } from "@tscircuit/modelprinter";
|
|
1824
2113
|
|
|
@@ -1976,14 +2265,14 @@ function SheetMetal({ color = "#737e8f", ...props }) {
|
|
|
1976
2265
|
}
|
|
1977
2266
|
|
|
1978
2267
|
// lib/models/sheetmetal/register.tsx
|
|
1979
|
-
var
|
|
2268
|
+
var model9 = defineModelRenderer({
|
|
1980
2269
|
name: "sheetmetal",
|
|
1981
2270
|
schema: sheetMetalModelDefinitionSchema,
|
|
1982
2271
|
render: ({ fn, ...props }) => /* @__PURE__ */ jsx(SheetMetal, { ...props }),
|
|
1983
2272
|
pads: "none"
|
|
1984
2273
|
});
|
|
1985
|
-
function
|
|
1986
|
-
registry.register(
|
|
2274
|
+
function register9(registry) {
|
|
2275
|
+
registry.register(model9);
|
|
1987
2276
|
}
|
|
1988
2277
|
|
|
1989
2278
|
// lib/models/spurgear/register.tsx
|
|
@@ -1998,14 +2287,14 @@ function SpurGear({ color = "#737e8f", ...props }) {
|
|
|
1998
2287
|
}
|
|
1999
2288
|
|
|
2000
2289
|
// lib/models/spurgear/register.tsx
|
|
2001
|
-
var
|
|
2290
|
+
var model10 = defineModelRenderer({
|
|
2002
2291
|
name: "spurgear",
|
|
2003
2292
|
schema: spurGearModelDefinitionSchema,
|
|
2004
2293
|
render: ({ fn, ...props }) => /* @__PURE__ */ jsx(SpurGear, { ...props }),
|
|
2005
2294
|
pads: "none"
|
|
2006
2295
|
});
|
|
2007
|
-
function
|
|
2008
|
-
registry.register(
|
|
2296
|
+
function register10(registry) {
|
|
2297
|
+
registry.register(model10);
|
|
2009
2298
|
}
|
|
2010
2299
|
|
|
2011
2300
|
// lib/models/wormgear/register.tsx
|
|
@@ -2197,14 +2486,14 @@ function WormGear({ color = "#737e8f", ...props }) {
|
|
|
2197
2486
|
}
|
|
2198
2487
|
|
|
2199
2488
|
// lib/models/wormgear/register.tsx
|
|
2200
|
-
var
|
|
2489
|
+
var model11 = defineModelRenderer({
|
|
2201
2490
|
name: "wormgear",
|
|
2202
2491
|
schema: wormGearModelDefinitionSchema,
|
|
2203
2492
|
render: ({ fn, ...props }) => /* @__PURE__ */ jsx(WormGear, { ...props }),
|
|
2204
2493
|
pads: "none"
|
|
2205
2494
|
});
|
|
2206
|
-
function
|
|
2207
|
-
registry.register(
|
|
2495
|
+
function register11(registry) {
|
|
2496
|
+
registry.register(model11);
|
|
2208
2497
|
}
|
|
2209
2498
|
|
|
2210
2499
|
// lib/generated/model-renderers.ts
|
|
@@ -2218,6 +2507,8 @@ function registerAllModelRenderers(registry) {
|
|
|
2218
2507
|
register7(registry);
|
|
2219
2508
|
register8(registry);
|
|
2220
2509
|
register9(registry);
|
|
2510
|
+
register10(registry);
|
|
2511
|
+
register11(registry);
|
|
2221
2512
|
}
|
|
2222
2513
|
|
|
2223
2514
|
// lib/default-model-registry.ts
|
|
@@ -9774,10 +10065,10 @@ var SOT143 = ({ footprint = "sot143" }) => {
|
|
|
9774
10065
|
var Footprinter3d = ({ footprint }) => {
|
|
9775
10066
|
const modelFn = mp3.string(footprint.split("_", 1)[0]).params().fn;
|
|
9776
10067
|
if (mp3.getModelNames().includes(modelFn)) {
|
|
9777
|
-
const
|
|
9778
|
-
const renderer = modelRendererRegistry.get(
|
|
10068
|
+
const model12 = mp3.string(footprint).json();
|
|
10069
|
+
const renderer = modelRendererRegistry.get(model12.fn);
|
|
9779
10070
|
if (renderer) {
|
|
9780
|
-
return renderer.render(
|
|
10071
|
+
return renderer.render(model12);
|
|
9781
10072
|
}
|
|
9782
10073
|
}
|
|
9783
10074
|
let normalizedFootprint = footprint;
|
|
@@ -10737,6 +11028,8 @@ export {
|
|
|
10737
11028
|
NEMA23,
|
|
10738
11029
|
NEMA8,
|
|
10739
11030
|
NemaMotor,
|
|
11031
|
+
PanScrew,
|
|
11032
|
+
PlainBushing,
|
|
10740
11033
|
SheetMetal,
|
|
10741
11034
|
SpurGear,
|
|
10742
11035
|
WormGear,
|
|
@@ -10750,6 +11043,10 @@ export {
|
|
|
10750
11043
|
createHexSocketBoltGeom,
|
|
10751
11044
|
createHexSocketBoltMesh,
|
|
10752
11045
|
createJSCADRenderer,
|
|
11046
|
+
createPanScrewGeom,
|
|
11047
|
+
createPanScrewMesh,
|
|
11048
|
+
createPlainBushingGeom,
|
|
11049
|
+
createPlainBushingMesh,
|
|
10753
11050
|
createSheetMetalGeom,
|
|
10754
11051
|
createSheetMetalMesh,
|
|
10755
11052
|
createSpurGearGeom,
|