pcb-scene3d-viewer 1.0.1

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 (65) hide show
  1. package/AGENTS.md +67 -0
  2. package/COMMERCIAL-LICENSE.md +15 -0
  3. package/CONTRIBUTING.md +14 -0
  4. package/LICENSE +19 -0
  5. package/LICENSES/AGPL-3.0-or-later.txt +235 -0
  6. package/LICENSES/CC-BY-SA-4.0.txt +170 -0
  7. package/LICENSES/LGPL-2.1-or-later.txt +176 -0
  8. package/LICENSES/LicenseRef-PolyForm-Noncommercial-1.0.0.txt +131 -0
  9. package/NOTICE.md +36 -0
  10. package/README.md +128 -0
  11. package/REUSE.toml +16 -0
  12. package/docs/api.md +148 -0
  13. package/docs/circuitjson.md +190 -0
  14. package/docs/model-format.md +117 -0
  15. package/docs/testing.md +23 -0
  16. package/package.json +65 -0
  17. package/spec/library-scope.md +36 -0
  18. package/src/PcbModelArchiveExporter.mjs +320 -0
  19. package/src/PcbScene3dArcUtils.mjs +27 -0
  20. package/src/PcbScene3dBoardAssemblyPlacement.mjs +36 -0
  21. package/src/PcbScene3dBoardAssemblyPresentation.mjs +859 -0
  22. package/src/PcbScene3dBoardEdgeCutoutBuilder.mjs +537 -0
  23. package/src/PcbScene3dBoardMaterialPalette.mjs +40 -0
  24. package/src/PcbScene3dBoardShapeFactory.mjs +895 -0
  25. package/src/PcbScene3dBoardSolderMaskFactory.mjs +613 -0
  26. package/src/PcbScene3dCameraRig.mjs +168 -0
  27. package/src/PcbScene3dCircuitJsonAdapter.mjs +545 -0
  28. package/src/PcbScene3dController.mjs +956 -0
  29. package/src/PcbScene3dCopperDetailFilter.mjs +490 -0
  30. package/src/PcbScene3dCopperFactory.mjs +559 -0
  31. package/src/PcbScene3dCopperTextFactory.mjs +534 -0
  32. package/src/PcbScene3dCutoutGeometryFilter.mjs +873 -0
  33. package/src/PcbScene3dDetailCoordinateNormalizer.mjs +65 -0
  34. package/src/PcbScene3dDrillCutoutFilter.mjs +224 -0
  35. package/src/PcbScene3dDrillPathFactory.mjs +362 -0
  36. package/src/PcbScene3dDrillVoidFactory.mjs +268 -0
  37. package/src/PcbScene3dExternalModelLoadOrder.mjs +54 -0
  38. package/src/PcbScene3dExternalModels.mjs +968 -0
  39. package/src/PcbScene3dFallbackVisibility.mjs +82 -0
  40. package/src/PcbScene3dInteractionHints.mjs +56 -0
  41. package/src/PcbScene3dMountRig.mjs +53 -0
  42. package/src/PcbScene3dOutlineBuilder.mjs +210 -0
  43. package/src/PcbScene3dPadFactory.mjs +553 -0
  44. package/src/PcbScene3dPresetState.mjs +48 -0
  45. package/src/PcbScene3dRenderGroupVisibility.mjs +134 -0
  46. package/src/PcbScene3dRuntime.mjs +996 -0
  47. package/src/PcbScene3dRuntimeBoardMeshes.mjs +99 -0
  48. package/src/PcbScene3dSelectionStyler.mjs +252 -0
  49. package/src/PcbScene3dShapePathFactory.mjs +220 -0
  50. package/src/PcbScene3dShellRenderer.mjs +131 -0
  51. package/src/PcbScene3dSilkscreenFactory.mjs +854 -0
  52. package/src/PcbScene3dSilkscreenStrokeWidthResolver.mjs +81 -0
  53. package/src/PcbScene3dStepLoader.mjs +611 -0
  54. package/src/PcbScene3dStrokeFont.mjs +671 -0
  55. package/src/PcbScene3dStrokeGeometryBuilder.mjs +322 -0
  56. package/src/PcbScene3dText.mjs +99 -0
  57. package/src/PcbScene3dTrueTypeTextFactory.mjs +885 -0
  58. package/src/PcbScene3dViaFactory.mjs +176 -0
  59. package/src/PcbScene3dViewCompensation.mjs +109 -0
  60. package/src/PcbScene3dViewScale.mjs +24 -0
  61. package/src/PcbScene3dViewportResize.mjs +35 -0
  62. package/src/PcbScene3dWorkerClient.mjs +123 -0
  63. package/src/index.mjs +1 -0
  64. package/src/scene3d.mjs +44 -0
  65. package/src/styles/scene3d.css +295 -0
