@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.
@@ -263,58 +263,74 @@ var TransformControlsManager = /*#__PURE__*/function () {
263
263
  };
264
264
 
265
265
  // Transform end event
266
- this.eventHandlers.transformEnd = function () {
267
- _this2.transformState.isTransforming = false;
268
-
269
- // Re-enable orbit controls
270
- if (_this2.orbitControls) {
271
- _this2.orbitControls.enabled = true;
272
- }
266
+ this.eventHandlers.transformEnd = /*#__PURE__*/_rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee() {
267
+ var hasComponents, _this2$selectedObject, sceneCompleteEvent;
268
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context) {
269
+ while (1) switch (_context.n) {
270
+ case 0:
271
+ _this2.transformState.isTransforming = false;
273
272
 
274
- // Apply multi-selection transforms (works for single or multiple objects)
275
- // This is async but we don't await it to avoid blocking the event handler
276
- if (_this2.selectedObjects.length > 0 && _this2.multiSelectionGroup) {
277
- _this2.applyMultiSelectionTransform().catch(function (error) {
278
- console.error('❌ Error in applyMultiSelectionTransform:', error);
279
- });
280
- }
273
+ // Re-enable orbit controls
274
+ if (_this2.orbitControls) {
275
+ _this2.orbitControls.enabled = true;
276
+ }
281
277
 
282
- // Update paths after translation is complete
283
- // Only if we translated components (not segments/gateways - they handle paths internally)
284
- if (_this2.currentMode === 'translate' && _this2.sceneViewer && typeof _this2.sceneViewer.updatePaths === 'function') {
285
- // Check if any of the selected objects are components (not segments or gateways)
286
- var hasComponents = _this2.selectedObjects.some(function (obj) {
287
- return !objectTypes.isSegment(obj) && !objectTypes.isGateway(obj);
288
- });
289
- if (hasComponents) {
290
- console.log('🔄 Updating paths after component translation...');
291
- try {
292
- _this2.sceneViewer.updatePaths();
293
- console.log('✅ Paths updated successfully after translation');
294
- } catch (error) {
295
- console.error('❌ Error updating paths after translation:', error);
296
- }
297
- } else {
298
- console.log('â„šī¸ Skipping updatePaths - segments/gateways handle their own path updates');
278
+ // Apply multi-selection transforms (works for single or multiple objects)
279
+ // IMPORTANT: We await this to prevent race conditions with updatePaths()
280
+ if (!(_this2.selectedObjects.length > 0 && _this2.multiSelectionGroup)) {
281
+ _context.n = 2;
282
+ break;
283
+ }
284
+ _context.n = 1;
285
+ return _this2.applyMultiSelectionTransform().catch(function (error) {
286
+ console.error('❌ Error in applyMultiSelectionTransform:', error);
287
+ });
288
+ case 1:
289
+ // applyMultiSelectionTransform() already calls updatePaths() once at the end
290
+ // so we skip the additional updatePaths() call below
291
+ console.log('✅ Multi-selection transform complete (updatePaths already called)');
292
+ _context.n = 3;
293
+ break;
294
+ case 2:
295
+ if (_this2.currentMode === 'translate' && _this2.sceneViewer && typeof _this2.sceneViewer.updatePaths === 'function') {
296
+ // Update paths after translation is complete
297
+ // Only if we translated components (not segments/gateways - they handle paths internally)
298
+ // This branch only executes when NOT in multi-selection mode
299
+ hasComponents = _this2.selectedObjects.some(function (obj) {
300
+ return !objectTypes.isSegment(obj) && !objectTypes.isGateway(obj);
301
+ });
302
+ if (hasComponents) {
303
+ console.log('🔄 Updating paths after component translation...');
304
+ try {
305
+ _this2.sceneViewer.updatePaths();
306
+ console.log('✅ Paths updated successfully after translation');
307
+ } catch (error) {
308
+ console.error('❌ Error updating paths after translation:', error);
309
+ }
310
+ } else {
311
+ console.log('â„šī¸ Skipping updatePaths - segments/gateways handle their own path updates');
312
+ }
313
+ }
314
+ case 3:
315
+ // Dispatch custom scene update event after transform completes
316
+ if (typeof window !== 'undefined') {
317
+ console.log('📡 Dispatching sceneUpdateComplete event after transform');
318
+ sceneCompleteEvent = new CustomEvent('sceneUpdateComplete', {
319
+ detail: {
320
+ timestamp: Date.now(),
321
+ transformType: _this2.currentMode,
322
+ objectName: ((_this2$selectedObject = _this2.selectedObjects[0]) === null || _this2$selectedObject === void 0 ? void 0 : _this2$selectedObject.name) || 'unknown',
323
+ objectCount: _this2.selectedObjects.length
324
+ }
325
+ });
326
+ window.dispatchEvent(sceneCompleteEvent);
327
+ }
328
+ console.log("\u2705 Transform completed: ".concat(_this2.currentMode, " mode"));
329
+ case 4:
330
+ return _context.a(2);
299
331
  }
300
- }
301
-
302
- // Dispatch custom scene update event after transform completes
303
- if (typeof window !== 'undefined') {
304
- var _this2$selectedObject;
305
- console.log('📡 Dispatching sceneUpdateComplete event after transform');
306
- var sceneCompleteEvent = new CustomEvent('sceneUpdateComplete', {
307
- detail: {
308
- timestamp: Date.now(),
309
- transformType: _this2.currentMode,
310
- objectName: ((_this2$selectedObject = _this2.selectedObjects[0]) === null || _this2$selectedObject === void 0 ? void 0 : _this2$selectedObject.name) || 'unknown',
311
- objectCount: _this2.selectedObjects.length
312
- }
313
- });
314
- window.dispatchEvent(sceneCompleteEvent);
315
- }
316
- console.log("\u2705 Transform completed: ".concat(_this2.currentMode, " mode"));
317
- };
332
+ }, _callee);
333
+ }));
318
334
  // Transform changing event
