@2112-lab/central-plant 0.1.4 → 0.1.6

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 (88) hide show
  1. package/dist/bundle/index.js +33146 -1
  2. package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js +432 -1
  3. package/dist/cjs/node_modules/@2112-lab/pathfinder/dist/index.esm.js +1448 -1
  4. package/dist/cjs/node_modules/three/examples/jsm/controls/OrbitControls.js +1853 -1
  5. package/dist/cjs/node_modules/three/examples/jsm/exporters/GLTFExporter.js +3537 -1
  6. package/dist/cjs/node_modules/three/examples/jsm/exporters/OBJExporter.js +305 -1
  7. package/dist/cjs/node_modules/three/examples/jsm/exporters/PLYExporter.js +542 -1
  8. package/dist/cjs/node_modules/three/examples/jsm/exporters/STLExporter.js +218 -1
  9. package/dist/cjs/node_modules/three/examples/jsm/loaders/DRACOLoader.js +683 -1
  10. package/dist/cjs/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4811 -1
  11. package/dist/cjs/node_modules/three/examples/jsm/loaders/RGBELoader.js +480 -1
  12. package/dist/cjs/node_modules/three/examples/jsm/renderers/CSS2DRenderer.js +309 -1
  13. package/dist/cjs/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +120 -1
  14. package/dist/cjs/src/analysis/analysis.js +560 -1
  15. package/dist/cjs/src/analysis/testing.js +958 -1
  16. package/dist/cjs/src/core/centralPlant.js +1149 -1
  17. package/dist/cjs/src/core/debugLogger.js +175 -1
  18. package/dist/cjs/src/core/mathUtils.js +574 -1
  19. package/dist/cjs/src/core/nameUtils.js +93 -1
  20. package/dist/cjs/src/data/export.js +716 -1
  21. package/dist/cjs/src/data/import.js +380 -1
  22. package/dist/cjs/src/data/numerics.js +522 -1
  23. package/dist/cjs/src/helpers/sceneHelper.js +572 -1
  24. package/dist/cjs/src/index.js +69 -1
  25. package/dist/cjs/src/managers/components/animationManager.js +123 -1
  26. package/dist/cjs/src/managers/components/componentManager.js +332 -1
  27. package/dist/cjs/src/managers/components/pathfindingManager.js +1441 -1
  28. package/dist/cjs/src/managers/controls/TransformControls.js +1063 -1
  29. package/dist/cjs/src/managers/controls/cameraControlsManager.js +79 -1
  30. package/dist/cjs/src/managers/controls/dragDropManager.js +1026 -1
  31. package/dist/cjs/src/managers/controls/keyboardControlsManager.js +395 -1
  32. package/dist/cjs/src/managers/controls/transformControlsManager.js +1807 -1
  33. package/dist/cjs/src/managers/environment/environmentManager.js +714 -1
  34. package/dist/cjs/src/managers/environment/textureConfig.js +229 -1
  35. package/dist/cjs/src/managers/scene/sceneExportManager.js +264 -1
  36. package/dist/cjs/src/managers/scene/sceneInitializationManager.js +346 -1
  37. package/dist/cjs/src/managers/scene/sceneOperationsManager.js +1509 -1
  38. package/dist/cjs/src/managers/scene/sceneTooltipsManager.js +661 -1
  39. package/dist/cjs/src/managers/system/disposalManager.js +444 -1
  40. package/dist/cjs/src/managers/system/hotReloadManager.js +291 -1
  41. package/dist/cjs/src/managers/system/performanceMonitor.js +863 -1
  42. package/dist/cjs/src/rendering/modelPreloader.js +369 -1
  43. package/dist/cjs/src/rendering/rendering2D.js +631 -1
  44. package/dist/cjs/src/rendering/rendering3D.js +685 -1
  45. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +396 -1
  46. package/dist/esm/node_modules/@2112-lab/pathfinder/dist/index.esm.js +1444 -1
  47. package/dist/esm/node_modules/three/examples/jsm/controls/OrbitControls.js +1849 -1
  48. package/dist/esm/node_modules/three/examples/jsm/exporters/GLTFExporter.js +3533 -1
  49. package/dist/esm/node_modules/three/examples/jsm/exporters/OBJExporter.js +301 -1
  50. package/dist/esm/node_modules/three/examples/jsm/exporters/PLYExporter.js +538 -1
  51. package/dist/esm/node_modules/three/examples/jsm/exporters/STLExporter.js +214 -1
  52. package/dist/esm/node_modules/three/examples/jsm/loaders/DRACOLoader.js +679 -1
  53. package/dist/esm/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4807 -1
  54. package/dist/esm/node_modules/three/examples/jsm/loaders/RGBELoader.js +476 -1
  55. package/dist/esm/node_modules/three/examples/jsm/renderers/CSS2DRenderer.js +304 -1
  56. package/dist/esm/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +116 -1
  57. package/dist/esm/src/analysis/analysis.js +536 -1
  58. package/dist/esm/src/analysis/testing.js +954 -1
  59. package/dist/esm/src/core/centralPlant.js +1144 -1
  60. package/dist/esm/src/core/debugLogger.js +167 -1
  61. package/dist/esm/src/core/mathUtils.js +570 -1
  62. package/dist/esm/src/core/nameUtils.js +87 -1
  63. package/dist/esm/src/data/export.js +712 -1
  64. package/dist/esm/src/data/import.js +356 -1
  65. package/dist/esm/src/data/numerics.js +518 -1
  66. package/dist/esm/src/helpers/sceneHelper.js +547 -1
  67. package/dist/esm/src/index.js +35 -1
  68. package/dist/esm/src/managers/components/animationManager.js +119 -1
  69. package/dist/esm/src/managers/components/componentManager.js +328 -1
  70. package/dist/esm/src/managers/components/pathfindingManager.js +1417 -1
  71. package/dist/esm/src/managers/controls/TransformControls.js +1057 -1
  72. package/dist/esm/src/managers/controls/cameraControlsManager.js +75 -1
  73. package/dist/esm/src/managers/controls/dragDropManager.js +1002 -1
  74. package/dist/esm/src/managers/controls/keyboardControlsManager.js +371 -1
  75. package/dist/esm/src/managers/controls/transformControlsManager.js +1782 -1
  76. package/dist/esm/src/managers/environment/environmentManager.js +690 -1
  77. package/dist/esm/src/managers/environment/textureConfig.js +202 -1
  78. package/dist/esm/src/managers/scene/sceneExportManager.js +260 -1
  79. package/dist/esm/src/managers/scene/sceneInitializationManager.js +322 -1
  80. package/dist/esm/src/managers/scene/sceneOperationsManager.js +1485 -1
  81. package/dist/esm/src/managers/scene/sceneTooltipsManager.js +637 -1
  82. package/dist/esm/src/managers/system/disposalManager.js +440 -1
  83. package/dist/esm/src/managers/system/hotReloadManager.js +287 -1
  84. package/dist/esm/src/managers/system/performanceMonitor.js +858 -1
  85. package/dist/esm/src/rendering/modelPreloader.js +364 -1
  86. package/dist/esm/src/rendering/rendering2D.js +627 -1
  87. package/dist/esm/src/rendering/rendering3D.js +661 -1
  88. package/package.json +1 -1
