@tscircuit/3d-viewer 0.0.373 → 0.0.375

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.
Files changed (2) hide show
  1. package/dist/index.js +53 -16
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -14416,7 +14416,28 @@ var ContainerWithTooltip_default = ContainerWithTooltip;
14416
14416
 
14417
14417
  // src/hooks/use-global-obj-loader.ts
14418
14418
  import { useState as useState2, useEffect as useEffect3 } from "react";
14419
- import { MTLLoader, OBJLoader, VRMLLoader } from "three-stdlib";
14419
+ import { MTLLoader, OBJLoader } from "three-stdlib";
14420
+
14421
+ // src/utils/vrml.ts
14422
+ import { VRMLLoader } from "three-stdlib";
14423
+ function sanitizeVrmlIdentifiers(text) {
14424
+ return text.replace(/(DEF|USE)\s+([^\s]+)/g, (match, type, name) => {
14425
+ return `${type} ${name.replace(/-/g, "_")}`;
14426
+ });
14427
+ }
14428
+ async function loadVrml(url) {
14429
+ const response = await fetch(url);
14430
+ if (!response.ok) {
14431
+ throw new Error(
14432
+ `Failed to fetch "${url}": ${response.status} ${response.statusText}`
14433
+ );
14434
+ }
14435
+ const text = await response.text();
14436
+ const loader = new VRMLLoader();
14437
+ return loader.parse(sanitizeVrmlIdentifiers(text), url);
14438
+ }
14439
+
14440
+ // src/hooks/use-global-obj-loader.ts
14420
14441
  if (typeof window !== "undefined" && !window.TSCIRCUIT_OBJ_LOADER_CACHE) {
14421
14442
  window.TSCIRCUIT_OBJ_LOADER_CACHE = /* @__PURE__ */ new Map();
14422
14443
  }