319
335
  this.eventHandlers.transforming = function () {
320
336
  // Apply real-time visual transformation to objects during drag
@@ -546,7 +562,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
546
562
  }, {
547
563
  key: "_isValidSelectableObject",
548
564
  value: function _isValidSelectableObject(object) {
549
- var _object$userData;
565
+ var _object$userData, _object$userData2;
550
566
  // Safety check: ensure object is still valid and in the scene
551
567
  if (!object || !object.parent) {
552
568
  console.warn('âš ī¸ Selected object is no longer valid or in scene');
@@ -564,6 +580,12 @@ var TransformControlsManager = /*#__PURE__*/function () {
564
580
  console.warn('âš ī¸ Object is marked as non-selectable (stub segment)');
565
581
  return false;
566
582
  }
583
+
584
+ // Check if object is marked as immutable (computed segments/elbows from pathfinder)
585
+ if (((_object$userData2 = object.userData) === null || _object$userData2 === void 0 ? void 0 : _object$userData2.immutable) === true) {
586
+ console.warn('âš ī¸ Object is immutable (computed from pathfinder)');
587
+ return false;
588
+ }
567
589
  return true;
568
590
  }
569
591
 
@@ -603,7 +625,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
603
625
  }, {
604
626
  key: "isSelectableObject",
605
627
  value: function isSelectableObject(object) {
606
- var _object$userData2, _object$userData3, _object$userData4, _object$userData5, _object$userData6, _object$userData7, _object$userData8;
628
+ var _object$userData3, _object$userData4, _object$userData5, _object$userData6, _object$userData7, _object$userData8, _object$userData9, _object$userData0;
607
629
  // Basic safety checks
608
630
  if (!object || !object.isObject3D) {
609
631
  return false;
@@ -615,25 +637,30 @@ var TransformControlsManager = /*#__PURE__*/function () {
615
637
  }
616
638
 
617
639
  // Skip helpers and special objects
618
- 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);
619
- var isBaseGround = (_object$userData4 = object.userData) === null || _object$userData4 === void 0 ? void 0 : _object$userData4.isBaseGround;
620
- var isBrickWall = (_object$userData5 = object.userData) === null || _object$userData5 === void 0 ? void 0 : _object$userData5.isBrickWall;
640
+ 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);
641
+ var isBaseGround = (_object$userData5 = object.userData) === null || _object$userData5 === void 0 ? void 0 : _object$userData5.isBaseGround;
642
+ var isBrickWall = (_object$userData6 = object.userData) === null || _object$userData6 === void 0 ? void 0 : _object$userData6.isBrickWall;
621
643
  if (isHelper || isBaseGround || isBrickWall || !object.visible) {
622
644
  return false;
623
645
  }
624
646
 
625
647
  // Skip segment connectors - they should not be selectable for transformation
626
- if (((_object$userData6 = object.userData) === null || _object$userData6 === void 0 ? void 0 : _object$userData6.objectType) === 'segment-connector') {
648
+ if (((_object$userData7 = object.userData) === null || _object$userData7 === void 0 ? void 0 : _object$userData7.objectType) === 'segment-connector') {
627
649
  return false;
628
650
  }
629
651
 
630
652
  // Check if object has explicit selectable flag set to false
631
- if (((_object$userData7 = object.userData) === null || _object$userData7 === void 0 ? void 0 : _object$userData7.selectable) === false) {
653
+ if (((_object$userData8 = object.userData) === null || _object$userData8 === void 0 ? void 0 : _object$userData8.selectable) === false) {
654
+ return false;
655
+ }
656
+
657
+ // Check if object is marked as immutable (computed segments/elbows from pathfinder)
658
+ if (((_object$userData9 = object.userData) === null || _object$userData9 === void 0 ? void 0 : _object$userData9.immutable) === true) {
632
659
  return false;
633
660
  }
634
661
 
635
662
  // Allow components, gateways, and segments to be selected
636
- var objectType = (_object$userData8 = object.userData) === null || _object$userData8 === void 0 ? void 0 : _object$userData8.objectType;
663
+ var objectType = (_object$userData0 = object.userData) === null || _object$userData0 === void 0 ? void 0 : _object$userData0.objectType;
637
664
  return objectType === 'component' || objectType === 'gateway' || objectTypes.isSegment(object);
638
665
  }
639
666
  /**
@@ -1308,7 +1335,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1308
1335
 
1309
1336
  // Traverse scene to find selectable objects
1310
1337
  this.scene.traverse(function (object) {
1311
- var _object$userData9, _object$userData0;
1338
+ var _object$userData1, _object$userData10;
1312
1339
  // Skip invalid objects and helpers early
1313
1340
  if (!object || !object.isObject3D) {
1314
1341
  return;
@@ -1320,7 +1347,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1320
1347
  }
1321
1348
 
1322
1349
  // Skip other helpers and special objects
1323
- 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) {
1350
+ 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) {
1324
1351
  return;
1325
1352
  }
1326
1353
  try {
@@ -1492,17 +1519,17 @@ var TransformControlsManager = /*#__PURE__*/function () {
1492
1519
  }, {
1493
1520
  key: "applyMultiSelectionTransform",
1494
1521
  value: (function () {
1495
- var _applyMultiSelectionTransform = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee() {
1522
+ var _applyMultiSelectionTransform = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee2() {
1496
1523
  var _this9 = this;
1497
- 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;
1498
- return _rollupPluginBabelHelpers.regenerator().w(function (_context3) {
1499
- while (1) switch (_context3.n) {
1524
+ 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;
1525
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context4) {
1526
+ while (1) switch (_context4.n) {
1500
1527
  case 0:
1501
1528
  if (!(!this.multiSelectionGroup || this.selectedObjects.length === 0)) {
1502
- _context3.n = 1;
1529
+ _context4.n = 1;
1503
1530
  break;
1504
1531
  }
1505
- return _context3.a(2);
1532
+ return _context4.a(2);
1506
1533
  case 1:
1507
1534
  console.log("\uD83D\uDD27 Applying multi-selection transform to ".concat(this.selectedObjects.length, " objects"));
1508
1535
 
@@ -1531,7 +1558,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1531
1558
  // Only process if there's a meaningful translation
1532
1559
  threshold = 0.001;
1533
1560
  if (!(this.currentMode === 'translate' && positionDelta.length() > threshold)) {
1534
- _context3.n = 21;
1561
+ _context4.n = 21;
1535
1562
  break;
1536
1563
  }
1537
1564
  // FIRST: Reset all objects to their original positions
@@ -1554,14 +1581,23 @@ var TransformControlsManager = /*#__PURE__*/function () {
1554
1581
  });
1555
1582
  components = this.selectedObjects.filter(function (obj) {
1556
1583
  return !objectTypes.isSegment(obj) && !objectTypes.isGateway(obj);
1557
- }); // BATCH SEGMENT TRANSLATIONS: Call translateSegment with skipPathUpdate=true
1584
+ }); // Debug: Check availability of managers
1585
+ console.log('🔍 Debug - sceneViewer available:', !!this.sceneViewer);
1586
+ console.log('🔍 Debug - sceneViewer.managers available:', !!((_this$sceneViewer = this.sceneViewer) !== null && _this$sceneViewer !== void 0 && _this$sceneViewer.managers));
1587
+ console.log('🔍 Debug - Available managers:', (_this$sceneViewer2 = this.sceneViewer) !== null && _this$sceneViewer2 !== void 0 && _this$sceneViewer2.managers ? Object.keys(this.sceneViewer.managers) : 'none');
1588
+ console.log('🔍 Debug - transformOperationsManager (direct):', !!((_this$sceneViewer3 = this.sceneViewer) !== null && _this$sceneViewer3 !== void 0 && _this$sceneViewer3.transformOperationsManager));
1589
+ 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));
1590
+ console.log('🔍 Debug - Segments to translate:', segments.length);
1591
+
1592
+ // BATCH SEGMENT TRANSLATIONS: Call translateSegment with skipPathUpdate=true
1558
1593
  // Process segments SEQUENTIALLY with throttling for maximum stability
1559
- 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)) {
1560
- _context3.n = 5;
1594
+ // Access transformOperationsManager directly from sceneViewer (it's attached in attachToComponent)
1595
+ if (!(segments.length > 0 && (_this$sceneViewer5 = this.sceneViewer) !== null && _this$sceneViewer5 !== void 0 && _this$sceneViewer5.transformOperationsManager)) {
1596
+ _context4.n = 5;
1561
1597
  break;
1562
1598
  }
1563
1599
  console.log("\uD83D\uDD27 Batch translating ".concat(segments.length, " segments (sequential with throttling)..."));
1564
- transformOpsManager = this.sceneViewer.managers.transformOperations; // Throttle delay in milliseconds (adjust as needed for stability)
1600
+ transformOpsManager = this.sceneViewer.transformOperationsManager; // Throttle delay in milliseconds (adjust as needed for stability)
1565
1601
  THROTTLE_DELAY = 10; // 10ms between axis operations
1566
1602
  SEGMENT_DELAY = 20; // 20ms between segments
1567
1603
  // Helper function for throttled delay
@@ -1572,13 +1608,13 @@ var TransformControlsManager = /*#__PURE__*/function () {
1572
1608
  }; // Process each segment sequentially with throttling for stability
1573
1609
  _loop = /*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _loop(i) {
1574
1610
  var segment, _segment$userData, _segment$userData2, segmentId, success, newSegmentId, _segment$userData3, _segment$userData4, _segmentId, _success, _newSegmentId, _segment$userData5, _segment$userData6, _segmentId2, _success2, _newSegmentId2, selectedIndex;
1575
- return _rollupPluginBabelHelpers.regenerator().w(function (_context) {
1576
- while (1) switch (_context.n) {
1611
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context2) {
1612
+ while (1) switch (_context2.n) {
1577
1613
  case 0:
1578
1614
  segment = segments[i]; // Call translateSegment API with skipPathUpdate=true to defer path updates
1579
1615
  // IMPORTANT: Refresh segment reference after each axis to handle UUID changes from manualization
1580
1616
  if (!(Math.abs(deltaX) > threshold)) {
1581
- _context.n = 1;
1617
+ _context2.n = 1;
1582
1618
  break;
1583
1619
  }
1584
1620
  segmentId = segment.uuid || ((_segment$userData = segment.userData) === null || _segment$userData === void 0 ? void 0 : _segment$userData.originalUuid);
@@ -1588,7 +1624,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1588
1624
  }
1589
1625
  // Refresh segment reference by searching for the new UUID or by segmentIndex
1590
1626
  // After manualization, UUID changes from SEGMENT-X to Segment-X
1591
- newSegmentId = (_segment$userData2 = segment.userData) !== null && _segment$userData2 !== void 0 && _segment$userData2.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : segmentId;
1627
+ newSegmentId = (_segment$userData2 = segment.userData) !== null && _segment$userData2 !== void 0 && _segment$userData2.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : segmentId;
1592
1628
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', newSegmentId) || segment;
1593
1629
 
1594
1630
  // Update matrix to ensure geometry is current for next operation
@@ -1596,11 +1632,11 @@ var TransformControlsManager = /*#__PURE__*/function () {
1596
1632
  segment.updateMatrix();
1597
1633
  segment.updateMatrixWorld(true);
1598
1634
  }
1599
- _context.n = 1;
1635
+ _context2.n = 1;
1600
1636
  return _throttleDelay(THROTTLE_DELAY);
1601
1637
  case 1:
1602
1638
  if (!(Math.abs(deltaY) > threshold)) {
1603
- _context.n = 2;
1639
+ _context2.n = 2;
1604
1640
  break;
1605
1641
  }
1606
1642
  _segmentId = segment.uuid || ((_segment$userData3 = segment.userData) === null || _segment$userData3 === void 0 ? void 0 : _segment$userData3.originalUuid);
@@ -1609,7 +1645,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1609
1645
  console.warn("\u26A0\uFE0F Failed to translate segment ".concat(_segmentId, " on Y axis"));
1610
1646
  }
1611
1647
  // Refresh segment reference by searching for the new UUID
1612
- _newSegmentId = (_segment$userData4 = segment.userData) !== null && _segment$userData4 !== void 0 && _segment$userData4.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : _segmentId;
1648
+ _newSegmentId = (_segment$userData4 = segment.userData) !== null && _segment$userData4 !== void 0 && _segment$userData4.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : _segmentId;
1613
1649
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', _newSegmentId) || segment;
1614
1650
 
1615
1651
  // Update matrix to ensure geometry is current for next operation
@@ -1617,11 +1653,11 @@ var TransformControlsManager = /*#__PURE__*/function () {
1617
1653
  segment.updateMatrix();
1618
1654
  segment.updateMatrixWorld(true);
1619
1655
  }
1620
- _context.n = 2;
1656
+ _context2.n = 2;
1621
1657
  return _throttleDelay(THROTTLE_DELAY);
1622
1658
  case 2:
1623
1659
  if (!(Math.abs(deltaZ) > threshold)) {
1624
- _context.n = 3;
1660
+ _context2.n = 3;
1625
1661
  break;
1626
1662
  }
1627
1663
  _segmentId2 = segment.uuid || ((_segment$userData5 = segment.userData) === null || _segment$userData5 === void 0 ? void 0 : _segment$userData5.originalUuid);
@@ -1630,7 +1666,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1630
1666
  console.warn("\u26A0\uFE0F Failed to translate segment ".concat(_segmentId2, " on Z axis"));
1631
1667
  }
1632
1668
  // Refresh segment reference by searching for the new UUID
1633
- _newSegmentId2 = (_segment$userData6 = segment.userData) !== null && _segment$userData6 !== void 0 && _segment$userData6.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : _segmentId2;
1669
+ _newSegmentId2 = (_segment$userData6 = segment.userData) !== null && _segment$userData6 !== void 0 && _segment$userData6.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : _segmentId2;
1634
1670
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', _newSegmentId2) || segment;
1635
1671
 
1636
1672
  // Update matrix to ensure geometry is current for next operation
@@ -1638,7 +1674,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1638
1674
  segment.updateMatrix();
1639
1675
  segment.updateMatrixWorld(true);
1640
1676
  }
1641
- _context.n = 3;
1677
+ _context2.n = 3;
1642
1678
  return _throttleDelay(THROTTLE_DELAY);
1643
1679
  case 3:
1644
1680
  // Update the segment in the selectedObjects array with the refreshed reference
@@ -1658,34 +1694,38 @@ var TransformControlsManager = /*#__PURE__*/function () {
1658
1694
  _this9.selectedObjects[selectedIndex] = segment;
1659
1695
  console.log("\u2705 Updated selectedObjects[".concat(selectedIndex, "] with refreshed segment reference"));
1660
1696
  }
1661
- console.log("\uD83D\uDCE6 Segment ".concat(segment.name, " translated (").concat(i + 1, "/").concat(segments.length, "):"), {
1662
- deltaX: deltaX,
1663
- deltaY: deltaY,
1664
- deltaZ: deltaZ
1665
- });
1697
+ if (segment) {
1698
+ console.log("\uD83D\uDCE6 Segment ".concat(segment.name, " translated (").concat(i + 1, "/").concat(segments.length, "):"), {
1699
+ deltaX: deltaX,
1700
+ deltaY: deltaY,
1701
+ deltaZ: deltaZ
1702
+ });
1703
+ } else {
1704
+ console.warn("\u26A0\uFE0F Segment reference became null after translation (".concat(i + 1, "/").concat(segments.length, ")"));
1705
+ }
1666
1706
 
1667
1707
  // Delay between segments to ensure all updates propagate
1668
1708
  if (!(i < segments.length - 1)) {
1669
- _context.n = 4;
1709
+ _context2.n = 4;
1670
1710
  break;
1671
1711
  }
1672
- _context.n = 4;
1712
+ _context2.n = 4;
1673
1713
  return _throttleDelay(SEGMENT_DELAY);
1674
1714
  case 4:
1675
- return _context.a(2);
1715
+ return _context2.a(2);
1676
1716
  }
1677
1717
  }, _loop);
