@2112-lab/central-plant 0.1.49 → 0.1.51

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.
@@ -1,4 +1,4 @@
1
- import { createClass as _createClass, createForOfIteratorHelper as _createForOfIteratorHelper, classCallCheck as _classCallCheck, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator, regeneratorValues as _regeneratorValues } from '../../../_virtual/_rollupPluginBabelHelpers.js';
1
+ import { createClass as _createClass, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator, createForOfIteratorHelper as _createForOfIteratorHelper, classCallCheck as _classCallCheck, regeneratorValues as _regeneratorValues } from '../../../_virtual/_rollupPluginBabelHelpers.js';
2
2
  import * as THREE from 'three';
3
3
  import { transformControls } from './transformControls.js';
4
4
  import { isSegment, isGateway } from '../../utils/objectTypes.js';
@@ -239,58 +239,74 @@ var TransformControlsManager = /*#__PURE__*/function () {
239
239
  };
240
240
 
241
241
  // Transform end event
242
- this.eventHandlers.transformEnd = function () {
243
- _this2.transformState.isTransforming = false;
244
-
245
- // Re-enable orbit controls
246
- if (_this2.orbitControls) {
247
- _this2.orbitControls.enabled = true;
248
- }
242
+ this.eventHandlers.transformEnd = /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
243
+ var hasComponents, _this2$selectedObject, sceneCompleteEvent;
244
+ return _regenerator().w(function (_context) {
245
+ while (1) switch (_context.n) {
246
+ case 0:
247
+ _this2.transformState.isTransforming = false;
249
248
 
250
- // Apply multi-selection transforms (works for single or multiple objects)
251
- // This is async but we don't await it to avoid blocking the event handler
252
- if (_this2.selectedObjects.length > 0 && _this2.multiSelectionGroup) {
253
- _this2.applyMultiSelectionTransform().catch(function (error) {
254
- console.error('❌ Error in applyMultiSelectionTransform:', error);
255
- });
256
- }
249
+ // Re-enable orbit controls
250
+ if (_this2.orbitControls) {
251
+ _this2.orbitControls.enabled = true;
252
+ }
257
253
 
258
- // Update paths after translation is complete
259
- // Only if we translated components (not segments/gateways - they handle paths internally)
260
- if (_this2.currentMode === 'translate' && _this2.sceneViewer && typeof _this2.sceneViewer.updatePaths === 'function') {
261
- // Check if any of the selected objects are components (not segments or gateways)
262
- var hasComponents = _this2.selectedObjects.some(function (obj) {
263
- return !isSegment(obj) && !isGateway(obj);
264
- });
265
- if (hasComponents) {
266
- console.log('🔄 Updating paths after component translation...');
267
- try {
268
- _this2.sceneViewer.updatePaths();
269
- console.log('✅ Paths updated successfully after translation');
270
- } catch (error) {
271
- console.error('❌ Error updating paths after translation:', error);
272
- }
273
- } else {
274
- console.log('â„šī¸ Skipping updatePaths - segments/gateways handle their own path updates');
254
+ // Apply multi-selection transforms (works for single or multiple objects)
255
+ // IMPORTANT: We await this to prevent race conditions with updatePaths()
256
+ if (!(_this2.selectedObjects.length > 0 && _this2.multiSelectionGroup)) {
257
+ _context.n = 2;
258
+ break;
259
+ }
260
+ _context.n = 1;
261
+ return _this2.applyMultiSelectionTransform().catch(function (error) {
262
+ console.error('❌ Error in applyMultiSelectionTransform:', error);
263
+ });
264
+ case 1:
265
+ // applyMultiSelectionTransform() already calls updatePaths() once at the end
266
+ // so we skip the additional updatePaths() call below
267
+ console.log('✅ Multi-selection transform complete (updatePaths already called)');
268
+ _context.n = 3;
269
+ break;
270
+ case 2:
271
+ if (_this2.currentMode === 'translate' && _this2.sceneViewer && typeof _this2.sceneViewer.updatePaths === 'function') {
272
+ // Update paths after translation is complete
273
+ // Only if we translated components (not segments/gateways - they handle paths internally)
274
+ // This branch only executes when NOT in multi-selection mode
275
+ hasComponents = _this2.selectedObjects.some(function (obj) {
276
+ return !isSegment(obj) && !isGateway(obj);
277
+ });
278
+ if (hasComponents) {
279
+ console.log('🔄 Updating paths after component translation...');
280
+ try {
281
+ _this2.sceneViewer.updatePaths();
282
+ console.log('✅ Paths updated successfully after translation');
283
+ } catch (error) {
284
+ console.error('❌ Error updating paths after translation:', error);
285
+ }
286
+ } else {
287
+ console.log('â„šī¸ Skipping updatePaths - segments/gateways handle their own path updates');
288
+ }
289
+ }
290
+ case 3:
291
+ // Dispatch custom scene update event after transform completes
292
+ if (typeof window !== 'undefined') {
293
+ console.log('📡 Dispatching sceneUpdateComplete event after transform');
294
+ sceneCompleteEvent = new CustomEvent('sceneUpdateComplete', {
295
+ detail: {
296
+ timestamp: Date.now(),
297
+ transformType: _this2.currentMode,
298
+ objectName: ((_this2$selectedObject = _this2.selectedObjects[0]) === null || _this2$selectedObject === void 0 ? void 0 : _this2$selectedObject.name) || 'unknown',
299
+ objectCount: _this2.selectedObjects.length
300
+ }
301
+ });
302
+ window.dispatchEvent(sceneCompleteEvent);
303
+ }
304
+ console.log("\u2705 Transform completed: ".concat(_this2.currentMode, " mode"));
305
+ case 4:
306
+ return _context.a(2);
275
307
  }
276
- }
277
-
278
- // Dispatch custom scene update event after transform completes
279
- if (typeof window !== 'undefined') {
280
- var _this2$selectedObject;
281
- console.log('📡 Dispatching sceneUpdateComplete event after transform');
282
- var sceneCompleteEvent = new CustomEvent('sceneUpdateComplete', {
283
- detail: {
284
- timestamp: Date.now(),
285
- transformType: _this2.currentMode,
286
- objectName: ((_this2$selectedObject = _this2.selectedObjects[0]) === null || _this2$selectedObject === void 0 ? void 0 : _this2$selectedObject.name) || 'unknown',
287
- objectCount: _this2.selectedObjects.length
288
- }
289
- });
290
- window.dispatchEvent(sceneCompleteEvent);
291
- }
292
- console.log("\u2705 Transform completed: ".concat(_this2.currentMode, " mode"));
293
- };
308
+ }, _callee);
309
+ }));
294
310
  // Transform changing event
