123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- from UM.Logger import Logger
- from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot
- from UM.Application import Application
- from UM.Qt.ListModel import ListModel
- from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
- from UM.Scene.SceneNode import SceneNode
- from UM.Scene.Selection import Selection
- from PyQt5.QtCore import Qt
- from PyQt5.QtWidgets import QApplication
- #from cura.Scene.CuraSceneNode import CuraSceneNode
- from UM.Preferences import Preferences
- ## Keep track of all objects in the project
- class ObjectManager(ListModel):
- def __init__(self):
- super().__init__()
- self._last_selected_index = 0
- self._build_plate_model = Application.getInstance().getBuildPlateModel()
- Application.getInstance().getController().getScene().sceneChanged.connect(self._update)
- Preferences.getInstance().preferenceChanged.connect(self._update)
- self._build_plate_model.activeBuildPlateChanged.connect(self._update)
- def _update(self, *args):
- nodes = []
- filter_current_build_plate = Preferences.getInstance().getValue("view/filter_current_build_plate")
- active_build_plate_number = self._build_plate_model.activeBuildPlate
- for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()):
- if not issubclass(type(node), SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")):
- continue
- if not node.callDecoration("isSliceable"):
- continue
- node_build_plate_number = node.callDecoration("getBuildPlateNumber")
- if filter_current_build_plate and node_build_plate_number != active_build_plate_number:
- continue
- nodes.append({
- "name": node.getName(),
- "isSelected": Selection.isSelected(node),
- "isOutsideBuildArea": node.isOutsideBuildArea(),
- "buildPlateNumber": node_build_plate_number,
- "node": node
- })
- nodes = sorted(nodes, key=lambda n: n["name"])
- self.setItems(nodes)
- self.itemsChanged.emit()
- ## Either select or deselect an item
- @pyqtSlot(int)
- def changeSelection(self, index):
- modifiers = QApplication.keyboardModifiers()
- ctrl_is_active = modifiers & Qt.ControlModifier
- shift_is_active = modifiers & Qt.ShiftModifier
- if ctrl_is_active:
- item = self.getItem(index)
- node = item["node"]
- if Selection.isSelected(node):
- Selection.remove(node)
- else:
- Selection.add(node)
- elif shift_is_active:
- polarity = 1 if index + 1 > self._last_selected_index else -1
- for i in range(self._last_selected_index, index + polarity, polarity):
- item = self.getItem(i)
- node = item["node"]
- Selection.add(node)
- else:
- # Single select
- item = self.getItem(index)
- node = item["node"]
- Selection.clear()
- Selection.add(node)
- build_plate_number = node.callDecoration("getBuildPlateNumber")
- if build_plate_number is not None and build_plate_number != -1:
- self._build_plate_model.setActiveBuildPlate(build_plate_number)
- self._last_selected_index = index
- # testing
- for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()):
- if node.callDecoration("getLayerData"):
- Logger.log("d", " ##### NODE: %s", node)
- @staticmethod
- def createObjectManager():
- return ObjectManager()
|