1678
1718
  });
1679
1719
  i = 0;
1680
1720
  case 2:
1681
1721
  if (!(i < segments.length)) {
1682
- _context3.n = 4;
1722
+ _context4.n = 4;
1683
1723
  break;
1684
1724
  }
1685
- return _context3.d(_rollupPluginBabelHelpers.regeneratorValues(_loop(i)), 3);
1725
+ return _context4.d(_rollupPluginBabelHelpers.regeneratorValues(_loop(i)), 3);
1686
1726
  case 3:
1687
1727
  i++;
1688
- _context3.n = 2;
1728
+ _context4.n = 2;
1689
1729
  break;
1690
1730
  case 4:
1691
1731
  // Only call updatePaths ONCE after all segments are translated
@@ -1694,11 +1734,11 @@ var TransformControlsManager = /*#__PURE__*/function () {
1694
1734
  this.sceneViewer.updatePaths();
1695
1735
  console.log('✅ Paths regenerated successfully for all segments');
1696
1736
  }
1697
- _context3.n = 8;
1737
+ _context4.n = 8;
1698
1738
  break;
1699
1739
  case 5:
1700
1740
  if (!(segments.length > 0)) {
1701
- _context3.n = 8;
1741
+ _context4.n = 8;
1702
1742
  break;
1703
1743
  }