295
311
  this.eventHandlers.transforming = function () {
296
312
  // Apply real-time visual transformation to objects during drag
@@ -522,7 +538,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
522
538
  }, {
523
539
  key: "_isValidSelectableObject",
524
540
  value: function _isValidSelectableObject(object) {
525
- var _object$userData;
541
+ var _object$userData, _object$userData2;
526
542
  // Safety check: ensure object is still valid and in the scene
527
543
  if (!object || !object.parent) {
528
544
  console.warn('âš ī¸ Selected object is no longer valid or in scene');
@@ -540,6 +556,12 @@ var TransformControlsManager = /*#__PURE__*/function () {
540
556
  console.warn('âš ī¸ Object is marked as non-selectable (stub segment)');
541
557
  return false;
542
558
  }
559
+
560
+ // Check if object is marked as immutable (computed segments/elbows from pathfinder)
561
+ if (((_object$userData2 = object.userData) === null || _object$userData2 === void 0 ? void 0 : _object$userData2.immutable) === true) {
562
+ console.warn('âš ī¸ Object is immutable (computed from pathfinder)');
563
+ return false;
564
+ }
543
565
  return true;
544
566
  }
545
567
 
@@ -579,7 +601,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
579
601
  }, {
580
602
  key: "isSelectableObject",
581
603
  value: function isSelectableObject(object) {
582
- var _object$userData2, _object$userData3, _object$userData4, _object$userData5, _object$userData6, _object$userData7, _object$userData8;
604
+ var _object$userData3, _object$userData4, _object$userData5, _object$userData6, _object$userData7, _object$userData8, _object$userData9, _object$userData0;
583
605
  // Basic safety checks
584
606
  if (!object || !object.isObject3D) {
585
607
  return false;
@@ -591,25 +613,30 @@ var TransformControlsManager = /*#__PURE__*/function () {
591
613
  }
592
614
 
593
615
  // Skip helpers and special objects
594
- var isHelper = object.isHelper || ((_object$userData2 = object.userData) === null || _object$userData2 === void 0 ? void 0 : _object$userData2.isHelper) || ((_object$userData3 = object.userData) === null || _object$userData3 === void 0 ? void 0 : _object$userData3.isBoundingBox);
595
- var isBaseGround = (_object$userData4 = object.userData) === null || _object$userData4 === void 0 ? void 0 : _object$userData4.isBaseGround;
596
- var isBrickWall = (_object$userData5 = object.userData) === null || _object$userData5 === void 0 ? void 0 : _object$userData5.isBrickWall;
616
+ var isHelper = object.isHelper || ((_object$userData3 = object.userData) === null || _object$userData3 === void 0 ? void 0 : _object$userData3.isHelper) || ((_object$userData4 = object.userData) === null || _object$userData4 === void 0 ? void 0 : _object$userData4.isBoundingBox);
617
+ var isBaseGround = (_object$userData5 = object.userData) === null || _object$userData5 === void 0 ? void 0 : _object$userData5.isBaseGround;
618
+ var isBrickWall = (_object$userData6 = object.userData) === null || _object$userData6 === void 0 ? void 0 : _object$userData6.isBrickWall;
597
619
  if (isHelper || isBaseGround || isBrickWall || !object.visible) {
598
620
  return false;
599
621
  }
600
622
 
601
623
  // Skip segment connectors - they should not be selectable for transformation
602
- if (((_object$userData6 = object.userData) === null || _object$userData6 === void 0 ? void 0 : _object$userData6.objectType) === 'segment-connector') {
624
+ if (((_object$userData7 = object.userData) === null || _object$userData7 === void 0 ? void 0 : _object$userData7.objectType) === 'segment-connector') {
603
625
  return false;
604
626
  }
605
627
 
606
628
  // Check if object has explicit selectable flag set to false
607
- if (((_object$userData7 = object.userData) === null || _object$userData7 === void 0 ? void 0 : _object$userData7.selectable) === false) {
629
+ if (((_object$userData8 = object.userData) === null || _object$userData8 === void 0 ? void 0 : _object$userData8.selectable) === false) {
630
+ return false;
631
+ }
632
+
633
+ // Check if object is marked as immutable (computed segments/elbows from pathfinder)
634
+ if (((_object$userData9 = object.userData) === null || _object$userData9 === void 0 ? void 0 : _object$userData9.immutable) === true) {
608
635
  return false;
609
636
  }
610
637
 
611
638
  // Allow components, gateways, and segments to be selected
612
- var objectType = (_object$userData8 = object.userData) === null || _object$userData8 === void 0 ? void 0 : _object$userData8.objectType;
639
+ var objectType = (_object$userData0 = object.userData) === null || _object$userData0 === void 0 ? void 0 : _object$userData0.objectType;
613
640
  return objectType === 'component' || objectType === 'gateway' || isSegment(object);
614
641
  }
615
642
  /**
@@ -1284,7 +1311,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1284
1311
 
1285
1312
  // Traverse scene to find selectable objects
1286
1313
  this.scene.traverse(function (object) {
1287
- var _object$userData9, _object$userData0;
1314
+ var _object$userData1, _object$userData10;
1288
1315
  // Skip invalid objects and helpers early
1289
1316
  if (!object || !object.isObject3D) {
1290
1317
  return;
@@ -1296,7 +1323,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1296
1323
  }
1297
1324
 
1298
1325
  // Skip other helpers and special objects
1299
- if (object.isHelper || (_object$userData9 = object.userData) !== null && _object$userData9 !== void 0 && _object$userData9.isHelper || (_object$userData0 = object.userData) !== null && _object$userData0 !== void 0 && _object$userData0.isBoundingBox) {
1326
+ if (object.isHelper || (_object$userData1 = object.userData) !== null && _object$userData1 !== void 0 && _object$userData1.isHelper || (_object$userData10 = object.userData) !== null && _object$userData10 !== void 0 && _object$userData10.isBoundingBox) {
1300
1327
  return;
1301
1328
  }
1302
1329
  try {
@@ -1468,17 +1495,17 @@ var TransformControlsManager = /*#__PURE__*/function () {
1468
1495
  }, {
1469
1496
  key: "applyMultiSelectionTransform",
1470
1497
  value: (function () {
1471
- var _applyMultiSelectionTransform = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
1498
+ var _applyMultiSelectionTransform = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
1472
1499
  var _this9 = this;
1473
- var groupPosition, originalCentroid, positionDelta, deltaX, deltaY, deltaZ, threshold, _this$sceneViewer, segments, gateways, components, transformOpsManager, THROTTLE_DELAY, SEGMENT_DELAY, _throttleDelay, _loop, i, _THROTTLE_DELAY, _SEGMENT_DELAY, _throttleDelay2, _loop2, _i, GATEWAY_THROTTLE, GATEWAY_DELAY, COMPONENT_THROTTLE, COMPONENT_DELAY, throttleDelay, _i2, _gateway$userData, gateway, gatewayId, _i3, _component$userData, component, componentId;
1474
- return _regenerator().w(function (_context3) {
1475
- while (1) switch (_context3.n) {
1500
+ var groupPosition, originalCentroid, positionDelta, deltaX, deltaY, deltaZ, threshold, _this$sceneViewer, _this$sceneViewer2, _this$sceneViewer3, _this$sceneViewer4, _this$sceneViewer5, segments, gateways, components, transformOpsManager, THROTTLE_DELAY, SEGMENT_DELAY, _throttleDelay, _loop, i, _THROTTLE_DELAY, _SEGMENT_DELAY, _throttleDelay2, _loop2, _i, GATEWAY_THROTTLE, GATEWAY_DELAY, COMPONENT_THROTTLE, COMPONENT_DELAY, throttleDelay, _i2, _gateway$userData, gateway, gatewayId, _i3, _component$userData, component, componentId;
1501
+ return _regenerator().w(function (_context4) {
1502
+ while (1) switch (_context4.n) {
1476
1503
  case 0:
1477
1504
  if (!(!this.multiSelectionGroup || this.selectedObjects.length === 0)) {
1478
- _context3.n = 1;
1505
+ _context4.n = 1;
1479
1506
  break;
1480
1507
  }
1481
- return _context3.a(2);
1508
+ return _context4.a(2);
1482
1509
  case 1:
1483
1510
  console.log("\uD83D\uDD27 Applying multi-selection transform to ".concat(this.selectedObjects.length, " objects"));
1484
1511
 
@@ -1507,7 +1534,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1507
1534
  // Only process if there's a meaningful translation
1508
1535
  threshold = 0.001;
1509
1536
  if (!(this.currentMode === 'translate' && positionDelta.length() > threshold)) {
1510
- _context3.n = 21;
1537
+ _context4.n = 21;
1511
1538
  break;
1512
1539
  }
1513
1540
  // FIRST: Reset all objects to their original positions
@@ -1530,14 +1557,23 @@ var TransformControlsManager = /*#__PURE__*/function () {
1530
1557
  });
1531
1558
  components = this.selectedObjects.filter(function (obj) {
1532
1559
  return !isSegment(obj) && !isGateway(obj);
1533
- }); // BATCH SEGMENT TRANSLATIONS: Call translateSegment with skipPathUpdate=true
1560
+ }); // Debug: Check availability of managers
1561
+ console.log('🔍 Debug - sceneViewer available:', !!this.sceneViewer);
1562
+ console.log('🔍 Debug - sceneViewer.managers available:', !!((_this$sceneViewer = this.sceneViewer) !== null && _this$sceneViewer !== void 0 && _this$sceneViewer.managers));
1563
+ console.log('🔍 Debug - Available managers:', (_this$sceneViewer2 = this.sceneViewer) !== null && _this$sceneViewer2 !== void 0 && _this$sceneViewer2.managers ? Object.keys(this.sceneViewer.managers) : 'none');
1564
+ console.log('🔍 Debug - transformOperationsManager (direct):', !!((_this$sceneViewer3 = this.sceneViewer) !== null && _this$sceneViewer3 !== void 0 && _this$sceneViewer3.transformOperationsManager));
1565
+ console.log('🔍 Debug - transformOperations (managers.transformOperations):', !!((_this$sceneViewer4 = this.sceneViewer) !== null && _this$sceneViewer4 !== void 0 && (_this$sceneViewer4 = _this$sceneViewer4.managers) !== null && _this$sceneViewer4 !== void 0 && _this$sceneViewer4.transformOperations));
1566
+ console.log('🔍 Debug - Segments to translate:', segments.length);
1567
+
1568
+ // BATCH SEGMENT TRANSLATIONS: Call translateSegment with skipPathUpdate=true
1534
1569
  // Process segments SEQUENTIALLY with throttling for maximum stability
1535
- if (!(segments.length > 0 && (_this$sceneViewer = this.sceneViewer) !== null && _this$sceneViewer !== void 0 && (_this$sceneViewer = _this$sceneViewer.managers) !== null && _this$sceneViewer !== void 0 && _this$sceneViewer.transformOperations)) {
1536
- _context3.n = 5;
1570
+ // Access transformOperationsManager directly from sceneViewer (it's attached in attachToComponent)
1571
+ if (!(segments.length > 0 && (_this$sceneViewer5 = this.sceneViewer) !== null && _this$sceneViewer5 !== void 0 && _this$sceneViewer5.transformOperationsManager)) {
1572
+ _context4.n = 5;
1537
1573
  break;
1538
1574
  }
1539
1575
  console.log("\uD83D\uDD27 Batch translating ".concat(segments.length, " segments (sequential with throttling)..."));
1540
- transformOpsManager = this.sceneViewer.managers.transformOperations; // Throttle delay in milliseconds (adjust as needed for stability)
1576
+ transformOpsManager = this.sceneViewer.transformOperationsManager; // Throttle delay in milliseconds (adjust as needed for stability)
1541
1577
  THROTTLE_DELAY = 10; // 10ms between axis operations
1542
1578
  SEGMENT_DELAY = 20; // 20ms between segments
1543
1579
  // Helper function for throttled delay
@@ -1548,13 +1584,13 @@ var TransformControlsManager = /*#__PURE__*/function () {
1548
1584
  }; // Process each segment sequentially with throttling for stability
1549
1585
  _loop = /*#__PURE__*/_regenerator().m(function _loop(i) {
1550
1586
  var segment, _segment$userData, _segment$userData2, segmentId, success, newSegmentId, _segment$userData3, _segment$userData4, _segmentId, _success, _newSegmentId, _segment$userData5, _segment$userData6, _segmentId2, _success2, _newSegmentId2, selectedIndex;
1551
- return _regenerator().w(function (_context) {
1552
- while (1) switch (_context.n) {
1587
+ return _regenerator().w(function (_context2) {
1588
+ while (1) switch (_context2.n) {
1553
1589
  case 0:
1554
1590
  segment = segments[i]; // Call translateSegment API with skipPathUpdate=true to defer path updates
1555
1591
  // IMPORTANT: Refresh segment reference after each axis to handle UUID changes from manualization
1556
1592
  if (!(Math.abs(deltaX) > threshold)) {
1557
- _context.n = 1;
1593
+ _context2.n = 1;
1558
1594
  break;
1559
1595
  }
1560
1596
  segmentId = segment.uuid || ((_segment$userData = segment.userData) === null || _segment$userData === void 0 ? void 0 : _segment$userData.originalUuid);
@@ -1564,7 +1600,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1564
1600
  }
1565
1601
  // Refresh segment reference by searching for the new UUID or by segmentIndex
1566
1602
  // After manualization, UUID changes from SEGMENT-X to Segment-X
1567
- newSegmentId = (_segment$userData2 = segment.userData) !== null && _segment$userData2 !== void 0 && _segment$userData2.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : segmentId;
1603
+ newSegmentId = (_segment$userData2 = segment.userData) !== null && _segment$userData2 !== void 0 && _segment$userData2.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : segmentId;
1568
1604
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', newSegmentId) || segment;
1569
1605
 
1570
1606
  // Update matrix to ensure geometry is current for next operation
@@ -1572,11 +1608,11 @@ var TransformControlsManager = /*#__PURE__*/function () {
1572
1608
  segment.updateMatrix();
1573
1609
  segment.updateMatrixWorld(true);
1574
1610
  }
1575
- _context.n = 1;
1611
+ _context2.n = 1;
1576
1612
  return _throttleDelay(THROTTLE_DELAY);
1577
1613
  case 1:
1578
1614
  if (!(Math.abs(deltaY) > threshold)) {
1579
- _context.n = 2;
1615
+ _context2.n = 2;
1580
1616
  break;
1581
1617
  }
1582
1618
  _segmentId = segment.uuid || ((_segment$userData3 = segment.userData) === null || _segment$userData3 === void 0 ? void 0 : _segment$userData3.originalUuid);
@@ -1585,7 +1621,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1585
1621
  console.warn("\u26A0\uFE0F Failed to translate segment ".concat(_segmentId, " on Y axis"));
1586
1622
  }
1587
1623
  // Refresh segment reference by searching for the new UUID
1588
- _newSegmentId = (_segment$userData4 = segment.userData) !== null && _segment$userData4 !== void 0 && _segment$userData4.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : _segmentId;
1624
+ _newSegmentId = (_segment$userData4 = segment.userData) !== null && _segment$userData4 !== void 0 && _segment$userData4.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : _segmentId;
1589
1625
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', _newSegmentId) || segment;
1590
1626
 
1591
1627
  // Update matrix to ensure geometry is current for next operation
@@ -1593,11 +1629,11 @@ var TransformControlsManager = /*#__PURE__*/function () {
1593
1629
  segment.updateMatrix();
1594
1630
  segment.updateMatrixWorld(true);
1595
1631
  }
1596
- _context.n = 2;
1632
+ _context2.n = 2;
1597
1633
  return _throttleDelay(THROTTLE_DELAY);
1598
1634
  case 2:
1599
1635
  if (!(Math.abs(deltaZ) > threshold)) {
1600
- _context.n = 3;
1636
+ _context2.n = 3;
1601
1637
  break;
1602
1638
  }
1603
1639
  _segmentId2 = segment.uuid || ((_segment$userData5 = segment.userData) === null || _segment$userData5 === void 0 ? void 0 : _segment$userData5.originalUuid);
@@ -1606,7 +1642,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1606
1642
  console.warn("\u26A0\uFE0F Failed to translate segment ".concat(_segmentId2, " on Z axis"));
1607
1643
  }
1608
1644
  // Refresh segment reference by searching for the new UUID
1609
- _newSegmentId2 = (_segment$userData6 = segment.userData) !== null && _segment$userData6 !== void 0 && _segment$userData6.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : _segmentId2;
1645
+ _newSegmentId2 = (_segment$userData6 = segment.userData) !== null && _segment$userData6 !== void 0 && _segment$userData6.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : _segmentId2;
1610
1646
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', _newSegmentId2) || segment;
1611
1647
 
1612
1648
  // Update matrix to ensure geometry is current for next operation
@@ -1614,7 +1650,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1614
1650
  segment.updateMatrix();
1615
1651
  segment.updateMatrixWorld(true);
1616
1652
  }
1617
- _context.n = 3;
1653
+ _context2.n = 3;
1618
1654
  return _throttleDelay(THROTTLE_DELAY);
1619
1655
  case 3:
1620
1656
  // Update the segment in the selectedObjects array with the refreshed reference
@@ -1634,34 +1670,38 @@ var TransformControlsManager = /*#__PURE__*/function () {
1634
1670
  _this9.selectedObjects[selectedIndex] = segment;
1635
1671
  console.log("\u2705 Updated selectedObjects[".concat(selectedIndex, "] with refreshed segment reference"));
1636
1672
  }
1637
- console.log("\uD83D\uDCE6 Segment ".concat(segment.name, " translated (").concat(i + 1, "/").concat(segments.length, "):"), {
1638
- deltaX: deltaX,
1639
- deltaY: deltaY,
1640
- deltaZ: deltaZ
1641
- });
1673
+ if (segment) {
1674
+ console.log("\uD83D\uDCE6 Segment ".concat(segment.name, " translated (").concat(i + 1, "/").concat(segments.length, "):"), {
1675
+ deltaX: deltaX,
1676
+ deltaY: deltaY,
1677
+ deltaZ: deltaZ
1678
+ });
1679
+ } else {
1680
+ console.warn("\u26A0\uFE0F Segment reference became null after translation (".concat(i + 1, "/").concat(segments.length, ")"));
1681
+ }
1642
1682
 
1643
1683
  // Delay between segments to ensure all updates propagate
1644
1684
  if (!(i < segments.length - 1)) {
1645
- _context.n = 4;
1685
+ _context2.n = 4;
1646
1686
  break;
1647
1687
  }
1648
- _context.n = 4;
1688
+ _context2.n = 4;
1649
1689
  return _throttleDelay(SEGMENT_DELAY);
1650
1690
  case 4:
1651
- return _context.a(2);
1691
+ return _context2.a(2);
1652
1692
  }
1653
1693
  }, _loop);
1654
1694
  });
1655
1695
  i = 0;
1656
1696
  case 2:
1657
1697
  if (!(i < segments.length)) {
1658
- _context3.n = 4;
1698
+ _context4.n = 4;
1659
1699
  break;
1660
1700
  }
1661
- return _context3.d(_regeneratorValues(_loop(i)), 3);
1701
+ return _context4.d(_regeneratorValues(_loop(i)), 3);
1662
1702
  case 3:
1663
1703
  i++;
1664
- _context3.n = 2;
1704
+ _context4.n = 2;
1665
1705
  break;
1666
1706
  case 4:
1667
1707
  // Only call updatePaths ONCE after all segments are translated
@@ -1670,11 +1710,11 @@ var TransformControlsManager = /*#__PURE__*/function () {
1670
1710
  this.sceneViewer.updatePaths();
1671
1711
  console.log('✅ Paths regenerated successfully for all segments');
1672
1712
  }
1673
- _context3.n = 8;
1713
+ _context4.n = 8;
1674
1714
  break;
1675
1715
  case 5:
1676
1716
  if (!(segments.length > 0)) {
1677
- _context3.n = 8;
1717
+ _context4.n = 8;
1678
1718
  break;
1679
1719
  }
1680
1720
  // Fallback to individual API calls if manager not available
@@ -1691,18 +1731,18 @@ var TransformControlsManager = /*#__PURE__*/function () {
1691
1731
  };
1692
1732
  _loop2 = /*#__PURE__*/_regenerator().m(function _loop2(_i) {
1693
1733
  var segment, _segment$userData7, _segment$userData8, segmentId, newSegmentId, _segment$userData9, _segment$userData0, _segmentId3, _newSegmentId3, _segment$userData1, _segment$userData10, _segmentId4, _newSegmentId4, selectedIndex;
1694
- return _regenerator().w(function (_context2) {
1695
- while (1) switch (_context2.n) {
1734
+ return _regenerator().w(function (_context3) {
1735
+ while (1) switch (_context3.n) {
1696
1736
  case 0:
1697
1737
  segment = segments[_i];
1698
1738
  if (!(Math.abs(deltaX) > threshold)) {
1699
- _context2.n = 1;
1739
+ _context3.n = 1;
1700
1740
  break;
1701
1741
  }
1702
1742
  segmentId = segment.uuid || ((_segment$userData7 = segment.userData) === null || _segment$userData7 === void 0 ? void 0 : _segment$userData7.originalUuid);
1703
1743
  _this9.centralPlant.translateSegment(segmentId, 'x', deltaX);
1704
1744
  // Refresh segment reference by searching for the new UUID after manualization
1705
- newSegmentId = (_segment$userData8 = segment.userData) !== null && _segment$userData8 !== void 0 && _segment$userData8.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : segmentId;
1745
+ newSegmentId = (_segment$userData8 = segment.userData) !== null && _segment$userData8 !== void 0 && _segment$userData8.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : segmentId;
1706
1746
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', newSegmentId) || segment;
1707
1747
 
1708
1748
  // Update matrix to ensure geometry is current for next operation
@@ -1710,17 +1750,17 @@ var TransformControlsManager = /*#__PURE__*/function () {
1710
1750
  segment.updateMatrix();
1711
1751
  segment.updateMatrixWorld(true);
1712
1752
  }
1713
- _context2.n = 1;
1753
+ _context3.n = 1;
1714
1754
  return _throttleDelay2(_THROTTLE_DELAY);
1715
1755
  case 1:
1716
1756
  if (!(Math.abs(deltaY) > threshold)) {
1717
- _context2.n = 2;
1757
+ _context3.n = 2;
1718
1758
  break;
1719
1759
  }
1720
1760
  _segmentId3 = segment.uuid || ((_segment$userData9 = segment.userData) === null || _segment$userData9 === void 0 ? void 0 : _segment$userData9.originalUuid);
1721
1761
  _this9.centralPlant.translateSegment(_segmentId3, 'y', deltaY);
1722
1762
  // Refresh segment reference by searching for the new UUID after manualization
1723
- _newSegmentId3 = (_segment$userData0 = segment.userData) !== null && _segment$userData0 !== void 0 && _segment$userData0.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : _segmentId3;
1763
+ _newSegmentId3 = (_segment$userData0 = segment.userData) !== null && _segment$userData0 !== void 0 && _segment$userData0.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : _segmentId3;
1724
1764
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', _newSegmentId3) || segment;
1725
1765
 
1726
1766
  // Update matrix to ensure geometry is current for next operation
@@ -1728,17 +1768,17 @@ var TransformControlsManager = /*#__PURE__*/function () {
1728
1768
  segment.updateMatrix();
1729
1769
  segment.updateMatrixWorld(true);
1730
1770
  }
1731
- _context2.n = 2;
1771
+ _context3.n = 2;
1732
1772
  return _throttleDelay2(_THROTTLE_DELAY);
1733
1773
  case 2:
1734
1774
  if (!(Math.abs(deltaZ) > threshold)) {
1735
- _context2.n = 3;
1775
+ _context3.n = 3;
1736
1776
  break;
1737
1777
  }
1738
1778
  _segmentId4 = segment.uuid || ((_segment$userData1 = segment.userData) === null || _segment$userData1 === void 0 ? void 0 : _segment$userData1.originalUuid);
1739
1779
  _this9.centralPlant.translateSegment(_segmentId4, 'z', deltaZ);
1740
1780
  // Refresh segment reference by searching for the new UUID after manualization
1741
- _newSegmentId4 = (_segment$userData10 = segment.userData) !== null && _segment$userData10 !== void 0 && _segment$userData10.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : _segmentId4;
1781
+ _newSegmentId4 = (_segment$userData10 = segment.userData) !== null && _segment$userData10 !== void 0 && _segment$userData10.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : _segmentId4;
1742
1782
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', _newSegmentId4) || segment;
1743
1783
 
1744
1784
  // Update matrix to ensure geometry is current for next operation
@@ -1746,7 +1786,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1746
1786
  segment.updateMatrix();
1747
1787
  segment.updateMatrixWorld(true);
1748
1788
  }
1749
- _context2.n = 3;
1789
+ _context3.n = 3;
1750
1790
  return _throttleDelay2(_THROTTLE_DELAY);
1751
1791
  case 3:
1752
1792
  // Update the segment in the selectedObjects array with the refreshed reference
@@ -1765,34 +1805,38 @@ var TransformControlsManager = /*#__PURE__*/function () {
1765
1805
  _this9.selectedObjects[selectedIndex] = segment;
1766
1806
  console.log("\u2705 Updated selectedObjects[".concat(selectedIndex, "] with refreshed segment reference"));
1767
1807
  }
1768
- console.log("\uD83D\uDCE6 Segment ".concat(segment.name, " translated (").concat(_i + 1, "/").concat(segments.length, "):"), {
1769
- deltaX: deltaX,
1770
- deltaY: deltaY,
1771
- deltaZ: deltaZ
1772
- });
1808
+ if (segment) {
1809
+ console.log("\uD83D\uDCE6 Segment ".concat(segment.name, " translated (").concat(_i + 1, "/").concat(segments.length, "):"), {
1810
+ deltaX: deltaX,
1811
+ deltaY: deltaY,
1812
+ deltaZ: deltaZ
1813
+ });
1814
+ } else {
1815
+ console.warn("\u26A0\uFE0F Segment reference became null after translation (".concat(_i + 1, "/").concat(segments.length, ")"));
1816
+ }
1773
1817
 
1774
1818
  // Delay between segments
1775
1819
  if (!(_i < segments.length - 1)) {
1776
- _context2.n = 4;
1820
+ _context3.n = 4;
1777
1821
  break;
1778
1822
  }
1779
- _context2.n = 4;
1823
+ _context3.n = 4;
1780
1824
  return _throttleDelay2(_SEGMENT_DELAY);
1781
1825
  case 4:
1782
- return _context2.a(2);
1826
+ return _context3.a(2);
1783
1827
  }
1784
1828
  }, _loop2);
1785
1829
  });
1786
1830
  _i = 0;
1787
1831
  case 6:
1788
1832
  if (!(_i < segments.length)) {
1789
- _context3.n = 8;
1833
+ _context4.n = 8;
1790
1834
  break;
1791
1835
  }
1792
- return _context3.d(_regeneratorValues(_loop2(_i)), 7);
1836
+ return _context4.d(_regeneratorValues(_loop2(_i)), 7);
1793
1837
  case 7:
1794
1838
  _i++;
1795
- _context3.n = 6;
1839
+ _context4.n = 6;
1796
1840
  break;
1797
1841
  case 8:
1798
1842
  // Throttle delays for gateways and components
@@ -1808,33 +1852,33 @@ var TransformControlsManager = /*#__PURE__*/function () {
1808
1852
  _i2 = 0;
1809
1853
  case 9:
1810
1854
  if (!(_i2 < gateways.length)) {
1811
- _context3.n = 14;
1855
+ _context4.n = 14;
1812
1856
  break;
1813
1857
  }
1814
1858
  gateway = gateways[_i2];
1815
1859
  gatewayId = gateway.uuid || ((_gateway$userData = gateway.userData) === null || _gateway$userData === void 0 ? void 0 : _gateway$userData.originalUuid);
1816
1860
  if (!(Math.abs(deltaX) > threshold)) {
1817
- _context3.n = 10;
1861
+ _context4.n = 10;
1818
1862
  break;
1819
1863
  }
1820
1864
  this.centralPlant.translateGateway(gatewayId, 'x', deltaX);
1821
- _context3.n = 10;
1865
+ _context4.n = 10;
1822
1866
  return throttleDelay(GATEWAY_THROTTLE);
1823
1867
  case 10:
1824
1868
  if (!(Math.abs(deltaY) > threshold)) {
1825
- _context3.n = 11;
1869
+ _context4.n = 11;
1826
1870
  break;
1827
1871
  }
1828
1872
  this.centralPlant.translateGateway(gatewayId, 'y', deltaY);
1829
- _context3.n = 11;
1873
+ _context4.n = 11;
1830
1874
  return throttleDelay(GATEWAY_THROTTLE);
1831
1875
  case 11:
1832
1876
  if (!(Math.abs(deltaZ) > threshold)) {
1833
- _context3.n = 12;
1877
+ _context4.n = 12;
1834
1878
  break;
1835
1879
  }
1836
1880
  this.centralPlant.translateGateway(gatewayId, 'z', deltaZ);
1837
- _context3.n = 12;
1881
+ _context4.n = 12;
1838
1882
  return throttleDelay(GATEWAY_THROTTLE);
1839
1883
  case 12:
1840
1884
  console.log("\uD83D\uDEAA Gateway ".concat(gateway.name, " translated (").concat(_i2 + 1, "/").concat(gateways.length, "):"), {
@@ -1845,46 +1889,46 @@ var TransformControlsManager = /*#__PURE__*/function () {
1845
1889
 
1846
1890
  // Delay between gateways
1847
1891
  if (!(_i2 < gateways.length - 1)) {
1848
- _context3.n = 13;
1892
+ _context4.n = 13;
1849
1893
  break;
1850
1894
  }
1851
- _context3.n = 13;
1895
+ _context4.n = 13;
1852
1896
  return throttleDelay(GATEWAY_DELAY);
1853
1897
  case 13:
1854
1898
  _i2++;
1855
- _context3.n = 9;
1899
+ _context4.n = 9;
1856
1900
  break;
1857
1901
  case 14:
1858
1902
  _i3 = 0;
1859
1903
  case 15:
1860
1904
  if (!(_i3 < components.length)) {
1861
- _context3.n = 20;
1905
+ _context4.n = 20;
1862
1906
  break;
1863
1907
  }
1864
1908
  component = components[_i3];
1865
1909
  componentId = component.uuid || ((_component$userData = component.userData) === null || _component$userData === void 0 ? void 0 : _component$userData.originalUuid);
1866
1910
  if (!(Math.abs(deltaX) > threshold)) {
1867
- _context3.n = 16;
1911
+ _context4.n = 16;
1868
1912
  break;
1869
1913
  }
1870
1914
  this.centralPlant.translate(componentId, 'x', deltaX);
1871
- _context3.n = 16;
1915
+ _context4.n = 16;
1872
1916
  return throttleDelay(COMPONENT_THROTTLE);
1873
1917
  case 16:
1874
1918
  if (!(Math.abs(deltaY) > threshold)) {
1875
- _context3.n = 17;
1919
+ _context4.n = 17;
1876
1920
  break;
1877
1921
  }
1878
1922
  this.centralPlant.translate(componentId, 'y', deltaY);
1879
- _context3.n = 17;
1923
+ _context4.n = 17;
1880
1924
  return throttleDelay(COMPONENT_THROTTLE);
1881
1925
  case 17:
1882
1926
  if (!(Math.abs(deltaZ) > threshold)) {
1883
- _context3.n = 18;
1927
+ _context4.n = 18;
1884
1928
  break;
1885
1929
  }
1886
1930
  this.centralPlant.translate(componentId, 'z', deltaZ);
1887
- _context3.n = 18;
1931
+ _context4.n = 18;
1888
1932
  return throttleDelay(COMPONENT_THROTTLE);
1889
1933
  case 18:
1890
1934
  console.log("\uD83D\uDD27 Component ".concat(component.name, " translated (").concat(_i3 + 1, "/").concat(components.length, "):"), {
@@ -1895,14 +1939,14 @@ var TransformControlsManager = /*#__PURE__*/function () {
1895
1939
 
1896
1940
  // Delay between components
1897
1941
  if (!(_i3 < components.length - 1)) {
1898
- _context3.n = 19;
1942
+ _context4.n = 19;
1899
1943
  break;
1900
1944
  }
1901
- _context3.n = 19;
1945
+ _context4.n = 19;
1902
1946
  return throttleDelay(COMPONENT_DELAY);
1903
1947
  case 19:
1904
1948
  _i3++;
1905
- _context3.n = 15;
1949
+ _context4.n = 15;
1906
1950
  break;
1907
1951
  case 20:
1908
1952
  console.log("\u2705 All ".concat(this.selectedObjects.length, " objects translated with delta:"), {
@@ -1911,22 +1955,29 @@ var TransformControlsManager = /*#__PURE__*/function () {
1911
1955
  deltaZ: deltaZ
1912
1956
  });
1913
1957
  case 21:
1914
- // Reset the multi-selection group transform
1915
- this.multiSelectionGroup.position.set(0, 0, 0);
1916
- this.multiSelectionGroup.rotation.set(0, 0, 0);
1917
- this.multiSelectionGroup.scale.set(1, 1, 1);
1958
+ // Reset the multi-selection group transform (if it still exists)
1959
+ // Note: The group might have been cleared during async operations
1960
+ if (this.multiSelectionGroup) {
1961
+ this.multiSelectionGroup.position.set(0, 0, 0);
1962
+ this.multiSelectionGroup.rotation.set(0, 0, 0);
1963
+ this.multiSelectionGroup.scale.set(1, 1, 1);
1964
+ } else {
1965
+ console.warn('âš ī¸ Multi-selection group was cleared during transformation');
1966
+ }
1918
1967
 
1919
1968
  // CRITICAL: Clear bounding box cache after manualization
1920
1969
  // Manualization changes object references, making cached boxes invalid
1921
1970
  this.clearBoundingBoxCache();
1922
1971
 
1923
- // Update the multi-selection display with new positions
1924
- this.updateMultiSelection();
1972
+ // Update the multi-selection display with new positions (only if we still have selected objects)
1973
+ if (this.selectedObjects.length > 0) {
1974
+ this.updateMultiSelection();
1975
+ }
1925
1976
  console.log("\u2705 Multi-selection transform applied");
1926
1977
  case 22:
1927
- return _context3.a(2);
1978
+ return _context4.a(2);
1928
1979
  }
1929
- }, _callee, this);
1980
+ }, _callee2, this);
1930
1981
  }));
1931
1982
  function applyMultiSelectionTransform() {
1932
1983
  return _applyMultiSelectionTransform.apply(this, arguments);