Skip to content

Commit 495fc8b

Browse files
committed
WIP: Refactor BuildPlateModel and split MultiBuildPlateModel
1 parent 1c8f63e commit 495fc8b

27 files changed

+172
-111
lines changed

cura/CuraApplication.py

+20-12
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,13 @@
5353
from UM.Settings.SettingFunction import SettingFunction
5454
from cura.Settings.MachineNameValidator import MachineNameValidator
5555

56+
from cura.Machines.Models.BuildPlateModel import BuildPlateModel
5657
from cura.Machines.Models.NozzleModel import NozzleModel
5758
from cura.Machines.Models.QualityProfilesModel import QualityProfilesModel
5859
from cura.Machines.Models.CustomQualityProfilesModel import CustomQualityProfilesModel
5960

61+
from cura.Machines.Models.Other.MultiBuildPlateModel import MultiBuildPlateModel
62+
6063
from cura.Settings.MaterialsModel import MaterialsModel, BrandMaterialsModel, GenericMaterialsModel, NewMaterialsModel
6164
from cura.Settings.SettingInheritanceManager import SettingInheritanceManager
6265
from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager
@@ -84,7 +87,6 @@
8487
from cura.Settings.ContainerManager import ContainerManager
8588

8689
from cura.ObjectsModel import ObjectsModel
87-
from cura.BuildPlateModel import BuildPlateModel
8890

8991
from PyQt5.QtCore import QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
9092
from UM.FlameProfiler import pyqtSlot
@@ -219,6 +221,7 @@ def __init__(self, **kwargs):
219221
self._material_manager = None
220222
self._object_manager = None
221223
self._build_plate_model = None
224+
self._multi_build_plate_model = None
222225
self._setting_inheritance_manager = None
223226
self._simple_mode_settings_manager = None
224227
self._cura_scene_controller = None
@@ -858,10 +861,14 @@ def getObjectsModel(self, *args):
858861
self._object_manager = ObjectsModel.createObjectsModel()
859862
return self._object_manager
860863

864+
def getMultiBuildPlateModel(self, *args):
865+
if self._multi_build_plate_model is None:
866+
self._multi_build_plate_model = MultiBuildPlateModel(self)
867+
return self._multi_build_plate_model
868+
861869
def getBuildPlateModel(self, *args):
862870
if self._build_plate_model is None:
863-
self._build_plate_model = BuildPlateModel.createBuildPlateModel()
864-
871+
self._build_plate_model = BuildPlateModel(self)
865872
return self._build_plate_model
866873

867874
def getCuraSceneController(self, *args):
@@ -923,15 +930,16 @@ def registerObjects(self, engine):
923930

924931
qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type")
925932

926-
qmlRegisterSingletonType(CuraSceneController, "Cura", 1, 2, "SceneController", self.getCuraSceneController)
933+
qmlRegisterSingletonType(CuraSceneController, "Cura", 1, 0, "SceneController", self.getCuraSceneController)
927934
qmlRegisterSingletonType(ExtruderManager, "Cura", 1, 0, "ExtruderManager", self.getExtruderManager)
928935
qmlRegisterSingletonType(MachineManager, "Cura", 1, 0, "MachineManager", self.getMachineManager)
929936
qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, "SettingInheritanceManager", self.getSettingInheritanceManager)
930-
qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 2, "SimpleModeSettingsManager", self.getSimpleModeSettingsManager)
937+
qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 0, "SimpleModeSettingsManager", self.getSimpleModeSettingsManager)
931938
qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager)
932939