1704
1744
  // Fallback to individual API calls if manager not available
@@ -1715,18 +1755,18 @@ var TransformControlsManager = /*#__PURE__*/function () {
1715
1755
  };
1716
1756
  _loop2 = /*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _loop2(_i) {
1717
1757
  var segment, _segment$userData7, _segment$userData8, segmentId, newSegmentId, _segment$userData9, _segment$userData0, _segmentId3, _newSegmentId3, _segment$userData1, _segment$userData10, _segmentId4, _newSegmentId4, selectedIndex;
1718
- return _rollupPluginBabelHelpers.regenerator().w(function (_context2) {
1719
- while (1) switch (_context2.n) {
1758
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context3) {
1759
+ while (1) switch (_context3.n) {
1720
1760
  case 0:
1721
1761
  segment = segments[_i];
1722
1762
  if (!(Math.abs(deltaX) > threshold)) {
1723
- _context2.n = 1;
1763
+ _context3.n = 1;
1724
1764
  break;
1725
1765
  }
1726
1766
  segmentId = segment.uuid || ((_segment$userData7 = segment.userData) === null || _segment$userData7 === void 0 ? void 0 : _segment$userData7.originalUuid);
1727
1767
  _this9.centralPlant.translateSegment(segmentId, 'x', deltaX);
1728
1768
  // Refresh segment reference by searching for the new UUID after manualization
1729
- newSegmentId = (_segment$userData8 = segment.userData) !== null && _segment$userData8 !== void 0 && _segment$userData8.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : segmentId;
1769
+ newSegmentId = (_segment$userData8 = segment.userData) !== null && _segment$userData8 !== void 0 && _segment$userData8.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : segmentId;
1730
1770
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', newSegmentId) || segment;
1731
1771
 
1732
1772
  // Update matrix to ensure geometry is current for next operation
@@ -1734,17 +1774,17 @@ var TransformControlsManager = /*#__PURE__*/function () {
1734
1774
  segment.updateMatrix();
1735
1775
  segment.updateMatrixWorld(true);
1736
1776
  }