@@ -1 +1,202 @@
1
- import{asyncToGenerator as e,regenerator as r,objectSpread2 as t,construct as n,toConsumableArray as o,slicedToArray as a}from"../../../_virtual/_rollupPluginBabelHelpers.js";import*as s from"three";var u={light_metal:{path:"/textures/gravel_embedded_concrete_1k",files:{diffuse:"diffuse.jpg",normal:"normal.jpg",roughness:"rough.jpg"},repeat:{x:2,y:2},materialProps:{color:12105912,metalness:.3,roughness:.3,normalScale:[.4,.4],clearcoat:.3,clearcoatRoughness:.2,envMapIntensity:1.6,reflectivity:.5}},brick:{path:"/textures/pavement_03_1k",files:{diffuse:"diffuse.jpg",normal:"normal.jpg",roughness:"rough.jpg"},repeat:{x:7.5,y:.75},materialProps:{color:10061960,roughness:.9,metalness:.1,normalScale:[1.5,1.5],bumpScale:.05,clearcoat:.05,clearcoatRoughness:.4}},gravel_embedded_concrete:{path:"/textures/gravel_embedded_concrete_1k",files:{diffuse:"diffuse.jpg",normal:"normal.jpg",roughness:"rough.jpg"},repeat:{x:7,y:7},materialProps:{color:6710886,metalness:0,roughness:1,normalScale:[1,1]}}};function c(e,r){return i.apply(this,arguments)}function i(){return i=e(r().m(function t(n,o){var c,i,l,f,m;return r().w(function(t){for(;;)switch(t.n){case 0:if(c=u[n]){t.n=1;break}throw new Error('Texture set "'.concat(n,'" not found'));case 1:return i=function(e){return new Promise(function(r,t){o.load(e,function(e){r(e)},void 0,function(e){t(e)})})},l=Object.entries(c.files).map(function(){var t=e(r().m(function e(t){var n,o,s,u,l;return r().w(function(e){for(;;)switch(e.n){case 0:return n=a(t,2),o=n[0],s=n[1],u="".concat(c.path,"/").concat(s),e.n=1,i(u);case 1:return l=e.v,e.a(2,[o,l])}},e)}));return function(e){return t.apply(this,arguments)}}()),t.n=2,Promise.all(l);case 2:return f=t.v,m=Object.fromEntries(f),Object.values(m).forEach(function(e){e.wrapS=e.wrapT=s.RepeatWrapping,e.repeat.set(c.repeat.x,c.repeat.y)}),t.a(2,{textures:m,config:c})}},t)})),i.apply(this,arguments)}function l(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=e.textures,u=e.config,c=t(t({map:a.diffuse,normalMap:a.normal,roughnessMap:a.roughness},u.materialProps),r);return c.normalScale&&Array.isArray(c.normalScale)&&(c.normalScale=n(s.Vector2,o(c.normalScale))),new s.MeshPhysicalMaterial(c)}function f(e,r){return m.apply(this,arguments)}function m(){return m=e(r().m(function e(t,n){var o,a,s=arguments;return r().w(function(e){for(;;)switch(e.n){case 0:return o=s.length>2&&void 0!==s[2]?s[2]:{},e.n=1,c(t,n);case 1:return a=e.v,e.a(2,l(a,o))}},e)})),m.apply(this,arguments)}export{u as TEXTURE_SETS,l as createMaterialFromTextureSet,c as loadTextureSet,f as loadTextureSetAndCreateMaterial};
1
+ import { asyncToGenerator as _asyncToGenerator, regenerator as _regenerator, objectSpread2 as _objectSpread2, construct as _construct, toConsumableArray as _toConsumableArray, slicedToArray as _slicedToArray } from '../../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import * as THREE from 'three';
3
+
4
+ var TEXTURE_SETS = {
5
+ // Light metallic texture using the gravel_embedded_concrete with metallic properties
6
+ light_metal: {
7
+ path: '/textures/gravel_embedded_concrete_1k',
8
+ files: {
9
+ diffuse: 'diffuse.jpg',
10
+ normal: 'normal.jpg',
11
+ roughness: 'rough.jpg'
12
+ },
13
+ repeat: {
14
+ x: 2,
15
+ y: 2
16
+ },
17
+ // Moderate tiling for surface detail
18
+ materialProps: {
19
+ color: 0xb8b8b8,
20
+ // Light metallic base color
21
+ metalness: 0.3,
22
+ roughness: 0.3,
23
+ normalScale: [0.4, 0.4],
24
+ // Subtle surface detail
25
+ clearcoat: 0.3,
26
+ clearcoatRoughness: 0.2,
27
+ envMapIntensity: 1.6,
28
+ reflectivity: 0.5
29
+ }
30
+ },
31
+ brick: {
32
+ path: '/textures/pavement_03_1k',
33
+ files: {
34
+ diffuse: 'diffuse.jpg',
35
+ normal: 'normal.jpg',
36
+ roughness: 'rough.jpg'
37
+ },
38
+ repeat: {
39
+ x: 7.5,
40
+ y: 0.75
41
+ },
42
+ // Adjust for proper brick scale
43
+ materialProps: {
44
+ color: 0x998888,
45
+ roughness: 0.9,
46
+ metalness: 0.1,
47
+ normalScale: [1.5, 1.5],
48
+ bumpScale: 0.05,
49
+ clearcoat: 0.05,
50
+ clearcoatRoughness: 0.4
51
+ }
52
+ },
53
+ gravel_embedded_concrete: {
54
+ path: '/textures/gravel_embedded_concrete_1k',
55
+ files: {
56
+ diffuse: 'diffuse.jpg',
57
+ normal: 'normal.jpg',
58
+ roughness: 'rough.jpg'
59
+ },
60
+ repeat: {
61
+ x: 7,
62
+ y: 7
63
+ },
64
+ materialProps: {
65
+ color: 0x666666,
66
+ metalness: 0.0,
67
+ roughness: 1.0,
68
+ normalScale: [1.0, 1.0]
69
+ }
70
+ }
71
+ };
72
+
73
+ /**
74
+ * Helper function to load a complete texture set
75
+ * @param {string} setName - Name of the texture set from TEXTURE_SETS
76
+ * @param {THREE.TextureLoader} textureLoader - Three.js texture loader instance
77
+ * @returns {Promise<Object>} Promise that resolves to an object containing all loaded textures
78
+ */
79
+ function loadTextureSet(_x, _x2) {
80
+ return _loadTextureSet.apply(this, arguments);
81
+ }
82
+
83
+ /**
84
+ * Create a Three.js material from a loaded texture set
85
+ * @param {Object} loadedTextureSet - Result from loadTextureSet()
86
+ * @param {Object} overrideProps - Optional material property overrides
87
+ * @returns {THREE.MeshPhysicalMaterial} Configured material
88
+ */
89
+ function _loadTextureSet() {
90
+ _loadTextureSet = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(setName, textureLoader) {
91
+ var textureSet, loadTexture, promises, loadedTextures, textureMap;
92
+ return _regenerator().w(function (_context2) {
93
+ while (1) switch (_context2.n) {
94
+ case 0:
95
+ console.log("Loading texture set: ".concat(setName));
96
+ textureSet = TEXTURE_SETS[setName];
97
+ if (textureSet) {
98
+ _context2.n = 1;
99
+ break;
100
+ }
101
+ throw new Error("Texture set \"".concat(setName, "\" not found"));
102
+ case 1:
103
+ console.log("Texture set config:", textureSet);
104
+ loadTexture = function loadTexture(url) {
105
+ return new Promise(function (resolve, reject) {
106
+ console.log("Loading texture: ".concat(url));
107
+ textureLoader.load(url, function (texture) {
108
+ console.log("Successfully loaded: ".concat(url));
109
+ resolve(texture);
110
+ }, undefined, function (error) {
111
+ console.error("Failed to load: ".concat(url), error);
112
+ reject(error);
113
+ });
114
+ });
115
+ };
116
+ promises = Object.entries(textureSet.files).map(/*#__PURE__*/function () {
117
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref) {
118
+ var _ref3, type, filename, url, texture;
119
+ return _regenerator().w(function (_context) {
120
+ while (1) switch (_context.n) {
121
+ case 0:
122
+ _ref3 = _slicedToArray(_ref, 2), type = _ref3[0], filename = _ref3[1];
123
+ url = "".concat(textureSet.path, "/").concat(filename);
124
+ _context.n = 1;
125
+ return loadTexture(url);
126
+ case 1:
127
+ texture = _context.v;
128
+ return _context.a(2, [type, texture]);
129
+ }
130
+ }, _callee);
131
+ }));
132
+ return function (_x5) {
133
+ return _ref2.apply(this, arguments);
134
+ };
135
+ }());
136
+ _context2.n = 2;
137
+ return Promise.all(promises);
138
+ case 2:
139
+ loadedTextures = _context2.v;
140
+ textureMap = Object.fromEntries(loadedTextures); // Apply texture settings
141
+ Object.values(textureMap).forEach(function (texture) {
142
+ texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
143
+ texture.repeat.set(textureSet.repeat.x, textureSet.repeat.y);
144
+ });
145
+ console.log("Texture set ".concat(setName, " loaded successfully"));
146
+ return _context2.a(2, {
147
+ textures: textureMap,
148
+ config: textureSet
149
+ });
150
+ }
151
+ }, _callee2);
152
+ }));
153
+ return _loadTextureSet.apply(this, arguments);
154
+ }
155
+ function createMaterialFromTextureSet(loadedTextureSet) {
156
+ var overrideProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
157
+ var textures = loadedTextureSet.textures,
158
+ config = loadedTextureSet.config;
159
+ var materialProps = _objectSpread2(_objectSpread2({
160
+ map: textures.diffuse,
161
+ normalMap: textures.normal,
162
+ roughnessMap: textures.roughness
163
+ }, config.materialProps), overrideProps);
164
+
165
+ // Handle normalScale specially since it needs to be a Vector2
166
+ if (materialProps.normalScale && Array.isArray(materialProps.normalScale)) {
167
+ materialProps.normalScale = _construct(THREE.Vector2, _toConsumableArray(materialProps.normalScale));
168
+ }
169
+ return new THREE.MeshPhysicalMaterial(materialProps);
170
+ }
171
+
172
+ /**
173
+ * Convenient function to load texture set and create material in one step
174
+ * @param {string} setName - Name of the texture set
175
+ * @param {THREE.TextureLoader} textureLoader - Three.js texture loader
176
+ * @param {Object} materialOverrides - Optional material property overrides
177
+ * @returns {Promise<THREE.MeshPhysicalMaterial>} Promise that resolves to configured material
178
+ */
179
+ function loadTextureSetAndCreateMaterial(_x3, _x4) {
180
+ return _loadTextureSetAndCreateMaterial.apply(this, arguments);
181
+ }
182
+ function _loadTextureSetAndCreateMaterial() {
183
+ _loadTextureSetAndCreateMaterial = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(setName, textureLoader) {
184
+ var materialOverrides,
185
+ loadedTextureSet,
186
+ _args3 = arguments;
187
+ return _regenerator().w(function (_context3) {
188
+ while (1) switch (_context3.n) {
189
+ case 0:
190
+ materialOverrides = _args3.length > 2 && _args3[2] !== undefined ? _args3[2] : {};
191
+ _context3.n = 1;
192
+ return loadTextureSet(setName, textureLoader);
193
+ case 1:
194
+ loadedTextureSet = _context3.v;
195
+ return _context3.a(2, createMaterialFromTextureSet(loadedTextureSet, materialOverrides));
196
+ }
197
+ }, _callee3);
198
+ }));
199
+ return _loadTextureSetAndCreateMaterial.apply(this, arguments);
200
+ }
201
+
202
+ export { TEXTURE_SETS, createMaterialFromTextureSet, loadTextureSet, loadTextureSetAndCreateMaterial };
@@ -1 +1,260 @@
1
- import{createClass as n,classCallCheck as e,toConsumableArray as t}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{getHardcodedUuid as r}from"../../core/nameUtils.js";var o=function(){return n(function n(t){e(this,n),this.sceneViewer=t},[{key:"exportSceneData",value:function(){var n=this;if(!this.sceneViewer.scene)return null;var e=function(n){var t,o,l,a,i,u,s,c,v=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!n||null!==(t=n.name)&&void 0!==t&&t.includes("Polyline")||null!==(o=n.userData)&&void 0!==o&&o.isBrickWall||null!==(l=n.userData)&&void 0!==l&&l.isBaseGround||null!==(a=n.userData)&&void 0!==a&&a.isBaseGrid||n.isLight||null!==(i=n.userData)&&void 0!==i&&i.isTransformControls||n.isTransformControls||n.type&&n.type.includes("TransformControls"))return null;if(!(v||null!==(u=n.userData)&&void 0!==u&&u.componentType))return null;if(v&&(null===(s=n.userData)||void 0===s||!s.forExport))return null;if(v&&null!==(c=n.userData)&&void 0!==c&&c.forExport);var d,p,f,h={uuid:r(n),name:n.name||"Unnamed Object",type:n.type||"Object3D"};(n.userData&&Object.keys(n.userData).length>0&&(h.userData={},Object.keys(n.userData).forEach(function(e){"worldBoundingBox"!==e&&"isBaseGround"!==e&&"isBrickWall"!==e&&"isBaseGrid"!==e&&"isTransformControls"!==e&&(h.userData[e]=n.userData[e])}),n.userData.dimensions&&(h.userData.dimensions=n.userData.dimensions),0===Object.keys(h.userData).length&&delete h.userData),h.position={x:parseFloat(n.position.x.toFixed(6)),y:parseFloat(n.position.y.toFixed(6)),z:parseFloat(n.position.z.toFixed(6))},h.rotation={x:parseFloat((n.rotation.x*(180/Math.PI)).toFixed(6)),y:parseFloat((n.rotation.y*(180/Math.PI)).toFixed(6)),z:parseFloat((n.rotation.z*(180/Math.PI)).toFixed(6))},h.scale={x:parseFloat(n.scale.x.toFixed(6)),y:parseFloat(n.scale.y.toFixed(6)),z:parseFloat(n.scale.z.toFixed(6))},n.geometry)&&(null!==(d=n.name)&&void 0!==d&&d.toLowerCase().includes("connector")?h.geometry="CONNECTOR-GEO":null!==(p=n.name)&&void 0!==p&&p.toLowerCase().includes("gateway")?h.geometry="GATEWAY-GEO":null!==(f=n.userData)&&void 0!==f&&f.libraryId&&(h.geometry="".concat(n.userData.libraryId,"-GEO")));if(n.children&&n.children.length>0){var m=[];n.children.forEach(function(n){var t=e(n,!0);t&&m.push(t)}),m.length>0&&(h.children=m)}return h},o=[];this.sceneViewer.scene.children.forEach(function(n){var t=e(n);t&&o.push(t)});var l,a,i={connections:(a=[],null!==(l=n.sceneViewer.currentSceneData)&&void 0!==l&&l.connections&&a.push.apply(a,t(n.sceneViewer.currentSceneData.connections)),a),scene:{object:{uuid:"PLANT-SCENE",name:"Scene",type:"Scene",children:o}}};return i.t={exportedAt:(new Date).toISOString(),exportedFrom:"SceneViewerEnhanced",version:"1.0.0",objectCount:o.length},i}},{key:"downloadSceneExport",value:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=this.exportSceneData();if(!e)return!1;n||(n="cp-export.json");try{var t=JSON.stringify(e,null,2),r=new Blob([t],{type:"application/json"}),o=URL.createObjectURL(r),l=document.createElement("a");return l.href=o,l.download=n,document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(o),!0}catch(n){return!1}}},{key:"exportSceneDataAsString",value:function(){var n=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=this.exportSceneData();return e?n?JSON.stringify(e,null,2):JSON.stringify(e):null}},{key:"getExportMetadata",value:function(){var n;if(!this.sceneViewer.scene)return null;var e=0;return this.sceneViewer.scene.traverse(function(){return e++}),{totalObjects:e,hasCurrentSceneData:!!this.sceneViewer.currentSceneData,connectionsCount:(null===(n=this.sceneViewer.currentSceneData)||void 0===n||null===(n=n.connections)||void 0===n?void 0:n.length)||0,exportTimestamp:(new Date).toISOString()}}}])}();export{o as SceneExportManager};
1
+ import { createClass as _createClass, classCallCheck as _classCallCheck, toConsumableArray as _toConsumableArray } from '../../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import { getHardcodedUuid } from '../../core/nameUtils.js';
3
+
4
+ var SceneExportManager = /*#__PURE__*/function () {
5
+ function SceneExportManager(sceneViewer) {
6
+ _classCallCheck(this, SceneExportManager);
7
+ this.sceneViewer = sceneViewer;
8
+ }
9
+
10
+ /**
11
+ * Export function that recreates the JSON data structure from current scene objects
12
+ */
13
+ return _createClass(SceneExportManager, [{
14
+ key: "exportSceneData",
15
+ value: function exportSceneData() {
16
+ var _this = this;
17
+ console.log('📤 Starting scene export...');
18
+ if (!this.sceneViewer.scene) {
19
+ console.warn('⚠️ No scene available for export');
20
+ return null;
21
+ }
22
+
23
+ // Helper function to extract connections from pathfinder or scene analysis
24
+ var extractConnections = function extractConnections() {
25
+ var _this$sceneViewer$cur;
26
+ var connections = [];
27
+
28
+ // If we have the original connections from currentSceneData, use those as base
29
+ if ((_this$sceneViewer$cur = _this.sceneViewer.currentSceneData) !== null && _this$sceneViewer$cur !== void 0 && _this$sceneViewer$cur.connections) {
30
+ connections.push.apply(connections, _toConsumableArray(_this.sceneViewer.currentSceneData.connections));
31
+ }
32
+
33
+ // If no currentSceneData, we'll return empty connections array
34
+ // This allows export to work even for default scenes that haven't been imported
35
+ return connections;
36
+ };
37
+
38
+ // Helper function to convert Three.js object to JSON format
39
+ var _convertObjectToJson = function convertObjectToJson(threeObject) {
40
+ var _threeObject$name, _threeObject$userData, _threeObject$userData2, _threeObject$userData3, _threeObject$userData4, _threeObject$userData5, _threeObject$userData6, _threeObject$userData8;
41
+ var isChild = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
42
+ // Skip certain objects that shouldn't be exported
43
+ if (!threeObject || (_threeObject$name = threeObject.name) !== null && _threeObject$name !== void 0 && _threeObject$name.includes('Polyline') || // Skip pipe paths
44
+ (_threeObject$userData = threeObject.userData) !== null && _threeObject$userData !== void 0 && _threeObject$userData.isBrickWall || // Skip environment
45
+ (_threeObject$userData2 = threeObject.userData) !== null && _threeObject$userData2 !== void 0 && _threeObject$userData2.isBaseGround || // Skip environment
46
+ (_threeObject$userData3 = threeObject.userData) !== null && _threeObject$userData3 !== void 0 && _threeObject$userData3.isBaseGrid ||
47
+ // Skip environment
48
+ threeObject.isLight || // Skip lights
49
+ (_threeObject$userData4 = threeObject.userData) !== null && _threeObject$userData4 !== void 0 && _threeObject$userData4.isTransformControls ||
50
+ // Skip transform controls
51
+ threeObject.isTransformControls ||
52
+ // Skip transform controls
53
+ threeObject.type && threeObject.type.includes('TransformControls')) {
54
+ return null;
55
+ }
56
+
57
+ // For top-level objects, require componentType, but allow children through
58
+ if (!isChild && !((_threeObject$userData5 = threeObject.userData) !== null && _threeObject$userData5 !== void 0 && _threeObject$userData5.componentType)) {
59
+ return null;
60
+ }
61
+
62
+ // For child objects, only include if forExport is explicitly set to true
63
+ if (isChild && !((_threeObject$userData6 = threeObject.userData) !== null && _threeObject$userData6 !== void 0 && _threeObject$userData6.forExport)) {
64
+ var _threeObject$userData7;
65
+ console.log("\uD83D\uDD3D Excluding child '".concat(threeObject.name, "' from export (forExport: ").concat((_threeObject$userData7 = threeObject.userData) === null || _threeObject$userData7 === void 0 ? void 0 : _threeObject$userData7.forExport, ")"));
66
+ return null;
67
+ }
68
+ // Log when a child is being included in export
69
+ if (isChild && (_threeObject$userData8 = threeObject.userData) !== null && _threeObject$userData8 !== void 0 && _threeObject$userData8.forExport) {
70
+ var _threeObject$userData9;
71
+ console.log("\u2705 Including child '".concat(threeObject.name, "' in export (forExport: ").concat((_threeObject$userData9 = threeObject.userData) === null || _threeObject$userData9 === void 0 ? void 0 : _threeObject$userData9.forExport, ")"));
72
+ } // Create base JSON object with HARDCODED UUID preservation
73
+ var jsonObject = {
74
+ uuid: getHardcodedUuid(threeObject),
75
+ // Use utility function to get hardcoded UUID
76
+ name: threeObject.name || 'Unnamed Object',
77
+ type: threeObject.type || 'Object3D'
78
+ };
79
+
80
+ // Add userData if it exists (preserving libraryId and other important data)
81
+ if (threeObject.userData && Object.keys(threeObject.userData).length > 0) {
82
+ jsonObject.userData = {};
83
+
84
+ // Copy important userData properties, excluding temporary/runtime data
85
+ Object.keys(threeObject.userData).forEach(function (key) {
86
+ if (key !== 'worldBoundingBox' && key !== 'isBaseGround' && key !== 'isBrickWall' && key !== 'isBaseGrid' && key !== 'isTransformControls') {
87
+ jsonObject.userData[key] = threeObject.userData[key];
88
+ }
89
+ });
90
+
91
+ // Ensure dimensions are included if they exist
92
+ if (threeObject.userData.dimensions) {
93
+ jsonObject.userData.dimensions = threeObject.userData.dimensions;
94
+ console.log("\uD83D\uDCCF Exported dimensions for ".concat(threeObject.name, ":"), jsonObject.userData.dimensions);
95
+ }
96
+
97
+ // If no relevant userData, remove the empty object
98
+ if (Object.keys(jsonObject.userData).length === 0) {
99
+ delete jsonObject.userData;
100
+ }
101
+ }
102
+
103
+ // Add transform data - convert from radians to degrees for rotation
104
+ jsonObject.position = {
105
+ x: parseFloat(threeObject.position.x.toFixed(6)),
106
+ y: parseFloat(threeObject.position.y.toFixed(6)),
107
+ z: parseFloat(threeObject.position.z.toFixed(6))
108
+ };
109
+ jsonObject.rotation = {
110
+ x: parseFloat((threeObject.rotation.x * (180 / Math.PI)).toFixed(6)),
111
+ y: parseFloat((threeObject.rotation.y * (180 / Math.PI)).toFixed(6)),
112
+ z: parseFloat((threeObject.rotation.z * (180 / Math.PI)).toFixed(6))
113
+ };
114
+ jsonObject.scale = {
115
+ x: parseFloat(threeObject.scale.x.toFixed(6)),
116
+ y: parseFloat(threeObject.scale.y.toFixed(6)),
117
+ z: parseFloat(threeObject.scale.z.toFixed(6))
118
+ };
119
+
120
+ // Add geometry reference for connectors and other special objects
121
+ if (threeObject.geometry) {
122
+ var _threeObject$name2, _threeObject$name3, _threeObject$userData0;
123
+ if ((_threeObject$name2 = threeObject.name) !== null && _threeObject$name2 !== void 0 && _threeObject$name2.toLowerCase().includes('connector')) {
124
+ jsonObject.geometry = 'CONNECTOR-GEO';
125
+ } else if ((_threeObject$name3 = threeObject.name) !== null && _threeObject$name3 !== void 0 && _threeObject$name3.toLowerCase().includes('gateway')) {
126
+ jsonObject.geometry = 'GATEWAY-GEO';
127
+ } else if ((_threeObject$userData0 = threeObject.userData) !== null && _threeObject$userData0 !== void 0 && _threeObject$userData0.libraryId) {
128
+ // For library objects, use a standard geometry reference
129
+ jsonObject.geometry = "".concat(threeObject.userData.libraryId, "-GEO");
130
+ }
131
+ }
132
+
133
+ // Process children recursively
134
+ if (threeObject.children && threeObject.children.length > 0) {
135
+ var validChildren = [];
136
+ threeObject.children.forEach(function (child) {
137
+ var childJson = _convertObjectToJson(child, true);
138
+ if (childJson) {
139
+ validChildren.push(childJson);
140
+ }
141
+ });
142
+ if (validChildren.length > 0) {
143
+ jsonObject.children = validChildren;
144
+ }
145
+ }
146
+ return jsonObject;
147
+ };
148
+
149
+ // Extract main scene objects (excluding environment and utility objects)
150
+ var sceneChildren = [];
151
+ this.sceneViewer.scene.children.forEach(function (child) {
152
+ var jsonChild = _convertObjectToJson(child);
153
+ if (jsonChild) {
154
+ sceneChildren.push(jsonChild);
155
+ }
156
+ });
157
+
158
+ // Build the complete export data structure
159
+ var exportData = {
160
+ connections: extractConnections(),
161
+ scene: {
162
+ object: {
163
+ uuid: 'PLANT-SCENE',
164
+ name: 'Scene',
165
+ type: 'Scene',
166
+ children: sceneChildren
167
+ }
168
+ }
169
+ };
170
+
171
+ // Add metadata for tracking
172
+ exportData._metadata = {
173
+ exportedAt: new Date().toISOString(),
174
+ exportedFrom: 'SceneViewerEnhanced',
175
+ version: '1.0.0',
176
+ objectCount: sceneChildren.length
177
+ };
178
+ console.log('✅ Scene export completed:', exportData);
179
+ return exportData;
180
+ }
181
+
182
+ /**
183
+ * Helper function to download the exported scene data as JSON file
184
+ */
185
+ }, {
186
+ key: "downloadSceneExport",
187
+ value: function downloadSceneExport() {
188
+ var filename = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
189
+ var exportData = this.exportSceneData();
190
+ if (!exportData) {
191
+ console.error('❌ Failed to export scene data');
192
+ return false;
193
+ }
194
+
195
+ // Generate filename if not provided
196
+ if (!filename) {
197
+ filename = "cp-export.json";
198
+ }
199
+
200
+ // Create and download the file
201
+ try {
202
+ var jsonString = JSON.stringify(exportData, null, 2);
203
+ var blob = new Blob([jsonString], {
204
+ type: 'application/json'
205
+ });
206
+ var url = URL.createObjectURL(blob);
207
+ var link = document.createElement('a');
208
+ link.href = url;
209
+ link.download = filename;
210
+ document.body.appendChild(link);
211
+ link.click();
212
+ document.body.removeChild(link);
213
+ URL.revokeObjectURL(url);
214
+ console.log("\uD83D\uDCC1 Scene exported successfully as: ".concat(filename));
215
+ return true;
216
+ } catch (error) {
217
+ console.error('❌ Error downloading scene export:', error);
218
+ return false;
219
+ }
220
+ }
221
+
222
+ /**
223
+ * Export scene data as JSON string
224
+ */
225
+ }, {
226
+ key: "exportSceneDataAsString",
227
+ value: function exportSceneDataAsString() {
228
+ var pretty = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
229
+ var exportData = this.exportSceneData();
230
+ if (!exportData) {
231
+ return null;
232
+ }
233
+ return pretty ? JSON.stringify(exportData, null, 2) : JSON.stringify(exportData);
234
+ }
235
+
236
+ /**
237
+ * Get export metadata
238
+ */
239
+ }, {
240
+ key: "getExportMetadata",
241
+ value: function getExportMetadata() {
242
+ var _this$sceneViewer$cur2;
243
+ if (!this.sceneViewer.scene) {
244
+ return null;
245
+ }
246
+ var objectCount = 0;
247
+ this.sceneViewer.scene.traverse(function () {
248
+ return objectCount++;
249
+ });
250
+ return {
251
+ totalObjects: objectCount,
252
+ hasCurrentSceneData: !!this.sceneViewer.currentSceneData,
253
+ connectionsCount: ((_this$sceneViewer$cur2 = this.sceneViewer.currentSceneData) === null || _this$sceneViewer$cur2 === void 0 || (_this$sceneViewer$cur2 = _this$sceneViewer$cur2.connections) === null || _this$sceneViewer$cur2 === void 0 ? void 0 : _this$sceneViewer$cur2.length) || 0,
254
+ exportTimestamp: new Date().toISOString()
255
+ };
256
+ }
257
+ }]);
258
+ }();
259
+
260
+ export { SceneExportManager };