@2112-lab/central-plant 0.1.39 → 0.1.41

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 (45) hide show
  1. package/dist/bundle/index.js +7991 -7054
  2. package/dist/cjs/src/core/centralPlant.js +48 -3
  3. package/dist/cjs/src/core/centralPlantInternals.js +75 -566
  4. package/dist/cjs/src/core/sceneViewer.js +38 -13
  5. package/dist/cjs/src/index.js +6 -4
  6. package/dist/cjs/src/managers/components/pathfindingManager.js +75 -60
  7. package/dist/cjs/src/managers/components/transformOperationsManager.js +929 -0
  8. package/dist/cjs/src/managers/controls/keyboardControlsManager.js +57 -1
  9. package/dist/cjs/src/managers/controls/transformControls.js +11 -3
  10. package/dist/cjs/src/managers/controls/transformControlsManager.js +563 -263
  11. package/dist/cjs/src/managers/pathfinding/ConnectorManager.js +385 -0
  12. package/dist/cjs/src/managers/pathfinding/PathIntersectionDetector.js +387 -0
  13. package/dist/cjs/src/managers/pathfinding/PathRenderingManager.js +401 -0
  14. package/dist/cjs/src/managers/pathfinding/pathfindingManager.js +378 -0
  15. package/dist/cjs/src/managers/pathfinding/sceneDataManager.js +256 -0
  16. package/dist/cjs/src/managers/scene/animationManager.js +145 -0
  17. package/dist/cjs/src/managers/scene/sceneExportManager.js +14 -13
  18. package/dist/cjs/src/managers/scene/sceneOperationsManager.js +516 -21
  19. package/dist/cjs/src/managers/scene/sceneTooltipsManager.js +1 -8
  20. package/dist/cjs/src/managers/system/operationHistoryManager.js +414 -0
  21. package/dist/cjs/src/managers/system/settingsManager.js +2 -1
  22. package/dist/cjs/src/utils/objectTypes.js +5 -7
  23. package/dist/esm/src/core/centralPlant.js +48 -3
  24. package/dist/esm/src/core/centralPlantInternals.js +76 -567
  25. package/dist/esm/src/core/sceneViewer.js +38 -13
  26. package/dist/esm/src/index.js +4 -3
  27. package/dist/esm/src/managers/components/pathfindingManager.js +75 -60
  28. package/dist/esm/src/managers/components/transformOperationsManager.js +904 -0
  29. package/dist/esm/src/managers/controls/keyboardControlsManager.js +57 -1
  30. package/dist/esm/src/managers/controls/transformControls.js +11 -3
  31. package/dist/esm/src/managers/controls/transformControlsManager.js +564 -264
  32. package/dist/esm/src/managers/pathfinding/ConnectorManager.js +361 -0
  33. package/dist/esm/src/managers/pathfinding/PathIntersectionDetector.js +363 -0
  34. package/dist/esm/src/managers/pathfinding/PathRenderingManager.js +377 -0
  35. package/dist/esm/src/managers/pathfinding/pathfindingManager.js +374 -0
  36. package/dist/esm/src/managers/pathfinding/sceneDataManager.js +232 -0
  37. package/dist/esm/src/managers/scene/animationManager.js +141 -0
  38. package/dist/esm/src/managers/scene/sceneExportManager.js +14 -13
  39. package/dist/esm/src/managers/scene/sceneOperationsManager.js +516 -21
  40. package/dist/esm/src/managers/scene/sceneTooltipsManager.js +1 -8
  41. package/dist/esm/src/managers/system/operationHistoryManager.js +409 -0
  42. package/dist/esm/src/managers/system/settingsManager.js +2 -1
  43. package/dist/esm/src/utils/objectTypes.js +5 -7
  44. package/dist/index.d.ts +2 -2
  45. package/package.json +1 -1