933-
qmlRegisterSingletonType(ObjectsModel, "Cura", 1, 2, "ObjectsModel", self.getObjectsModel)
934-
qmlRegisterSingletonType(BuildPlateModel, "Cura", 1, 2, "BuildPlateModel", self.getBuildPlateModel)
940+
qmlRegisterSingletonType(ObjectsModel, "Cura", 1, 0, "ObjectsModel", self.getObjectsModel)
941+
qmlRegisterSingletonType(BuildPlateModel, "Cura", 1, 0, "BuildPlateModel", self.getBuildPlateModel)
942+
qmlRegisterSingletonType(MultiBuildPlateModel, "Cura", 1, 0, "MultiBuildPlateModel", self.getMultiBuildPlateModel)
935943
qmlRegisterType(InstanceContainer, "Cura", 1, 0, "InstanceContainer")
936944
qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel")
937945
qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel")
@@ -951,7 +959,7 @@ def registerObjects(self, engine):
951959
qmlRegisterType(MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler")
952960
qmlRegisterType(QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel")
953961
qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator")
954-
qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel")
962+
qmlRegisterType(UserChangesModel, "Cura", 1, 0, "UserChangesModel")
955963
qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager)
956964

957965
# As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work.
@@ -1033,7 +1041,7 @@ def updatePlatformActivity(self, node = None):
10331041
count = 0
10341042
scene_bounding_box = None
10351043
is_block_slicing_node = False
1036-
active_build_plate = self.getBuildPlateModel().activeBuildPlate
1044+
active_build_plate = self._multi_build_plate_model.activeBuildPlate
10371045
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
10381046
if (
10391047
not issubclass(type(node), CuraSceneNode) or
@@ -1282,7 +1290,7 @@ def arrangeObjectsToAllBuildPlates(self):
12821290
@pyqtSlot()
12831291
def arrangeAll(self):
12841292
nodes = []
1285-
active_build_plate = self.getBuildPlateModel().activeBuildPlate
1293+
active_build_plate = self._multi_build_plate_model.activeBuildPlate
12861294
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
12871295
if not isinstance(node, SceneNode):
12881296
continue
@@ -1431,7 +1439,7 @@ def groupSelected(self):
14311439
group_decorator = GroupDecorator()
14321440
group_node.addDecorator(group_decorator)
14331441
group_node.addDecorator(ConvexHullDecorator())
1434-
group_node.addDecorator(BuildPlateDecorator(self.getBuildPlateModel().activeBuildPlate))
1442+
group_node.addDecorator(BuildPlateDecorator(self._multi_build_plate_model.activeBuildPlate))
14351443
group_node.setParent(self.getController().getScene().getRoot())
14361444
group_node.setSelectable(True)
14371445
center = Selection.getSelectionCenter()
@@ -1576,7 +1584,7 @@ def _readMeshFinished(self, job):
15761584
arrange_objects_on_load = (
15771585
not Preferences.getInstance().getValue("cura/use_multi_build_plate") or
15781586
not Preferences.getInstance().getValue("cura/not_arrange_objects_on_load"))
1579-
target_build_plate = self.getBuildPlateModel().activeBuildPlate if arrange_objects_on_load else -1
1587+
target_build_plate = self._multi_build_plate_model.activeBuildPlate if arrange_objects_on_load else -1
15801588

15811589
root = self.getController().getScene().getRoot()
15821590
fixed_nodes = []
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from PyQt5.QtCore import Qt
2+
3+
from UM.Application import Application
4+
from UM.Qt.ListModel import ListModel
5+
6+
from cura.Machines.VariantManager import VariantType
7+
8+
9+
class BuildPlateModel(ListModel):
10+
NameRole = Qt.UserRole + 1
11+
ContainerNodeRole = Qt.UserRole + 2
12+
13+
def __init__(self, parent = None):
14+
super().__init__(parent)
15+
16+
self.addRoleName(self.NameRole, "name")
17+
self.addRoleName(self.ContainerNodeRole, "container_node")
18+
19+
self._application = Application.getInstance()
20+
self._variant_manager = self._application._variant_manager
21+
self._machine_manager = self._application.getMachineManager()
22+
23+
self._machine_manager.globalContainerChanged.connect(self._update)
24+
25+
self._update()
26+
27+
def _update(self):
28+
global_stack = self._machine_manager._global_container_stack
29+
if not global_stack:
30+
self.setItems([])
31+
return
32+
33+
variant_dict = self._variant_manager.getVariantNodes(global_stack, variant_type = VariantType.BUILD_PLATE)
34+
35+
item_list = []
36+
for name, variant_node in variant_dict.items():
37+
item = {"name": name,
38+
"container_node": variant_node}
39+
item_list.append(item)
40+
self.setItems(item_list)

cura/BuildPlateModel.py cura/Machines/Models/Other/MultiBuildPlateModel.py

+10-13
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
1-
from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot
1+
from PyQt5.QtCore import pyqtSignal, pyqtProperty
22

3-
from UM.Qt.ListModel import ListModel
4-
from UM.Scene.Selection import Selection
5-
from UM.Logger import Logger
63
from UM.Application import Application
4+
from UM.Scene.Selection import Selection
5+
from UM.Qt.ListModel import ListModel
76

87

9-
class BuildPlateModel(ListModel):
8+
class MultiBuildPlateModel(ListModel):
9+
1010
maxBuildPlateChanged = pyqtSignal()
1111
activeBuildPlateChanged = pyqtSignal()
1212
selectionChanged = pyqtSignal()
1313

14-
def __init__(self):
15-
super().__init__()
16-
Application.getInstance().getController().getScene().sceneChanged.connect(self._updateSelectedObjectBuildPlateNumbers)
14+
def __init__(self, parent = None):
15+
super().__init__(parent)
16+
17+
self._application = Application.getInstance()
18+
self._application.getController().getScene().sceneChanged.connect(self._updateSelectedObjectBuildPlateNumbers)
1719
Selection.selectionChanged.connect(self._updateSelectedObjectBuildPlateNumbers)
1820

1921
self._max_build_plate = 1 # default
2022
self._active_build_plate = -1
21-
self._selection_build_plates = []
2223

2324
def setMaxBuildPlate(self, max_build_plate):
2425
self._max_build_plate = max_build_plate
@@ -37,10 +38,6 @@ def setActiveBuildPlate(self, nr):
3738
def activeBuildPlate(self):
3839
return self._active_build_plate
3940

40-
@staticmethod
41-
def createBuildPlateModel():
42-
return BuildPlateModel()
43-
4441
def _updateSelectedObjectBuildPlateNumbers(self, *args):
4542
result = set()
4643
for node in Selection.getAllSelectedObjects():

cura/Machines/Models/Other/__init__.py

Whitespace-only changes.

cura/PrintInformation.py

+11-8
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,18 @@ def __init__(self, parent = None):
7676
self._active_build_plate = 0
7777
self._initVariablesWithBuildPlate(self._active_build_plate)
7878

79-
Application.getInstance().globalContainerStackChanged.connect(self._updateJobName)
80-
Application.getInstance().fileLoaded.connect(self.setBaseName)
81-
Application.getInstance().getBuildPlateModel().activeBuildPlateChanged.connect(self._onActiveBuildPlateChanged)
82-
Application.getInstance().workspaceLoaded.connect(self.setProjectName)
79+
self._application = Application.getInstance()
80+
self._multi_build_plate_model = self._application.getMultiBuildPlateModel()
81+
82+
self._application.globalContainerStackChanged.connect(self._updateJobName)
83+
self._application.fileLoaded.connect(self.setBaseName)
84+
self._application.workspaceLoaded.connect(self.setProjectName)
85+
self._multi_build_plate_model.activeBuildPlateChanged.connect(self._onActiveBuildPlateChanged)
8386

8487
Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged)
8588

8689
self._active_material_container = None
87-
Application.getInstance().getMachineManager().activeMaterialChanged.connect(self._onActiveMaterialChanged)
90+
self._application.getMachineManager().activeMaterialChanged.connect(self._onActiveMaterialChanged)
8891
self._onActiveMaterialChanged()
8992

9093
self._material_amounts = []
@@ -260,7 +263,7 @@ def _onPreferencesChanged(self, preference):
260263
if preference != "cura/material_settings":
261264
return
262265

263-
for build_plate_number in range(Application.getInstance().getBuildPlateModel().maxBuildPlate + 1):
266+
for build_plate_number in range(self._multi_build_plate_model.maxBuildPlate + 1):
264267
self._calculateInformation(build_plate_number)
265268

266269
def _onActiveMaterialChanged(self):
@@ -278,7 +281,7 @@ def _onActiveMaterialChanged(self):
278281
self._active_material_container.metaDataChanged.connect(self._onMaterialMetaDataChanged)
279282

280283
def _onActiveBuildPlateChanged(self):
281-
new_active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate
284+
new_active_build_plate = self._multi_build_plate_model.activeBuildPlate
282285
if new_active_build_plate != self._active_build_plate:
283286
self._active_build_plate = new_active_build_plate
284287

@@ -291,7 +294,7 @@ def _onActiveBuildPlateChanged(self):
291294
self.currentPrintTimeChanged.emit()
292295

293296
def _onMaterialMetaDataChanged(self, *args, **kwargs):
294-
for build_plate_number in range(Application.getInstance().getBuildPlateModel().maxBuildPlate + 1):
297+
for build_plate_number in range(self._multi_build_plate_model.maxBuildPlate + 1):
295298
self._calculateInformation(build_plate_number)
296299

297300
@pyqtSlot(str)

cura/Scene/ConvexHullNode.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def render(self, renderer):
6868
ConvexHullNode.shader.setUniformValue("u_opacity", 0.6)
6969

7070
if self.getParent():
71-
if self.getMeshData() and isinstance(self._node, SceneNode) and self._node.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate:
71+
if self.getMeshData() and isinstance(self._node, SceneNode) and self._node.callDecoration("getBuildPlateNumber") == Application.getInstance().getMultiBuildPlateModel().activeBuildPlate:
7272
renderer.queueNode(self, transparent = True, shader = ConvexHullNode.shader, backface_cull = True, sort = -8)
7373
if self._convex_hull_head_mesh:
7474
renderer.queueNode(self, shader = ConvexHullNode.shader, transparent = True, mesh = self._convex_hull_head_mesh, backface_cull = True, sort = -8)

cura/Scene/CuraSceneController.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from PyQt5.QtWidgets import QApplication
55

66
from cura.ObjectsModel import ObjectsModel
7-
from cura.BuildPlateModel import BuildPlateModel
7+
from cura.Machines.Models.Other.MultiBuildPlateModel import MultiBuildPlateModel
88

99
from UM.Application import Application
1010
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
@@ -16,11 +16,11 @@
1616
class CuraSceneController(QObject):
1717
activeBuildPlateChanged = Signal()
1818

19-
def __init__(self, objects_model: ObjectsModel, build_plate_model: BuildPlateModel):
19+
def __init__(self, objects_model: ObjectsModel, multi_build_plate_model: MultiBuildPlateModel):
2020
super().__init__()
2121

2222
self._objects_model = objects_model
23-
self._build_plate_model = build_plate_model
23+
self._multi_build_plate_model = multi_build_plate_model
2424
self._active_build_plate = -1
2525

2626
self._last_selected_index = 0
@@ -41,9 +41,9 @@ def updateMaxBuildPlate(self, *args):
4141
self._max_build_plate = max_build_plate
4242
changed = True
4343
if changed:
44-
self._build_plate_model.setMaxBuildPlate(self._max_build_plate)
44+
self._multi_build_plate_model.setMaxBuildPlate(self._max_build_plate)
4545
build_plates = [{"name": "Build Plate %d" % (i + 1), "buildPlateNumber": i} for i in range(self._max_build_plate + 1)]
46-
self._build_plate_model.setItems(build_plates)
46+
self._multi_build_plate_model.setItems(build_plates)
4747
if self._active_build_plate > self._max_build_plate:
4848
build_plate_number = 0
4949
if self._last_selected_index >= 0: # go to the buildplate of the item you last selected
@@ -104,12 +104,12 @@ def setActiveBuildPlate(self, nr):
104104
self._active_build_plate = nr
105105
Selection.clear()
106106

107-
self._build_plate_model.setActiveBuildPlate(nr)
107+
self._multi_build_plate_model.setActiveBuildPlate(nr)
108108
self._objects_model.setActiveBuildPlate(nr)
109109
self.activeBuildPlateChanged.emit()
110110

111111
@staticmethod
112112
def createCuraSceneController():
113113
objects_model = Application.getInstance().getObjectsModel()
114-
build_plate_model = Application.getInstance().getBuildPlateModel()
115-
return CuraSceneController(objects_model = objects_model, build_plate_model = build_plate_model)
114+
multi_build_plate_model = Application.getInstance().getMultiBuildPlateModel()
115+
return CuraSceneController(objects_model = objects_model, multi_build_plate_model = multi_build_plate_model)

cura/Scene/CuraSceneNode.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ def isOutsideBuildArea(self):
2020
return self._outside_buildarea or self.callDecoration("getBuildPlateNumber") < 0
2121

2222
def isVisible(self):
23-
return super().isVisible() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate
23+
return super().isVisible() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().getMultiBuildPlateModel().activeBuildPlate
2424

2525
def isSelectable(self) -> bool:
26-
return super().isSelectable() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate
26+
return super().isSelectable() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().getMultiBuildPlateModel().activeBuildPlate
2727

2828
## Get the extruder used to print this node. If there is no active node, then the extruder in position zero is returned
2929
# TODO The best way to do it is by adding the setActiveExtruder decorator to every node when is loaded

0 commit comments

Comments
 (0)