1737
- _context2.n = 1;
1777
+ _context3.n = 1;
1738
1778
  return _throttleDelay2(_THROTTLE_DELAY);
1739
1779
  case 1:
1740
1780
  if (!(Math.abs(deltaY) > threshold)) {
1741
- _context2.n = 2;
1781
+ _context3.n = 2;
1742
1782
  break;
1743
1783
  }
1744
1784
  _segmentId3 = segment.uuid || ((_segment$userData9 = segment.userData) === null || _segment$userData9 === void 0 ? void 0 : _segment$userData9.originalUuid);
1745
1785
  _this9.centralPlant.translateSegment(_segmentId3, 'y', deltaY);
1746
1786
  // Refresh segment reference by searching for the new UUID after manualization
1747
- _newSegmentId3 = (_segment$userData0 = segment.userData) !== null && _segment$userData0 !== void 0 && _segment$userData0.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : _segmentId3;
1787
+ _newSegmentId3 = (_segment$userData0 = segment.userData) !== null && _segment$userData0 !== void 0 && _segment$userData0.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : _segmentId3;
1748
1788
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', _newSegmentId3) || segment;
1749
1789
 
1750
1790
  // Update matrix to ensure geometry is current for next operation
@@ -1752,17 +1792,17 @@ var TransformControlsManager = /*#__PURE__*/function () {
1752
1792
  segment.updateMatrix();
1753
1793
  segment.updateMatrixWorld(true);
1754
1794
  }