@@ -14430,8 +14451,7 @@ function useGlobalObjLoader(url) {
14430
14451
  async function loadAndParseObj() {
14431
14452
  try {
14432
14453
  if (cleanUrl.endsWith(".wrl")) {
14433
- const loader = new VRMLLoader();
14434
- return await loader.loadAsync(cleanUrl);
14454
+ return await loadVrml(cleanUrl);
14435
14455
  }
14436
14456
  const response = await fetch(cleanUrl);
14437
14457
  if (!response.ok) {
@@ -14508,7 +14528,8 @@ function MixedStlModel({
14508
14528
  rotation: rotation2,
14509
14529
  onHover,
14510
14530
  onUnhover,
14511
- isHovered
14531
+ isHovered,
14532
+ scale: scale2
14512
14533
  }) {
14513
14534
  const obj = useGlobalObjLoader(url);
14514
14535
  const { rootObject } = useThree();
@@ -14548,6 +14569,9 @@ function MixedStlModel({
14548
14569
  model.rotation.copy(rotation2);
14549
14570
  }
14550
14571
  }
14572
+ if (scale2 !== void 0) {
14573
+ model.scale.setScalar(scale2);
14574
+ }
14551
14575
  }, [
14552
14576
  model,
14553
14577
  Array.isArray(position) ? position[0] : position?.x,
@@ -14555,7 +14579,8 @@ function MixedStlModel({
14555
14579
  Array.isArray(position) ? position[2] : position?.z,
14556
14580
  Array.isArray(rotation2) ? rotation2[0] : rotation2?.x,
14557
14581
  Array.isArray(rotation2) ? rotation2[1] : rotation2?.y,
14558
- Array.isArray(rotation2) ? rotation2[2] : rotation2?.z
14582
+ Array.isArray(rotation2) ? rotation2[2] : rotation2?.z,
14583
+ scale2
14559
14584
  ]);
14560
14585
  if (obj instanceof Error) {
14561
14586
  throw obj;
@@ -14582,7 +14607,8 @@ function GltfModel({
14582
14607
  rotation: rotation2,
14583
14608
  onHover,
14584
14609
  onUnhover,
14585
- isHovered
14610
+ isHovered,
14611
+ scale: scale2
14586
14612
  }) {
14587
14613
  const { rootObject } = useThree();
14588
14614
  const [model, setModel] = useState3(null);
@@ -14609,6 +14635,7 @@ function GltfModel({
14609
14635
  if (!model) return;
14610
14636
  if (position) model.position.fromArray(position);
14611
14637
  if (rotation2) model.rotation.fromArray(rotation2);
14638
+ if (scale2 !== void 0) model.scale.setScalar(scale2);
14612
14639
  }, [
14613
14640
  model,
14614
14641
  position?.[0],
@@ -14616,7 +14643,8 @@ function GltfModel({
14616
14643
  position?.[2],
14617
14644
  rotation2?.[0],
14618
14645
  rotation2?.[1],
14619
- rotation2?.[2]
14646
+ rotation2?.[2],
14647
+ scale2
14620
14648
  ]);
14621
14649
  useEffect5(() => {
14622
14650
  if (!rootObject || !model) return;
@@ -16608,6 +16636,7 @@ var cad_component = z101.object({
16608
16636
  model_glb_url: z101.string().optional(),
16609
16637
  model_step_url: z101.string().optional(),
16610
16638
  model_wrl_url: z101.string().optional(),
16639
+ model_unit_to_mm_scale_factor: z101.number().optional(),
16611
16640
  model_jscad: z101.any().optional()
16612
16641
  }).describe("Defines a component on the PCB");
16613
16642
  expectTypesMatch(true);
@@ -25644,7 +25673,8 @@ var JscadModel = ({
25644
25673
  rotationOffset,
25645
25674
  onHover,
25646
25675
  onUnhover,
25647
- isHovered
25676
+ isHovered,
25677
+ scale: scale2
25648
25678
  }) => {
25649
25679
  const { rootObject } = useThree();
25650
25680
  const { threeGeom, material } = useMemo4(() => {
@@ -25675,6 +25705,7 @@ var JscadModel = ({
25675
25705
  if (!mesh) return;
25676
25706
  if (positionOffset) mesh.position.fromArray(positionOffset);
25677
25707
  if (rotationOffset) mesh.rotation.fromArray(rotationOffset);
25708
+ if (scale2 !== void 0) mesh.scale.setScalar(scale2);
25678
25709
  }, [
25679
25710
  mesh,
25680
25711
  positionOffset?.[0],
@@ -25682,7 +25713,8 @@ var JscadModel = ({
25682
25713
  positionOffset?.[2],
25683
25714
  rotationOffset?.[0],
25684
25715
  rotationOffset?.[1],
25685
- rotationOffset?.[2]
25716
+ rotationOffset?.[2],
25717
+ scale2
25686
25718
  ]);
25687
25719
  useMemo4(() => {
25688
25720
  if (!material) return;
@@ -25717,7 +25749,8 @@ var FootprinterModel = ({
25717
25749
  rotationOffset,
25718
25750
  onHover,
25719
25751
  onUnhover,
25720
- isHovered
25752
+ isHovered,
25753
+ scale: scale2
25721
25754
  }) => {
25722
25755
  const { rootObject } = useThree();
25723
25756
  const group = useMemo5(() => {
@@ -25753,6 +25786,7 @@ var FootprinterModel = ({
25753
25786
  if (!group) return;
25754
25787
  if (positionOffset) group.position.fromArray(positionOffset);
25755
25788
  if (rotationOffset) group.rotation.fromArray(rotationOffset);
25789
+ if (scale2 !== void 0) group.scale.setScalar(scale2);
25756
25790
  }, [
25757
25791
  group,
25758
25792
  positionOffset?.[0],
@@ -25760,7 +25794,8 @@ var FootprinterModel = ({
25760
25794
  positionOffset?.[2],
25761
25795
  rotationOffset?.[0],
25762
25796
  rotationOffset?.[1],
25763
- rotationOffset?.[2]
25797
+ rotationOffset?.[2],
25798
+ scale2
25764
25799
  ]);
25765
25800
  useEffect7(() => {
25766
25801
  if (!group) return;
@@ -25872,6 +25907,7 @@ var AnyCadComponent = ({
25872
25907
  cad_component2.position.z
25873
25908
  ] : void 0,
25874
25909
  rotation: rotationOffset,
25910
+ scale: cad_component2.model_unit_to_mm_scale_factor,
25875
25911
  onHover: handleHover,
25876
25912
  onUnhover: handleUnhover,
25877
25913
  isHovered
@@ -25889,6 +25925,7 @@ var AnyCadComponent = ({
25889
25925
  cad_component2.position.z
25890
25926
  ] : void 0,
25891
25927
  rotation: rotationOffset,
25928
+ scale: cad_component2.model_unit_to_mm_scale_factor,
25892
25929
  onHover: handleHover,
25893
25930
  onUnhover: handleUnhover,
25894
25931
  isHovered
@@ -25901,6 +25938,7 @@ var AnyCadComponent = ({
25901
25938
  {
25902
25939
  jscadPlan: cad_component2.model_jscad,
25903
25940
  rotationOffset,
25941
+ scale: cad_component2.model_unit_to_mm_scale_factor,
25904
25942
  onHover: handleHover,
25905
25943
  onUnhover: handleUnhover,
25906
25944
  isHovered
@@ -25918,6 +25956,7 @@ var AnyCadComponent = ({
25918
25956
  ] : void 0,
25919
25957
  rotationOffset,
25920
25958
  footprint: cad_component2.footprinter_string,
25959
+ scale: cad_component2.model_unit_to_mm_scale_factor,
25921
25960
  onHover: handleHover,
25922
25961
  onUnhover: handleUnhover,
25923
25962
  isHovered
@@ -25959,7 +25998,7 @@ import * as THREE11 from "three";
25959
25998
  // package.json
25960
25999
  var package_default = {
25961
26000
  name: "@tscircuit/3d-viewer",
25962
- version: "0.0.372",
26001
+ version: "0.0.374",
25963
26002
  main: "./dist/index.js",
25964
26003
  module: "./dist/index.js",
25965
26004
  type: "module",
@@ -26015,7 +26054,7 @@ var package_default = {
26015
26054
  "@vitejs/plugin-react": "^4.3.4",
26016
26055
  "bun-match-svg": "^0.0.9",
26017
26056
  "bun-types": "1.2.1",
26018
- "circuit-json": "0.0.248",
26057
+ "circuit-json": "0.0.249",
26019
26058
  "circuit-to-svg": "^0.0.179",
26020
26059
  debug: "^4.4.0",
26021
26060
  "jscad-electronics": "^0.0.38",
@@ -30046,7 +30085,6 @@ import * as THREE25 from "three";
30046
30085
  import { GLTFLoader as GLTFLoader2 } from "three/examples/jsm/loaders/GLTFLoader.js";
30047
30086
  import { OBJLoader as OBJLoader2 } from "three/examples/jsm/loaders/OBJLoader.js";
30048
30087
  import { STLLoader as STLLoader2 } from "three/examples/jsm/loaders/STLLoader.js";
30049
- import { VRMLLoader as VRMLLoader2 } from "three/examples/jsm/loaders/VRMLLoader.js";
30050
30088
  async function load3DModel(url) {
30051
30089
  if (url.endsWith(".stl")) {
30052
30090
  const loader = new STLLoader2();
@@ -30063,8 +30101,7 @@ async function load3DModel(url) {
30063
30101
  return await loader.loadAsync(url);
30064
30102
  }
30065
30103
  if (url.endsWith(".wrl")) {
30066
- const loader = new VRMLLoader2();
30067
- return await loader.loadAsync(url);
30104
+ return await loadVrml(url);
30068
30105
  }
30069
30106
  if (url.endsWith(".gltf") || url.endsWith(".glb")) {
30070
30107
  const loader = new GLTFLoader2();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tscircuit/3d-viewer",
3
- "version": "0.0.373",
3
+ "version": "0.0.375",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.js",
6
6
  "type": "module",
@@ -56,7 +56,7 @@
56
56
  "@vitejs/plugin-react": "^4.3.4",
57
57
  "bun-match-svg": "^0.0.9",
58
58
  "bun-types": "1.2.1",
59
- "circuit-json": "0.0.248",
59
+ "circuit-json": "0.0.249",
60
60
  "circuit-to-svg": "^0.0.179",
61
61
  "debug": "^4.4.0",
62
62
  "jscad-electronics": "^0.0.38",