@@ -0,0 +1,385 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../../../_virtual/_rollupPluginBabelHelpers.js');
6
+ var THREE = require('three');
7
+ var baseDisposable = require('../../core/baseDisposable.js');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n["default"] = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
28
+
29
+ var ConnectorManager = /*#__PURE__*/function (_BaseDisposable) {
30
+ function ConnectorManager(sceneViewer) {
31
+ var _this;
32
+ _rollupPluginBabelHelpers.classCallCheck(this, ConnectorManager);
33
+ _this = _rollupPluginBabelHelpers.callSuper(this, ConnectorManager);
34
+ _this.sceneViewer = sceneViewer;
35
+ return _this;
36
+ }
37
+
38
+ /**
39
+ * Create connector objects at segment endpoints
40
+ * @param {THREE.Object3D} segment - The pipe segment
41
+ * @param {Object} endpoints - Object with start and end points
42
+ * @returns {Array} Array of connector objects [startConnector, endConnector]
43
+ */
44
+ _rollupPluginBabelHelpers.inherits(ConnectorManager, _BaseDisposable);
45
+ return _rollupPluginBabelHelpers.createClass(ConnectorManager, [{
46
+ key: "createSegmentConnectors",
47
+ value: function createSegmentConnectors(segment, endpoints) {
48
+ var segmentData = segment.userData;
49
+ var segmentId = segmentData.segmentId;
50
+ var segmentIndex = segmentData.segmentIndex;
51
+ var connectors = [];
52
+
53
+ // Reuse the segment's material for both connectors
54
+ var segmentMaterial = segment.material;
55
+ var sphereRadius = 0.1;
56
+ var sphereSegments = 16;
57
+
58
+ // Create start connector
59
+ var startConnector = new THREE__namespace.Mesh(new THREE__namespace.SphereGeometry(sphereRadius, sphereSegments, sphereSegments), segmentMaterial // Reuse segment material
60
+ );
61
+
62
+ // Convert world position to local position relative to segment
63
+ var localStartPosition = segment.worldToLocal(endpoints.start.clone());
64
+ startConnector.position.copy(localStartPosition);
65
+ startConnector.uuid = "SEGMENT-".concat(segmentIndex, "-CONNECTOR-1");
66
+ startConnector.userData = {
67
+ objectType: 'segment-connector',
68
+ isManualSegmentConnector: true,
69
+ segmentId: segmentId,
70
+ connectorType: 'start',
71
+ manualSegmentUuid: segment.uuid,
72
+ isDeclared: true
73
+ };
74
+
75
+ // Add start connector as child of segment
76
+ segment.add(startConnector);
77
+
78
+ // Create end connector
79
+ var endConnector = new THREE__namespace.Mesh(new THREE__namespace.SphereGeometry(sphereRadius, sphereSegments, sphereSegments), segmentMaterial // Reuse segment material
80
+ );
81
+
82
+ // Convert world position to local position relative to segment
83
+ var localEndPosition = segment.worldToLocal(endpoints.end.clone());
84
+ endConnector.position.copy(localEndPosition);
85
+ endConnector.uuid = "SEGMENT-".concat(segmentIndex, "-CONNECTOR-2");
86
+ endConnector.userData = {
87
+ objectType: 'segment-connector',
88
+ isManualSegmentConnector: true,
89
+ segmentId: segmentId,
90
+ connectorType: 'end',
91
+ manualSegmentUuid: segment.uuid,
92
+ isDeclared: true
93
+ };
94
+
95
+ // Add end connector as child of segment
96
+ segment.add(endConnector);
97
+ connectors.push(startConnector, endConnector);
98
+ return connectors;
99
+ }
100
+
101
+ /**
102
+ * Calculate the start and end points of a pipe segment in world coordinates
103
+ * @param {THREE.Object3D} segment - The pipe segment
104
+ * @returns {Object} Object with start and end points { start: Vector3, end: Vector3 }
105
+ */
106
+ }, {
107
+ key: "calculateSegmentEndpoints",
108
+ value: function calculateSegmentEndpoints(segment) {
109
+ // Get the segment's geometry to determine its length and orientation
110
+ var geometry = segment.geometry;
111
+ var length = geometry.parameters.height || 1;
112
+
113
+ // Calculate start and end points based on segment position and orientation
114
+ var startPoint = new THREE__namespace.Vector3();
115
+ var endPoint = new THREE__namespace.Vector3();
116
+
117
+ // Get the segment's direction vector
118
+ var direction = new THREE__namespace.Vector3(0, 1, 0);
119
+ direction.applyQuaternion(segment.quaternion);
120
+
121
+ // Calculate start point (half length back from center)
122
+ startPoint.copy(segment.position).sub(direction.clone().multiplyScalar(length / 2));
123
+
124
+ // Calculate end point (half length forward from center)
125
+ endPoint.copy(segment.position).add(direction.clone().multiplyScalar(length / 2));
126
+ return {
127
+ start: startPoint,
128
+ end: endPoint
129
+ };
130
+ }
131
+
132
+ /**
133
+ * Add connectors to the scene and scene data
134
+ * Note: Connectors are already children of the segment in the Three.js scene.
135
+ * @param {Array} connectors - Array of connector objects
136
+ */
137
+ }, {
138
+ key: "addConnectorsToScene",
139
+ value: function addConnectorsToScene(connectors) {
140
+ var sceneViewer = this.sceneViewer;
141
+ connectors.forEach(function (connector) {
142
+ // Connectors are already children of the segment in Three.js, no need to add to scene
143
+ console.log("\uD83D\uDD0C Connector already added as child of segment: ".concat(connector.uuid));
144
+
145
+ // Add to scene data structure as children of the segment (not at top level)
146
+ if (sceneViewer.currentSceneData && sceneViewer.currentSceneData.scene) {
147
+ // Helper function to clean up floating-point precision errors
148
+ var cleanPosition = function cleanPosition(value) {
149
+ // Round values very close to zero to exactly zero
150
+ return Math.abs(value) < 1e-10 ? 0 : value;
151
+ };
152
+
153
+ // Get world position for scene data (since connectors are now in local space)
154
+ var worldPosition = new THREE__namespace.Vector3();
155
+ connector.getWorldPosition(worldPosition);
156
+
157
+ // Get the segment UUID from connector's userData
158
+ var segmentUuid = connector.userData.manualSegmentUuid;
159
+ if (!segmentUuid) {
160
+ console.warn("\u26A0\uFE0F Connector ".concat(connector.uuid, " missing manualSegmentUuid, cannot add to scene data"));
161
+ return;
162
+ }
163
+
164
+ // Find the segment in scene data
165
+ var _findSegment = function findSegment(children) {
166
+ var _iterator = _rollupPluginBabelHelpers.createForOfIteratorHelper(children),
167
+ _step;
168
+ try {
169
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
170
+ var child = _step.value;
171
+ if (child.uuid === segmentUuid) {
172
+ return child;
173
+ }
174
+ if (child.children) {
175
+ var found = _findSegment(child.children);
176
+ if (found) return found;
177
+ }
178
+ }
179
+ } catch (err) {
180
+ _iterator.e(err);
181
+ } finally {
182
+ _iterator.f();
183
+ }
184
+ return null;
185
+ };
186
+ var segmentInSceneData = _findSegment(sceneViewer.currentSceneData.scene.children);
187
+ if (!segmentInSceneData) {
188
+ console.warn("\u26A0\uFE0F Could not find segment ".concat(segmentUuid, " in scene data for connector ").concat(connector.uuid));
189
+ return;
190
+ }
191
+
192
+ // Ensure segment has a children array in scene data
193
+ if (!segmentInSceneData.children) {
194
+ segmentInSceneData.children = [];
195
+ }
196
+ var sceneDataConnector = {
197
+ uuid: connector.uuid,
198
+ userData: _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, connector.userData), {}, {
199
+ isDeclared: true,
200
+ // Mark manual segment connectors as declared
201
+ // Position MUST be an array [x, y, z] for pathfinder compatibility
202
+ position: [cleanPosition(worldPosition.x), cleanPosition(worldPosition.y), cleanPosition(worldPosition.z)]
203
+ })
204
+ };
205
+
206
+ // Add connector as child of segment in scene data (not at top level)
207
+ segmentInSceneData.children.push(sceneDataConnector);
208
+ console.log("\uD83D\uDD0C Added connector to scene data as child of segment ".concat(segmentUuid, ": ").concat(connector.uuid));
209
+ } else {
210
+ console.warn('⚠️ Could not add connector to scene data - currentSceneData not available');
211
+ }
212
+ });
213
+ }
214
+
215
+ /**
216
+ * Restructure connections to use the new connectors
217
+ * @param {string} authoritativeConnectorUUID - The authoritative connector UUID
218
+ * @param {Array} connectors - Array of connector objects (0: start, 1: end)
219
+ * @param {Object} currentSceneData - Current scene data
220
+ * @param {Array<string>} convertedGatewayUUIDs - Array of gateway UUIDs that were converted to manual (optional)
221
+ */
222
+ }, {
223
+ key: "restructureConnections",
224
+ value: function restructureConnections(authoritativeConnectorUUID, connectors, currentSceneData) {
225
+ var convertedGatewayUUIDs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
226
+ // Extract connector UUIDs from the passed connectors array
227
+ var startConnectorUUID = connectors[0].uuid; // SEGMENT-X-CONNECTOR-1
228
+ var endConnectorUUID = connectors[1].uuid; // SEGMENT-X-CONNECTOR-2
229
+
230
+ console.log("\uD83D\uDD27 [restructureConnections] connectors:", JSON.parse(JSON.stringify(connectors)));
231
+ console.log("\uD83D\uDD27 [restructureConnections] convertedGatewayUUIDs:", convertedGatewayUUIDs);
232
+
233
+ // Deep copy connections array to prevent unintended mutations during iteration
234
+ // Then map to update references, creating new connection objects
235
+ currentSceneData.connections = currentSceneData.connections.map(function (connection) {
236
+ console.log("[restructureConnections] connection:", connection);
237
+
238
+ // Create a shallow copy of the connection object
239
+ var updatedConnection = _rollupPluginBabelHelpers.objectSpread2({}, connection);
240
+ if (connection.from === authoritativeConnectorUUID) {
241
+ updatedConnection.from = endConnectorUUID;
242
+ console.log("\u2705 [restructureConnections] Updated connection.from to ".concat(endConnectorUUID));
243
+ }
244
+ if (connection.to === authoritativeConnectorUUID) {
245
+ updatedConnection.to = endConnectorUUID;
246
+ console.log("\u2705 [restructureConnections] Updated connection.to to ".concat(endConnectorUUID));
247
+ }
248
+ return updatedConnection;
249
+ });
250
+
251
+ // Check if the new connection already exists to prevent duplicates
252
+ var newConnectionExists = currentSceneData.connections.some(function (conn) {
253
+ return conn.from === authoritativeConnectorUUID && conn.to === startConnectorUUID || conn.from === startConnectorUUID && conn.to === authoritativeConnectorUUID;
254
+ });
255
+ if (!newConnectionExists) {
256
+ // Add new connection from authoritative connector to the segment start
257
+ currentSceneData.connections.push({
258
+ from: authoritativeConnectorUUID,
259
+ to: startConnectorUUID
260
+ });
261
+ console.log("\u2705 [restructureConnections] Added new connection: ".concat(authoritativeConnectorUUID, " \u2192 ").concat(startConnectorUUID));
262
+ } else {
263
+ console.log("\u26A0\uFE0F [restructureConnections] Connection already exists, skipping: ".concat(authoritativeConnectorUUID, " \u2192 ").concat(startConnectorUUID));
264
+ }
265
+
266
+ // Log converted gateways for tracking
267
+ if (convertedGatewayUUIDs.length > 0) {
268
+ console.log("\uD83D\uDD27 [restructureConnections] Converted gateways available: ".concat(convertedGatewayUUIDs.join(', ')));
269
+ }
270
+ console.log("\u2705 [restructureConnections] currentSceneData.connections:", JSON.parse(JSON.stringify(currentSceneData.connections)));
271
+ }
272
+
273
+ /**
274
+ * Find the original connection that a segment belongs to
275
+ * @param {THREE.Object3D} segment - The pipe segment
276
+ * @param {Array} connections - Array of connections
277
+ * @returns {Object|null} The original connection or null
278
+ */
279
+ }, {
280
+ key: "findOriginalConnection",
281
+ value: function findOriginalConnection(segment, connections) {
282
+ var _fromObject$userData, _toObject$userData;
283
+ var segmentData = segment.userData;
284
+ var pathFrom = segmentData.pathFrom;
285
+ var pathTo = segmentData.pathTo;
286
+ console.log('🔍 Looking for connection:', {
287
+ pathFrom: pathFrom,
288
+ pathTo: pathTo
289
+ });
290
+ console.log('🔍 Available connections:', connections);
291
+
292
+ // First try: direct connection match
293
+ var foundConnection = connections.find(function (conn) {
294
+ return conn.from === pathFrom && conn.to === pathTo || conn.from === pathTo && conn.to === pathFrom;
295
+ });
296
+ if (foundConnection) {
297
+ console.log('🔍 Found direct connection match:', foundConnection);
298
+ return foundConnection;
299
+ }
300
+
301
+ // Second try: look for connections that might involve gateways
302
+ // This can happen when the original connection involves a gateway that was computed
303
+ console.log('🔍 No direct match found, checking for gateway-involved connections...');
304
+ var sceneViewer = this.sceneViewer;
305
+
306
+ // Look for objects in the scene that might be the pathFrom or pathTo
307
+ var fromObject = null;
308
+ var toObject = null;
309
+ sceneViewer.scene.traverse(function (obj) {
310
+ var _obj$userData, _obj$userData2;
311
+ if (obj.uuid === pathFrom || ((_obj$userData = obj.userData) === null || _obj$userData === void 0 ? void 0 : _obj$userData.originalUuid) === pathFrom) {
312
+ fromObject = obj;
313
+ }
314
+ if (obj.uuid === pathTo || ((_obj$userData2 = obj.userData) === null || _obj$userData2 === void 0 ? void 0 : _obj$userData2.originalUuid) === pathTo) {
315
+ toObject = obj;
316
+ }
317
+ });
318
+ console.log('🔍 Scene objects found:', {
319
+ fromObject: fromObject ? {
320
+ uuid: fromObject.uuid,
321
+ name: fromObject.uuid,
322
+ objectType: (_fromObject$userData = fromObject.userData) === null || _fromObject$userData === void 0 ? void 0 : _fromObject$userData.objectType
323
+ } : null,
324
+ toObject: toObject ? {
325
+ uuid: toObject.uuid,
326
+ name: toObject.uuid,
327
+ objectType: (_toObject$userData = toObject.userData) === null || _toObject$userData === void 0 ? void 0 : _toObject$userData.objectType
328
+ } : null
329
+ });
330
+
331
+ // If we found the objects, look for connections involving their UUIDs
332
+ if (fromObject && toObject) {
333
+ foundConnection = connections.find(function (conn) {
334
+ return conn.from === fromObject.uuid && conn.to === toObject.uuid || conn.from === toObject.uuid && conn.to === fromObject.uuid;
335
+ });
336
+ if (foundConnection) {
337
+ console.log('🔍 Found connection via object UUIDs:', foundConnection);
338
+ return foundConnection;
339
+ }
340
+ }
341
+
342
+ // Third try: look for any connection that might be related to this segment
343
+ // This is a fallback for cases where the connection structure is complex
344
+ console.log('🔍 Trying fallback: looking for any connection that might be related...');
345
+
346
+ // Look for connections that might involve the segment's path information
347
+ var possibleConnections = connections.filter(function (conn) {
348
+ var _sceneViewer$scene$ge, _sceneViewer$scene$ge2;
349
+ // Check if either end of the connection might be related to our segment
350
+ var fromMatches = conn.from === pathFrom || conn.from === pathTo;
351
+ var toMatches = conn.to === pathFrom || conn.to === pathTo;
352
+
353
+ // Also check if the connection involves any gateway or component that might be related
354
+ var fromIsGateway = ((_sceneViewer$scene$ge = sceneViewer.scene.getObjectByProperty('uuid', conn.from)) === null || _sceneViewer$scene$ge === void 0 || (_sceneViewer$scene$ge = _sceneViewer$scene$ge.userData) === null || _sceneViewer$scene$ge === void 0 ? void 0 : _sceneViewer$scene$ge.objectType) === 'gateway';
355
+ var toIsGateway = ((_sceneViewer$scene$ge2 = sceneViewer.scene.getObjectByProperty('uuid', conn.to)) === null || _sceneViewer$scene$ge2 === void 0 || (_sceneViewer$scene$ge2 = _sceneViewer$scene$ge2.userData) === null || _sceneViewer$scene$ge2 === void 0 ? void 0 : _sceneViewer$scene$ge2.objectType) === 'gateway';
356
+ return fromMatches || toMatches || fromIsGateway || toIsGateway;
357
+ });
358
+ if (possibleConnections.length > 0) {
359
+ console.log('🔍 Found possible related connections:', possibleConnections);
360
+ // Return the first one as a best guess
361
+ return possibleConnections[0];
362
+ }
363
+ console.log('❌ No connection found for segment');
364
+ return null;
365
+ }
366
+
367
+ /**
368
+ * Dispose of connector manager resources
369
+ */
370
+ }, {
371
+ key: "dispose",
372
+ value: function dispose() {
373
+ console.log('🗑️ Disposing ConnectorManager...');
374
+
375
+ // Call parent dispose to clean up registered resources
376
+ _rollupPluginBabelHelpers.superPropGet(ConnectorManager, "dispose", this, 3)([]);
377
+
378
+ // Nullify properties
379
+ this.sceneViewer = null;
380
+ console.log('✅ ConnectorManager disposed');
381
+ }
382
+ }]);
383
+ }(baseDisposable.BaseDisposable);
384
+
385
+ exports.ConnectorManager = ConnectorManager;