1755
- _context2.n = 2;
1795
+ _context3.n = 2;
1756
1796
  return _throttleDelay2(_THROTTLE_DELAY);
1757
1797
  case 2:
1758
1798
  if (!(Math.abs(deltaZ) > threshold)) {
1759
- _context2.n = 3;
1799
+ _context3.n = 3;
1760
1800
  break;
1761
1801
  }
1762
1802
  _segmentId4 = segment.uuid || ((_segment$userData1 = segment.userData) === null || _segment$userData1 === void 0 ? void 0 : _segment$userData1.originalUuid);
1763
1803
  _this9.centralPlant.translateSegment(_segmentId4, 'z', deltaZ);
1764
1804
  // Refresh segment reference by searching for the new UUID after manualization
1765
- _newSegmentId4 = (_segment$userData10 = segment.userData) !== null && _segment$userData10 !== void 0 && _segment$userData10.segmentIndex ? "Segment-".concat(segment.userData.segmentIndex) : _segmentId4;
1805
+ _newSegmentId4 = (_segment$userData10 = segment.userData) !== null && _segment$userData10 !== void 0 && _segment$userData10.segmentIndex ? "SEGMENT-".concat(segment.userData.segmentIndex) : _segmentId4;
1766
1806
  segment = _this9.sceneViewer.scene.getObjectByProperty('uuid', _newSegmentId4) || segment;
1767
1807
 
1768
1808
  // Update matrix to ensure geometry is current for next operation
@@ -1770,7 +1810,7 @@ var TransformControlsManager = /*#__PURE__*/function () {
1770
1810
  segment.updateMatrix();
1771
1811
  segment.updateMatrixWorld(true);
1772
1812
  }
1773
- _context2.n = 3;
1813
+ _context3.n = 3;
1774
1814
  return _throttleDelay2(_THROTTLE_DELAY);
1775
1815
  case 3:
1776
1816
  // Update the segment in the selectedObjects array with the refreshed reference
@@ -1789,34 +1829,38 @@ var TransformControlsManager = /*#__PURE__*/function () {
1789
1829
  _this9.selectedObjects[selectedIndex] = segment;
1790
1830
  console.log("\u2705 Updated selectedObjects[".concat(selectedIndex, "] with refreshed segment reference"));
1791
1831
  }
