mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-06-30 09:05:09 +08:00
88 lines
3.6 KiB
Python
88 lines
3.6 KiB
Python
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()
|