@@ -0,0 +1,134 @@
1
+ import { PcbScene3dFallbackVisibility } from './PcbScene3dFallbackVisibility.mjs'
2
+
3
+ /**
4
+ * Applies visibility toggles to the PCB 3D runtime render groups.
5
+ */
6
+ export class PcbScene3dRenderGroupVisibility {
7
+ /** @type {number} */
8
+ static #BOARD_ASSEMBLY_DETAIL_RENDER_ORDER = 40
9
+
10
+ /**
11
+ * Applies the active 3D detail visibility state.
12
+ * @param {{ groups: Map<string, any>, toggles: { 'external-models': boolean, 'fallback-bodies': boolean, copper: boolean }, fallbackBodyRoots: Map<string, Set<any>>, loadedExternalModelDesignators: Set<string>, hasLoadedBoardAssemblyModel?: boolean }} state Visibility state.
13
+ * @returns {void}
14
+ */
15
+ static apply(state) {
16
+ const boardAssemblyActive =
17
+ Boolean(state?.hasLoadedBoardAssemblyModel) &&
18
+ Boolean(state?.toggles?.['external-models'])
19
+
20
+ PcbScene3dRenderGroupVisibility.#setVisible(
21
+ state?.groups?.get('board'),
22
+ true
23
+ )
24
+ PcbScene3dRenderGroupVisibility.#setVisible(
25
+ state?.groups?.get('silkscreen'),
26
+ true
27
+ )
28
+ PcbScene3dRenderGroupVisibility.#setVisible(
29
+ state?.groups?.get('copper'),
30
+ Boolean(state?.toggles?.copper)
31
+ )
32
+ PcbScene3dRenderGroupVisibility.#applyDetailOverlayPresentation(
33
+ state?.groups?.get('silkscreen'),
34
+ boardAssemblyActive
35
+ )
36
+ PcbScene3dRenderGroupVisibility.#applyDetailOverlayPresentation(
37
+ state?.groups?.get('copper'),
38
+ boardAssemblyActive
39
+ )
40
+ PcbScene3dRenderGroupVisibility.#setVisible(
41
+ state?.groups?.get('fallback-bodies'),
42
+ Boolean(state?.toggles?.['fallback-bodies']) && !boardAssemblyActive
43
+ )
44
+
45
+ PcbScene3dFallbackVisibility.applyVisibility(
46
+ state?.fallbackBodyRoots,
47
+ state?.loadedExternalModelDesignators,
48
+ state?.toggles
49
+ )
50
+ PcbScene3dRenderGroupVisibility.#setVisible(
51
+ state?.groups?.get('external-models'),
52
+ Boolean(state?.toggles?.['external-models'])
53
+ )
54
+ }
55
+
56
+ /**
57
+ * Sets group visibility when a group is available.
58
+ * @param {{ visible?: boolean } | undefined} group Render group.
59
+ * @param {boolean} visible Visibility value.
60
+ * @returns {void}
61
+ */
62
+ static #setVisible(group, visible) {
63
+ if (group) {
64
+ group.visible = visible
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Draws PCB-derived detail above a board assembly substrate.
70
+ * @param {any} group Detail render group.
71
+ * @param {boolean} active Whether overlay rendering is active.
72
+ * @returns {void}
73
+ */
74
+ static #applyDetailOverlayPresentation(group, active) {
75
+ PcbScene3dRenderGroupVisibility.#traverseGroup(group, (object) => {
76
+ PcbScene3dRenderGroupVisibility.#applyObjectRenderOrder(
77
+ object,
78
+ active
79
+ )
80
+ })
81
+ }
82
+
83
+ /**
84
+ * Applies or restores render ordering for one render object.
85
+ * @param {any} object Render object.
86
+ * @param {boolean} active Whether overlay rendering is active.
87
+ * @returns {void}
88
+ */
89
+ static #applyObjectRenderOrder(object, active) {
90
+ if (!object) {
91
+ return
92
+ }
93
+
94
+ object.userData = object.userData || {}
95
+ if (active) {
96
+ if (object.userData.scene3dOriginalRenderOrder === undefined) {
97
+ object.userData.scene3dOriginalRenderOrder = Number(
98
+ object.renderOrder || 0
99
+ )
100
+ }
101
+ object.renderOrder =
102
+ PcbScene3dRenderGroupVisibility.#BOARD_ASSEMBLY_DETAIL_RENDER_ORDER
103
+ return
104
+ }
105
+
106
+ if (object.userData.scene3dOriginalRenderOrder !== undefined) {
107
+ object.renderOrder = object.userData.scene3dOriginalRenderOrder
108
+ delete object.userData.scene3dOriginalRenderOrder
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Traverses a group tree, including simple test doubles.
114
+ * @param {any} group Render group.
115
+ * @param {(object: any) => void} visitor Visitor callback.
116
+ * @returns {void}
117
+ */
118
+ static #traverseGroup(group, visitor) {
119
+ if (!group) {
120
+ return
121
+ }
122
+
123
+ if (typeof group.traverse === 'function') {
124
+ group.traverse(visitor)
125
+ return
126
+ }
127
+
128
+ visitor(group)
129
+ ;(Array.isArray(group.children) ? group.children : []).forEach(
130
+ (child) =>
131
+ PcbScene3dRenderGroupVisibility.#traverseGroup(child, visitor)
132
+ )
133
+ }
134
+ }