1792
- console.log("\uD83D\uDCE6 Segment ".concat(segment.name, " translated (").concat(_i + 1, "/").concat(segments.length, "):"), {
1793
- deltaX: deltaX,
1794
- deltaY: deltaY,
1795
- deltaZ: deltaZ
1796
- });
1832
+ if (segment) {
1833
+ console.log("\uD83D\uDCE6 Segment ".concat(segment.name, " translated (").concat(_i + 1, "/").concat(segments.length, "):"), {
1834
+ deltaX: deltaX,
1835
+ deltaY: deltaY,
1836
+ deltaZ: deltaZ
1837
+ });
1838
+ } else {
1839
+ console.warn("\u26A0\uFE0F Segment reference became null after translation (".concat(_i + 1, "/").concat(segments.length, ")"));
1840
+ }
1797
1841
 
1798
1842
  // Delay between segments
1799
1843
  if (!(_i < segments.length - 1)) {
1800
- _context2.n = 4;
1844
+ _context3.n = 4;
1801
1845
  break;
1802
1846
  }
1803
- _context2.n = 4;
1847
+ _context3.n = 4;
1804
1848
  return _throttleDelay2(_SEGMENT_DELAY);
1805
1849
  case 4:
1806
- return _context2.a(2);
1850
+ return _context3.a(2);
1807
1851
  }
1808
1852
  }, _loop2);
1809
1853
  });
1810
1854
  _i = 0;
1811
1855
  case 6:
1812
1856
  if (!(_i < segments.length)) {
1813
- _context3.n = 8;
1857
+ _context4.n = 8;
1814
1858
  break;
1815
1859
  }
1816
- return _context3.d(_rollupPluginBabelHelpers.regeneratorValues(_loop2(_i)), 7);
1860
+ return _context4.d(_rollupPluginBabelHelpers.regeneratorValues(_loop2(_i)), 7);
1817
1861
  case 7:
1818
1862
  _i++;
1819
- _context3.n = 6;
1863
+ _context4.n = 6;
1820
1864
  break;
1821
1865
  case 8:
1822
1866
  // Throttle delays for gateways and components
@@ -1832,33 +1876,33 @@ var TransformControlsManager = /*#__PURE__*/function () {
1832
1876
  _i2 = 0;
1833
1877
  case 9:
1834
1878
  if (!(_i2 < gateways.length)) {
1835
- _context3.n = 14;
1879
+ _context4.n = 14;
1836
1880
  break;
1837
1881
  }
1838
1882
  gateway = gateways[_i2];
1839
1883
  gatewayId = gateway.uuid || ((_gateway$userData = gateway.userData) === null || _gateway$userData === void 0 ? void 0 : _gateway$userData.originalUuid);
1840
1884
  if (!(Math.abs(deltaX) > threshold)) {
1841
- _context3.n = 10;
1885
+ _context4.n = 10;
1842
1886
  break;
1843
1887
  }
1844
1888
  this.centralPlant.translateGateway(gatewayId, 'x', deltaX);
1845
- _context3.n = 10;
1889
+ _context4.n = 10;
1846
1890
  return throttleDelay(GATEWAY_THROTTLE);
1847
1891
  case 10:
1848
1892
  if (!(Math.abs(deltaY) > threshold)) {
1849
- _context3.n = 11;
1893
+ _context4.n = 11;
1850
1894
  break;
1851
1895
  }
1852
1896
  this.centralPlant.translateGateway(gatewayId, 'y', deltaY);
1853
- _context3.n = 11;
1897
+ _context4.n = 11;
1854
1898
  return throttleDelay(GATEWAY_THROTTLE);
1855
1899
  case 11:
1856
1900
  if (!(Math.abs(deltaZ) > threshold)) {
1857
- _context3.n = 12;
1901
+ _context4.n = 12;
1858
1902
  break;
1859
1903
  }
1860
1904
  this.centralPlant.translateGateway(gatewayId, 'z', deltaZ);
1861
- _context3.n = 12;
1905
+ _context4.n = 12;
1862
1906
  return throttleDelay(GATEWAY_THROTTLE);
1863
1907
  case 12:
1864
1908
  console.log("\uD83D\uDEAA Gateway ".concat(gateway.name, " translated (").concat(_i2 + 1, "/").concat(gateways.length, "):"), {
@@ -1869,46 +1913,46 @@ var TransformControlsManager = /*#__PURE__*/function () {
1869
1913
 
1870
1914
  // Delay between gateways
1871
1915
  if (!(_i2 < gateways.length - 1)) {
1872
- _context3.n = 13;
1916
+ _context4.n = 13;
1873
1917
  break;
1874
1918
  }
1875
- _context3.n = 13;
1919
+ _context4.n = 13;
1876
1920
  return throttleDelay(GATEWAY_DELAY);
1877
1921
  case 13:
1878
1922
  _i2++;
1879
- _context3.n = 9;
1923
+ _context4.n = 9;
1880
1924
  break;
1881
1925
  case 14:
1882
1926
  _i3 = 0;
1883
1927
  case 15:
1884
1928
  if (!(_i3 < components.length)) {
1885
- _context3.n = 20;
1929
+ _context4.n = 20;
1886
1930
  break;
1887
1931
  }
1888
1932
  component = components[_i3];
1889
1933
  componentId = component.uuid || ((_component$userData = component.userData) === null || _component$userData === void 0 ? void 0 : _component$userData.originalUuid);
1890
1934
  if (!(Math.abs(deltaX) > threshold)) {
1891
- _context3.n = 16;
1935
+ _context4.n = 16;
1892
1936
  break;
1893
1937
  }
1894
1938
  this.centralPlant.translate(componentId, 'x', deltaX);
1895
- _context3.n = 16;
1939
+ _context4.n = 16;
1896
1940
  return throttleDelay(COMPONENT_THROTTLE);
1897
1941
  case 16:
1898
1942
  if (!(Math.abs(deltaY) > threshold)) {
1899
- _context3.n = 17;
1943
+ _context4.n = 17;
1900
1944
  break;
1901
1945
  }
1902
1946
  this.centralPlant.translate(componentId, 'y', deltaY);
1903
- _context3.n = 17;
1947
+ _context4.n = 17;
1904
1948
  return throttleDelay(COMPONENT_THROTTLE);
1905
1949
  case 17:
1906
1950
  if (!(Math.abs(deltaZ) > threshold)) {
1907
- _context3.n = 18;
1951
+ _context4.n = 18;
1908
1952
  break;
1909
1953
  }
1910
1954
  this.centralPlant.translate(componentId, 'z', deltaZ);
1911
- _context3.n = 18;
1955
+ _context4.n = 18;
1912
1956
  return throttleDelay(COMPONENT_THROTTLE);
1913
1957
  case 18:
1914
1958
  console.log("\uD83D\uDD27 Component ".concat(component.name, " translated (").concat(_i3 + 1, "/").concat(components.length, "):"), {
@@ -1919,14 +1963,14 @@ var TransformControlsManager = /*#__PURE__*/function () {
1919
1963
 
1920
1964
  // Delay between components
1921
1965
  if (!(_i3 < components.length - 1)) {
1922
- _context3.n = 19;
1966
+ _context4.n = 19;
1923
1967
  break;
1924
1968
  }
1925
- _context3.n = 19;
1969
+ _context4.n = 19;
1926
1970
  return throttleDelay(COMPONENT_DELAY);
1927
1971
  case 19:
1928
1972
  _i3++;
1929
- _context3.n = 15;
1973
+ _context4.n = 15;
1930
1974
  break;
1931
1975
  case 20:
1932
1976
  console.log("\u2705 All ".concat(this.selectedObjects.length, " objects translated with delta:"), {
@@ -1935,22 +1979,29 @@ var TransformControlsManager = /*#__PURE__*/function () {
1935
1979
  deltaZ: deltaZ
1936
1980
  });
1937
1981
  case 21:
1938
- // Reset the multi-selection group transform
1939
- this.multiSelectionGroup.position.set(0, 0, 0);
1940
- this.multiSelectionGroup.rotation.set(0, 0, 0);
1941
- this.multiSelectionGroup.scale.set(1, 1, 1);
1982
+ // Reset the multi-selection group transform (if it still exists)
1983
+ // Note: The group might have been cleared during async operations
1984
+ if (this.multiSelectionGroup) {
1985
+ this.multiSelectionGroup.position.set(0, 0, 0);
1986
+ this.multiSelectionGroup.rotation.set(0, 0, 0);
1987
+ this.multiSelectionGroup.scale.set(1, 1, 1);
1988
+ } else {
1989
+ console.warn('âš ī¸ Multi-selection group was cleared during transformation');
1990
+ }
1942
1991
 
1943
1992
  // CRITICAL: Clear bounding box cache after manualization
1944
1993
  // Manualization changes object references, making cached boxes invalid
1945
1994
  this.clearBoundingBoxCache();
1946
1995
 
1947
- // Update the multi-selection display with new positions
1948
- this.updateMultiSelection();
1996
+ // Update the multi-selection display with new positions (only if we still have selected objects)
1997
+ if (this.selectedObjects.length > 0) {
1998
+ this.updateMultiSelection();
1999
+ }
1949
2000
  console.log("\u2705 Multi-selection transform applied");
1950
2001
  case 22:
1951
- return _context3.a(2);
2002
+ return _context4.a(2);
1952
2003
  }
1953
- }, _callee, this);
2004
+ }, _callee2, this);
1954
2005
  }));
1955
2006
  function applyMultiSelectionTransform() {
1956
2007
  return _applyMultiSelectionTransform.apply(this, arguments);