def load(self) -> None: #Disable garbage collection to speed up the loading (at the cost of memory usage). gc.disable() resource_start_time = time.time() with self.lockCache(): #Because we might be writing cache files. for provider in self._providers: for container_id in list( provider.getAllIds() ): #Make copy of all IDs since it might change during iteration. if container_id not in self._containers: #Update UI while loading. from UM.Qt.QtApplication import QtApplication QtApplication.getInstance().processEvents( ) #Update the user interface because loading takes a while. Specifically the loading screen. try: self._containers[ container_id] = provider.loadContainer( container_id) except: Logger.logException("e", "Failed to load container %s", container_id) raise self.metadata[container_id] = self._containers[ container_id].getMetaData() self.source_provider[container_id] = provider self.containerLoadComplete.emit(container_id) gc.enable() Logger.log("d", "Loading data into container registry took %s seconds", time.time() - resource_start_time)
def __init__(self, device_id: str, connection_type: "ConnectionType" = ConnectionType.NotConnected, parent: QObject = None) -> None: super().__init__(device_id = device_id, parent = parent) # type: ignore # MyPy complains with the multiple inheritance self._printers = [] # type: List[PrinterOutputModel] self._unique_configurations = [] # type: List[PrinterConfigurationModel] self._monitor_view_qml_path = "" # type: str self._monitor_component = None # type: Optional[QObject] self._monitor_item = None # type: Optional[QObject] self._control_view_qml_path = "" # type: str self._control_component = None # type: Optional[QObject] self._control_item = None # type: Optional[QObject] self._accepts_commands = False # type: bool self._update_timer = QTimer() # type: QTimer self._update_timer.setInterval(2000) # TODO; Add preference for update interval self._update_timer.setSingleShot(False) self._update_timer.timeout.connect(self._update) self._connection_state = ConnectionState.Closed # type: ConnectionState self._connection_type = connection_type # type: ConnectionType self._firmware_updater = None # type: Optional[FirmwareUpdater] self._firmware_name = None # type: Optional[str] self._address = "" # type: str self._connection_text = "" # type: str self.printersChanged.connect(self._onPrintersChanged) QtApplication.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._updateUniqueConfigurations)
def __init__(self, width: int, height: int) -> None: super().__init__("picking", width, height) self._renderer = QtApplication.getInstance().getRenderer() self._shader = None #type: Optional[ShaderProgram] self._scene = QtApplication.getInstance().getController().getScene()
def __init__(self, parent = None) -> None: super().__init__(parent) self._max_layers = 0 self._current_layer_num = 0 self._minimum_layer_num = 0 self._current_layer_mesh = None self._current_layer_jumps = None self._top_layers_job = None # type: Optional["_CreateTopLayersJob"] self._activity = False self._old_max_layers = 0 self._max_paths = 0 self._current_path_num = 0 self._minimum_path_num = 0 self.currentLayerNumChanged.connect(self._onCurrentLayerNumChanged) self._busy = False self._simulation_running = False self._ghost_shader = None # type: Optional["ShaderProgram"] self._layer_pass = None # type: Optional[SimulationPass] self._composite_pass = None # type: Optional[CompositePass] self._old_layer_bindings = None # type: Optional[List[str]] self._simulationview_composite_shader = None # type: Optional["ShaderProgram"] self._old_composite_shader = None # type: Optional["ShaderProgram"] self._global_container_stack = None # type: Optional[ContainerStack] self._proxy = SimulationViewProxy() self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged) self._resetSettings() self._legend_items = None self._show_travel_moves = False self._nozzle_node = None # type: Optional[NozzleNode] Application.getInstance().getPreferences().addPreference("view/top_layer_count", 5) Application.getInstance().getPreferences().addPreference("view/only_show_top_layers", False) Application.getInstance().getPreferences().addPreference("view/force_layer_view_compatibility_mode", False) Application.getInstance().getPreferences().addPreference("layerview/layer_view_type", 0) Application.getInstance().getPreferences().addPreference("layerview/extruder_opacities", "") Application.getInstance().getPreferences().addPreference("layerview/show_travel_moves", False) Application.getInstance().getPreferences().addPreference("layerview/show_helpers", True) Application.getInstance().getPreferences().addPreference("layerview/show_skin", True) Application.getInstance().getPreferences().addPreference("layerview/show_infill", True) Application.getInstance().getPreferences().preferenceChanged.connect(self._onPreferencesChanged) self._updateWithPreferences() self._solid_layers = int(Application.getInstance().getPreferences().getValue("view/top_layer_count")) self._only_show_top_layers = bool(Application.getInstance().getPreferences().getValue("view/only_show_top_layers")) self._compatibility_mode = self._evaluateCompatibilityMode() self._wireprint_warning_message = Message(catalog.i18nc("@info:status", "Cura does not accurately display layers when Wire Printing is enabled"), title = catalog.i18nc("@info:title", "Simulation View")) QtApplication.getInstance().engineCreatedSignal.connect(self._onEngineCreated)
def _zoomCamera(self, zoom_range: float, event: Optional[Event] = None) -> None: camera = self._scene.getActiveCamera() if not camera or not camera.isEnabled(): return self.clipToZoom() if camera.isPerspective(): r = (camera.getWorldPosition() - self._origin).length() delta = r * (zoom_range / 128 / 10.0) r -= delta if self._invert_zoom: delta *= -1 move_vector = Vector(0.0, 0.0, 1.0) if event is not None and self._zoom_to_mouse: viewport_center_x = QtApplication.getInstance().getRenderer( ).getViewportWidth() / 2 viewport_center_y = QtApplication.getInstance().getRenderer( ).getViewportHeight() / 2 main_window = cast(MainWindow, QtApplication.getInstance().getMainWindow()) mouse_diff_center_x = viewport_center_x - main_window.mouseX mouse_diff_center_y = viewport_center_y - main_window.mouseY x_component = mouse_diff_center_x / QtApplication.getInstance( ).getRenderer().getViewportWidth() y_component = mouse_diff_center_y / QtApplication.getInstance( ).getRenderer().getViewportHeight() move_vector = Vector(x_component, -y_component, 1) move_vector = move_vector.normalized() move_vector = -delta * move_vector if delta != 0: if self._min_zoom < r < self._max_zoom: camera.translate(move_vector) if self._zoom_to_mouse: # Set the origin of the camera to the new distance, right in front of the new camera position. self._origin = (r * Vector(0.0, 0.0, -1.0)).preMultiply( camera.getWorldTransformation()) else: amount_of_zoom = zoom_range / 1280 / 10.0 if self._invert_zoom: amount_of_zoom *= -1 new_zoom_factor = camera.getZoomFactor() - amount_of_zoom if new_zoom_factor > 1: camera.setZoomFactor(1) elif new_zoom_factor < -0.495: camera.setZoomFactor(-0.495) else: camera.setZoomFactor(new_zoom_factor)
def __init__(self): Extension.__init__(self) QObject.__init__(self) self._scene = Application.getInstance().getController().getScene() self._CTRL = QtCore.Qt.MetaModifier if platform.system() == "Darwin" \ else QtCore.Qt.ControlModifier self._SAVE_MODIFIER = self._CTRL self._RESTORE_MODIFIER = QtCore.Qt.NoModifier self._cameraTrafos = [None] * 10 self._readTrafosFromJson() QtApplication.getInstance().installEventFilter(self)
def loadAllMetadata(self) -> None: for provider in self._providers: #Automatically sorted by the priority queue. for container_id in list(provider.getAllIds( )): #Make copy of all IDs since it might change during iteration. if container_id not in self.metadata: from UM.Qt.QtApplication import QtApplication QtApplication.getInstance().processEvents( ) #Update the user interface because loading takes a while. Specifically the loading screen. metadata = provider.loadMetadata(container_id) if metadata is None: continue self.metadata[container_id] = metadata self.source_provider[container_id] = provider ContainerRegistry.allMetadataLoaded.emit()
def _createControlViewFromQML(self) -> None: if not self._control_view_qml_path: return if self._control_item is None: self._control_item = QtApplication.getInstance( ).createQmlComponent(self._control_view_qml_path, {"OutputDevice": self})
def getColorMap(cls) -> numpy.ndarray: """Gets the instance of the VersionUpgradeManager, or creates one.""" if cls.__color_map is None: theme = cast(Theme, QtApplication.getInstance().getTheme()) cls.__color_map = numpy.array([ theme.getColor("layerview_none").getRgbF(), # NoneType theme.getColor("layerview_inset_0").getRgbF(), # Inset0Type theme.getColor("layerview_inset_x").getRgbF(), # InsetXType theme.getColor("layerview_skin").getRgbF(), # SkinType theme.getColor("layerview_support").getRgbF(), # SupportType theme.getColor("layerview_skirt").getRgbF(), # SkirtType theme.getColor("layerview_infill").getRgbF(), # InfillType theme.getColor( "layerview_support_infill").getRgbF(), # SupportInfillType theme.getColor( "layerview_move_combing").getRgbF(), # MoveCombingType theme.getColor("layerview_move_retraction").getRgbF( ), # MoveRetractionType theme.getColor("layerview_support_interface").getRgbF( ), # SupportInterfaceType theme.getColor( "layerview_prime_tower").getRgbF() # PrimeTowerType ]) return cls.__color_map
def __init__(self): Resources.addResourcePath(os.path.join(QtApplication.getInstallPrefix(), "share", "cura")) if not hasattr(sys, "frozen"): Resources.addResourcePath(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..")) super().__init__(name = "cura", version = "master") self.setRequiredPlugins([ "CuraEngineBackend", "MeshView", "LayerView", "STLReader", "SelectionTool", "CameraTool", "GCodeWriter", "LocalFileStorage" ]) self._physics = None self._volume = None self._platform = None self._output_devices = {} self._print_information = None self._i18n_catalog = None self.activeMachineChanged.connect(self._onActiveMachineChanged) Preferences.getInstance().addPreference("cura/active_machine", "") Preferences.getInstance().addPreference("cura/active_mode", "simple")
def __init__(self): Resources.addSearchPath(os.path.join(QtApplication.getInstallPrefix(), "share", "cura", "resources")) if not hasattr(sys, "frozen"): Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "resources")) self._open_file_queue = [] # Files to open when plug-ins are loaded. super().__init__(name = "cura", version = CuraVersion) self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) self.setRequiredPlugins([ "CuraEngineBackend", "MeshView", "LayerView", "STLReader", "SelectionTool", "CameraTool", "GCodeWriter", "LocalFileOutputDevice" ]) self._physics = None self._volume = None self._platform = None self._output_devices = {} self._print_information = None self._i18n_catalog = None self._previous_active_tool = None self._platform_activity = False self._scene_boundingbox = AxisAlignedBox() self._job_name = None self._center_after_select = False self._camera_animation = None self._cura_actions = None self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged) self.getMachineManager().addMachineRequested.connect(self._onAddMachineRequested) self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") Preferences.getInstance().addPreference("cura/active_machine", "") Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") Preferences.getInstance().addPreference("view/center_on_select", True) Preferences.getInstance().addPreference("mesh/scale_to_fit", True) Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode") JobQueue.getInstance().jobFinished.connect(self._onJobFinished) self._recent_files = [] files = Preferences.getInstance().getValue("cura/recent_files").split(";") for f in files: if not os.path.isfile(f): continue self._recent_files.append(QUrl.fromLocalFile(f))
def _onEngineCreated(self) -> None: from UM.Qt.QtApplication import QtApplication theme = QtApplication.getInstance().getTheme() if theme is None: Logger.log( "w", "Could not get theme, so unable to create tool handle meshes.") return self._disabled_axis_color = Color( *theme.getColor("disabled_axis").getRgb()) self._x_axis_color = Color(*theme.getColor("x_axis").getRgb()) self._y_axis_color = Color(*theme.getColor("y_axis").getRgb()) self._z_axis_color = Color(*theme.getColor("z_axis").getRgb()) self._all_axis_color = Color(*theme.getColor("all_axis").getRgb()) self._axis_color_map = { self.NoAxis: self._disabled_axis_color, self.XAxis: self._x_axis_color, self.YAxis: self._y_axis_color, self.ZAxis: self._z_axis_color, self.AllAxis: self._all_axis_color } for value in self.ExtraWidgets: self._extra_widgets_color_map[value] = self._getUnusedColor() self.buildMesh()
def __init__(self, app: QtApplication) -> None: super().__init__(app) self.packageMutations = Signal() # Emits SubscribedPackagesModel self._app = app self._package_manager = app.getPackageManager() self._dialog = None # type: Optional[QObject] self._compatibility_dialog_path = "resources/qml/dialogs/CompatibilityDialog.qml"
def _loadPlugins(self): self._plugin_registry.addPluginLocation(os.path.join(QtApplication.getInstallPrefix(), "lib", "cura")) if not hasattr(sys, "frozen"): self._plugin_registry.addPluginLocation(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "plugins")) self._plugin_registry.loadPlugin("ConsoleLogger") self._plugin_registry.loadPlugins() if self.getBackend() == None: raise RuntimeError("Could not load the backend plugin!")
def execute(self, data): Logger.log("d", "[Woodgrain Effect] Begin processing") # Show the progress bar self.progress_bar = Message(title="Apply Woodgrain Effect", text="This may take several minutes, please be patient.\n\n", lifetime=0, dismissable=False, progress=-1) self.progress_bar.show() # Start the processing thread self._locks = {} self._locks["metadata"] = threading.Lock() self._locks["output"] = threading.Lock() self.progress = (-1,0) self.output_gcode=[] self.apply_woodgrain_thread = threading.Thread(target=self.apply_woodgrain, args=(data,)) self.apply_woodgrain_thread.start() # Keep the GUI responsive while we wait, even though this script blocks the UI thread GUI_UPDATE_FREQUENCY = 50 # as used in cura source PROGRESS_CHECK_INTERVAL = 1000 # milliseconds update_period = 1 / GUI_UPDATE_FREQUENCY updates_per_check = int(GUI_UPDATE_FREQUENCY * (PROGRESS_CHECK_INTERVAL / 1000)) # Wait until the processing thread is done while True: for i in range(0, updates_per_check): QCoreApplication.processEvents() # Ensure that the GUI does not freeze. sleep(update_period) # Grab an update on the progress self._locks["metadata"].acquire() progress = self.progress self._locks["metadata"].release() # Update progress bar self.progress_bar.setProgress((progress[0] / progress[1]) * 100) # float(100) means complete # Check if Cura is still open.. # If it's not, this loop will just run forever main_window = QtApplication.getInstance().getMainWindow() if main_window is None: return None #close out the loop #Check if we're done if progress[0] >= progress[1]: self.apply_woodgrain_thread.join() break # Wrap things up and pass the modified gcode back to cura Logger.log("d", "[Woodgrain Effect] End processing. " + str(progress[1]) + " iterations performed") self.progress_bar.hide() return self.output_gcode
def __init__(self, node: SceneNode, hull: Optional[Polygon], thickness: float, parent: Optional[SceneNode] = None) -> None: """Convex hull node is a special type of scene node that is used to display an area, to indicate the location an object uses on the buildplate. This area (or area's in case of one at a time printing) is then displayed as a transparent shadow. If the adhesion type is set to raft, the area is extruded to represent the raft as well. """ super().__init__(parent) self.setCalculateBoundingBox(False) self._original_parent = parent # Color of the drawn convex hull if not Application.getInstance().getIsHeadLess(): theme = QtApplication.getInstance().getTheme() if theme: self._color = Color(*theme.getColor("convex_hull").getRgb()) else: self._color = Color(0, 0, 0) else: self._color = Color(0, 0, 0) # The y-coordinate of the convex hull mesh. Must not be 0, to prevent z-fighting. self._mesh_height = 0.1 self._thickness = thickness # The node this mesh is "watching" self._node = node # Area of the head + fans for display as a shadow on the buildplate self._convex_hull_head_mesh = None # type: Optional[MeshData] self._node.decoratorsChanged.connect(self._onNodeDecoratorsChanged) self._onNodeDecoratorsChanged(self._node) self._hull = hull if self._hull: hull_mesh_builder = MeshBuilder() if self._thickness == 0: if hull_mesh_builder.addConvexPolygon( self._hull.getPoints()[::], # bottom layer is reversed self._mesh_height, color = self._color): hull_mesh_builder.resetNormals() hull_mesh = hull_mesh_builder.build() self.setMeshData(hull_mesh) else: if hull_mesh_builder.addConvexPolygonExtrusion( self._hull.getPoints()[::-1], # bottom layer is reversed self._mesh_height - thickness, self._mesh_height, color = self._color): hull_mesh_builder.resetNormals() hull_mesh = hull_mesh_builder.build() self.setMeshData(hull_mesh)
def __init__(self): Resources.addSearchPath( os.path.join(QtApplication.getInstallPrefix(), "share", "cura")) if not hasattr(sys, "frozen"): Resources.addSearchPath( os.path.join(os.path.abspath(os.path.dirname(__file__)), "..")) super().__init__(name="cura", version="master") self.setWindowIcon( QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) self.setRequiredPlugins([ "CuraEngineBackend", "MeshView", "LayerView", "STLReader", "SelectionTool", "CameraTool", "GCodeWriter", "LocalFileOutputDevice" ]) self._physics = None self._volume = None self._platform = None self._output_devices = {} self._print_information = None self._i18n_catalog = None self._previous_active_tool = None self._platform_activity = False self._job_name = None self.getMachineManager().activeMachineInstanceChanged.connect( self._onActiveMachineChanged) self.getMachineManager().addMachineRequested.connect( self._onAddMachineRequested) self.getController().getScene().sceneChanged.connect( self.updatePlatformActivity) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") Preferences.getInstance().addPreference("cura/active_machine", "") Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") Preferences.getInstance().addPreference("view/center_on_select", True) Preferences.getInstance().addPreference("mesh/scale_to_fit", True) JobQueue.getInstance().jobFinished.connect(self._onJobFinished) self._recent_files = [] files = Preferences.getInstance().getValue("cura/recent_files").split( ";") for f in files: if not os.path.isfile(f): continue self._recent_files.append(QUrl.fromLocalFile(f))
def _onEngineCreated() -> None: start_spacemouse_daemon( SpaceMouseTool.spacemouse_move_callback, SpaceMouseTool.spacemouse_button_press_callback, SpaceMouseTool.spacemouse_button_release_callback) if platform.system() == "Windows": # the windows api requires the hwnd (window id) mainWindow = cast(MainWindow, QtApplication.getInstance().getMainWindow()) windowId = mainWindow.winId() set_window_handle(windowId.ascapsule()) # windows api cannot poll for events in parallel to the qt event loop # so we have pass the events to the daemon so that it can check for # space mouse events SpaceMouseTool._filterObj = WinEventFilterObj() QtApplication.getInstance().installNativeEventFilter( SpaceMouseTool._filterObj) Logger.log("d", "Initialized SpaceMouseTool")
def _zoomCamera(self, zoom_range: float, event: Optional[Event] = None) -> None: camera = self._scene.getActiveCamera() if not camera or not camera.isEnabled(): return self.clipToZoom() self._scene.getSceneLock().acquire() r = (camera.getWorldPosition() - self._origin).length() delta = r * (zoom_range / 128 / 10.0) r -= delta if self._invert_zoom: delta *= -1 move_vector = Vector(0.0, 0.0, 1.0) if event is not None and self._zoom_to_mouse: viewport_center_x = QtApplication.getInstance().getRenderer().getViewportWidth() / 2 viewport_center_y = QtApplication.getInstance().getRenderer().getViewportHeight() / 2 main_window = cast(MainWindow, QtApplication.getInstance().getMainWindow()) mouse_diff_center_x = viewport_center_x - main_window.mouseX mouse_diff_center_y = viewport_center_y - main_window.mouseY x_component = mouse_diff_center_x / QtApplication.getInstance().getRenderer().getViewportWidth() y_component = mouse_diff_center_y / QtApplication.getInstance().getRenderer().getViewportHeight() move_vector = Vector(x_component, -y_component, 1) move_vector = move_vector.normalized() move_vector = -delta * move_vector if delta != 0: if self._min_zoom < r < self._max_zoom: camera.translate(move_vector) if self._zoom_to_mouse: # Set the origin of the camera to the new distance, right in front of the new camera position. self._origin = (r * Vector(0.0, 0.0, -1.0)).preMultiply(camera.getWorldTransformation()) self._scene.getSceneLock().release()
def _loadPlugins(self): self._plugin_registry.addPluginLocation(os.path.join(QtApplication.getInstallPrefix(), "lib", "cura")) if not hasattr(sys, "frozen"): self._plugin_registry.addPluginLocation(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "plugins")) self._plugin_registry.loadPlugins({ "type": "logger"}) self._plugin_registry.loadPlugins({ "type": "storage_device" }) self._plugin_registry.loadPlugins({ "type": "view" }) self._plugin_registry.loadPlugins({ "type": "mesh_reader" }) self._plugin_registry.loadPlugins({ "type": "mesh_writer" }) self._plugin_registry.loadPlugins({ "type": "tool" }) self._plugin_registry.loadPlugins({ "type": "extension" }) self._plugin_registry.loadPlugin("CuraEngineBackend")
def _resetDrawBuffer(self) -> None: #Create a new buffer so that we don't change the data of a job that's still processing. self._draw_buffer = QImage( QtApplication.getInstance().getMainWindow().width(), QtApplication.getInstance().getMainWindow().height(), QImage.Format_Grayscale8) self._draw_buffer.fill(Qt.black) QtApplication.getInstance().getController().getView( "SolidView").setExtraOverhang(self._draw_buffer) QtApplication.getInstance().getMainWindow().update() #Force a redraw.
def __init__(self): Resources.addSearchPath(os.path.join(QtApplication.getInstallPrefix(), "share", "nk")) if not hasattr(sys, "frozen"): Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..")) super().__init__(name="nk", version=NinjaVersion) self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "nk-icon.png"))) self.setRequiredPlugins([ "NinjaKittenBackend", "MeshView", "STLReader", "SelectionTool", "CameraTool", "TrotecWriter", "LocalFileOutputDevice" ]) self._volume = None self._platform = None self._output_devices = {} self._i18n_catalog = None self._previous_active_tool = None self._platform_activity = False self._job_name = None self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Preferences.getInstance().addPreference("nk/active_machine", "") Preferences.getInstance().addPreference("nk/active_mode", "simple") Preferences.getInstance().addPreference("nk/recent_files", "") Preferences.getInstance().addPreference("nk/categories_expanded", "") Preferences.getInstance().addPreference("view/center_on_select", True) Preferences.getInstance().addPreference("mesh/scale_to_fit", True) JobQueue.getInstance().jobFinished.connect(self._onJobFinished) self._recent_files = [] files = Preferences.getInstance().getValue("nk/recent_files").split(";") for f in files: if not os.path.isfile(f): continue self._recent_files.append(QUrl.fromLocalFile(f)) self._addAllMachines()
def __init__(self): Resources.addResourcePath(os.path.join(QtApplication.getInstallPrefix(), "share", "cura")) if not hasattr(sys, "frozen"): Resources.addResourcePath(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..")) super().__init__(name = "cura", version = "master") self.setWindowIcon(QIcon(Resources.getPath(Resources.ImagesLocation, "cura-icon.png"))) self.setRequiredPlugins([ "CuraEngineBackend", "MeshView", "LayerView", "STLReader", "SelectionTool", "CameraTool", "GCodeWriter", "LocalFileOutputDevice" ]) self._physics = None self._volume = None self._platform = None self._output_devices = {} self._print_information = None self._i18n_catalog = None self._previous_active_tool = None self._platform_activity = False self.activeMachineChanged.connect(self._onActiveMachineChanged) self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) Preferences.getInstance().addPreference("cura/active_machine", "") Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") Preferences.getInstance().addPreference("view/center_on_select", True) Preferences.getInstance().addPreference("mesh/scale_to_fit", True) JobQueue.getInstance().jobFinished.connect(self._onJobFinished) self._recent_files = [] files = Preferences.getInstance().getValue("cura/recent_files").split(";") for f in files: if not os.path.isfile(f): continue self._recent_files.append(QUrl.fromLocalFile(f))
def __init__(self, node: SceneNode, hull: Optional[Polygon], thickness: float, parent: Optional[SceneNode] = None) -> None: super().__init__(parent) self.setCalculateBoundingBox(False) self._original_parent = parent # Color of the drawn convex hull if not Application.getInstance().getIsHeadLess(): theme = QtApplication.getInstance().getTheme() if theme: self._color = Color(*theme.getColor("convex_hull").getRgb()) else: self._color = Color(0, 0, 0) else: self._color = Color(0, 0, 0) # The y-coordinate of the convex hull mesh. Must not be 0, to prevent z-fighting. self._mesh_height = 0.1 self._thickness = thickness # The node this mesh is "watching" self._node = node # Area of the head + fans for display as a shadow on the buildplate self._convex_hull_head_mesh = None # type: Optional[MeshData] self._node.decoratorsChanged.connect(self._onNodeDecoratorsChanged) self._onNodeDecoratorsChanged(self._node) self._hull = hull if self._hull: hull_mesh_builder = MeshBuilder() if hull_mesh_builder.addConvexPolygonExtrusion( self._hull.getPoints()[::-1], # bottom layer is reversed self._mesh_height - thickness, self._mesh_height, color=self._color): hull_mesh = hull_mesh_builder.build() self.setMeshData(hull_mesh)
def buildMesh(self): from UM.Qt.QtApplication import QtApplication theme = QtApplication.getInstance().getTheme() self._disabled_axis_color = Color( *theme.getColor("disabled_axis").getRgb()) self._x_axis_color = Color(*theme.getColor("x_axis").getRgb()) self._y_axis_color = Color(*theme.getColor("y_axis").getRgb()) self._z_axis_color = Color(*theme.getColor("z_axis").getRgb()) self._all_axis_color = Color(*theme.getColor("all_axis").getRgb()) self._axis_color_map = { self.NoAxis: self._disabled_axis_color, self.XAxis: self._x_axis_color, self.YAxis: self._y_axis_color, self.ZAxis: self._z_axis_color, self.AllAxis: self._all_axis_color }
def __init__(self): Resources.addResourcePath(os.path.join(QtApplication.getInstallPrefix(), "share", "cura")) if not hasattr(sys, "frozen"): Resources.addResourcePath(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..")) super().__init__(name = "cura", version = "master") self.setWindowIcon(QIcon(Resources.getPath(Resources.ImagesLocation, "cura-icon.png"))) self.setRequiredPlugins([ "CuraEngineBackend", "MeshView", "LayerView", "STLReader", "SelectionTool", "CameraTool", "GCodeWriter", "LocalFileStorage" ]) self._physics = None self._volume = None self._platform = None self._output_devices = {} self._print_information = None self._i18n_catalog = None self._previous_active_tool = None self.activeMachineChanged.connect(self._onActiveMachineChanged) Preferences.getInstance().addPreference("cura/active_machine", "") Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") JobQueue.getInstance().jobFinished.connect(self._onJobFinished) self._recent_files = [] files = Preferences.getInstance().getValue("cura/recent_files").split(";") for f in files: if not os.path.isfile(f): continue self._recent_files.append(QUrl.fromLocalFile(f))
def __init__(self, node: SceneNode, hull: Optional[Polygon], thickness: float, parent: Optional[SceneNode] = None) -> None: super().__init__(parent) self.setCalculateBoundingBox(False) self._original_parent = parent # Color of the drawn convex hull if not Application.getInstance().getIsHeadLess(): theme = QtApplication.getInstance().getTheme() if theme: self._color = Color(*theme.getColor("convex_hull").getRgb()) else: self._color = Color(0, 0, 0) else: self._color = Color(0, 0, 0) # The y-coordinate of the convex hull mesh. Must not be 0, to prevent z-fighting. self._mesh_height = 0.1 self._thickness = thickness # The node this mesh is "watching" self._node = node self._convex_hull_head_mesh = None self._node.decoratorsChanged.connect(self._onNodeDecoratorsChanged) self._onNodeDecoratorsChanged(self._node) self._hull = hull if self._hull: hull_mesh_builder = MeshBuilder() if hull_mesh_builder.addConvexPolygonExtrusion( self._hull.getPoints()[::-1], # bottom layer is reversed self._mesh_height - thickness, self._mesh_height, color = self._color): hull_mesh = hull_mesh_builder.build() self.setMeshData(hull_mesh)
def getColorMap(cls): if cls.__color_map is None: theme = QtApplication.getInstance().getTheme() cls.__color_map = numpy.array([ theme.getColor("layerview_none").getRgbF(), # NoneType theme.getColor("layerview_inset_0").getRgbF(), # Inset0Type theme.getColor("layerview_inset_x").getRgbF(), # InsetXType theme.getColor("layerview_skin").getRgbF(), # SkinType theme.getColor("layerview_support").getRgbF(), # SupportType theme.getColor("layerview_skirt").getRgbF(), # SkirtType theme.getColor("layerview_infill").getRgbF(), # InfillType theme.getColor( "layerview_support_infill").getRgbF(), # SupportInfillType theme.getColor( "layerview_move_combing").getRgbF(), # MoveCombingType theme.getColor("layerview_move_retraction").getRgbF( ), # MoveRetractionType theme.getColor("layerview_support_interface").getRgbF( ), # SupportInterfaceType theme.getColor( "layerview_prime_tower").getRgbF() # PrimeTowerType ]) return cls.__color_map
def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) from UM.Qt.QtApplication import QtApplication self._application = QtApplication.getInstance() self._handler = QtApplication.getInstance().getMeshFileHandler()
def __init__(self): Resources.addSearchPath( os.path.join(QtApplication.getInstallPrefix(), "share", "cura", "resources")) if not hasattr(sys, "frozen"): Resources.addSearchPath( os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "resources")) self._open_file_queue = [] # Files to open when plug-ins are loaded. # Need to do this before ContainerRegistry tries to load the machines SettingDefinition.addSupportedProperty("settable_per_mesh", DefinitionPropertyType.Any, default=True, read_only=True) SettingDefinition.addSupportedProperty("settable_per_extruder", DefinitionPropertyType.Any, default=True, read_only=True) # this setting can be changed for each group in one-at-a-time mode SettingDefinition.addSupportedProperty("settable_per_meshgroup", DefinitionPropertyType.Any, default=True, read_only=True) SettingDefinition.addSupportedProperty("settable_globally", DefinitionPropertyType.Any, default=True, read_only=True) # From which stack the setting would inherit if not defined per object (handled in the engine) # AND for settings which are not settable_per_mesh: # which extruder is the only extruder this setting is obtained from SettingDefinition.addSupportedProperty("limit_to_extruder", DefinitionPropertyType.Function, default="-1") # For settings which are not settable_per_mesh and not settable_per_extruder: # A function which determines the glabel/meshgroup value by looking at the values of the setting in all (used) extruders SettingDefinition.addSupportedProperty("resolve", DefinitionPropertyType.Function, default=None) SettingDefinition.addSettingType("extruder", None, str, Validator) SettingFunction.registerOperator( "extruderValues", cura.Settings.ExtruderManager.getExtruderValues) SettingFunction.registerOperator( "extruderValue", cura.Settings.ExtruderManager.getExtruderValue) SettingFunction.registerOperator( "resolveOrValue", cura.Settings.ExtruderManager.getResolveOrValue) ## Add the 4 types of profiles to storage. Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") Resources.addStorageType(self.ResourceTypes.MaterialInstanceContainer, "materials") Resources.addStorageType(self.ResourceTypes.UserInstanceContainer, "user") Resources.addStorageType(self.ResourceTypes.ExtruderStack, "extruders") Resources.addStorageType(self.ResourceTypes.MachineStack, "machine_instances") ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.QualityInstanceContainer) ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.VariantInstanceContainer) ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.MaterialInstanceContainer) ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.UserInstanceContainer) ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.ExtruderStack) ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.MachineStack) ## Initialise the version upgrade manager with Cura's storage paths. import UM.VersionUpgradeManager #Needs to be here to prevent circular dependencies. UM.VersionUpgradeManager.VersionUpgradeManager.getInstance( ).setCurrentVersions({ ("quality", UM.Settings.InstanceContainer.Version): (self.ResourceTypes.QualityInstanceContainer, "application/x-uranium-instancecontainer"), ("machine_stack", UM.Settings.ContainerStack.Version): (self.ResourceTypes.MachineStack, "application/x-uranium-containerstack"), ("preferences", UM.Preferences.Version): (Resources.Preferences, "application/x-uranium-preferences"), ("user", UM.Settings.InstanceContainer.Version): (self.ResourceTypes.UserInstanceContainer, "application/x-uranium-instancecontainer") }) self._machine_action_manager = MachineActionManager.MachineActionManager( ) self._machine_manager = None # This is initialized on demand. self._setting_inheritance_manager = None self._additional_components = { } # Components to add to certain areas in the interface super().__init__(name="cura", version=CuraVersion, buildtype=CuraBuildType) self.setWindowIcon( QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) self.setRequiredPlugins([ "CuraEngineBackend", "MeshView", "LayerView", "STLReader", "SelectionTool", "CameraTool", "GCodeWriter", "LocalFileOutputDevice" ]) self._physics = None self._volume = None self._output_devices = {} self._print_information = None self._previous_active_tool = None self._platform_activity = False self._scene_bounding_box = AxisAlignedBox.Null self._job_name = None self._center_after_select = False self._camera_animation = None self._cura_actions = None self._started = False self._message_box_callback = None self._message_box_callback_arguments = [] self._i18n_catalog = i18nCatalog("cura") self.getController().getScene().sceneChanged.connect( self.updatePlatformActivity) self.getController().toolOperationStopped.connect( self._onToolOperationStopped) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") self.showSplashMessage( self._i18n_catalog.i18nc("@info:progress", "Loading machines...")) # Add empty variant, material and quality containers. # Since they are empty, they should never be serialized and instead just programmatically created. # We need them to simplify the switching between materials. empty_container = ContainerRegistry.getInstance( ).getEmptyInstanceContainer() empty_variant_container = copy.deepcopy(empty_container) empty_variant_container._id = "empty_variant" empty_variant_container.addMetaDataEntry("type", "variant") ContainerRegistry.getInstance().addContainer(empty_variant_container) empty_material_container = copy.deepcopy(empty_container) empty_material_container._id = "empty_material" empty_material_container.addMetaDataEntry("type", "material") ContainerRegistry.getInstance().addContainer(empty_material_container) empty_quality_container = copy.deepcopy(empty_container) empty_quality_container._id = "empty_quality" empty_quality_container.setName("Not supported") empty_quality_container.addMetaDataEntry("quality_type", "normal") empty_quality_container.addMetaDataEntry("type", "quality") ContainerRegistry.getInstance().addContainer(empty_quality_container) empty_quality_changes_container = copy.deepcopy(empty_container) empty_quality_changes_container._id = "empty_quality_changes" empty_quality_changes_container.addMetaDataEntry( "type", "quality_changes") ContainerRegistry.getInstance().addContainer( empty_quality_changes_container) # Set the filename to create if cura is writing in the config dir. self._config_lock_filename = os.path.join( Resources.getConfigStoragePath(), CONFIG_LOCK_FILENAME) self.waitConfigLockFile() ContainerRegistry.getInstance().load() Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") Preferences.getInstance().addPreference("cura/jobname_prefix", True) Preferences.getInstance().addPreference("view/center_on_select", True) Preferences.getInstance().addPreference("mesh/scale_to_fit", True) Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True) for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin "dialog_profile_path", "dialog_material_path" ]: Preferences.getInstance().addPreference("local_file/%s" % key, os.path.expanduser("~/")) Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode") Preferences.getInstance().setDefault( "general/visible_settings", """ machine_settings resolution layer_height shell wall_thickness top_bottom_thickness infill infill_sparse_density material material_print_temperature material_bed_temperature material_diameter material_flow retraction_enable speed speed_print speed_travel acceleration_print acceleration_travel jerk_print jerk_travel travel cooling cool_fan_enabled support support_enable support_extruder_nr support_type support_interface_density platform_adhesion adhesion_type adhesion_extruder_nr brim_width raft_airgap layer_0_z_overlap raft_surface_layers dual prime_tower_enable prime_tower_size prime_tower_position_x prime_tower_position_y meshfix blackmagic print_sequence infill_mesh experimental """.replace("\n", ";").replace(" ", "")) JobQueue.getInstance().jobFinished.connect(self._onJobFinished) self.applicationShuttingDown.connect(self.saveSettings) self.engineCreatedSignal.connect(self._onEngineCreated) self._recent_files = [] files = Preferences.getInstance().getValue("cura/recent_files").split( ";") for f in files: if not os.path.isfile(f): continue self._recent_files.append(QUrl.fromLocalFile(f))
def _cursorCoordinates(self) -> Tuple[int, int]: return QtApplication.getInstance().getMainWindow( ).mouseX, QtApplication.getInstance().getMainWindow().mouseY
def event(self, event: Event): if event.type == Event.ToolActivateEvent: active_view = QtApplication.getInstance().getController( ).getActiveView() if active_view is not None: self._previous_view = active_view.getPluginId() QtApplication.getInstance().getController().setActiveView( "SolidView") #QtApplication.getInstance().getController().disableSelection() QtApplication.getInstance().setOverrideCursor(self._cursor) elif event.type == Event.ToolDeactivateEvent: if self._previous_view is not None: QtApplication.getInstance().getController().setActiveView( self._previous_view) self._previous_view = None QtApplication.getInstance().getController().enableSelection() QtApplication.getInstance().restoreOverrideCursor() elif event.type == Event.MousePressEvent and MouseEvent.LeftButton in event.buttons: #Reset the draw buffer and start painting. self._draw_buffer = QImage( QtApplication.getInstance().getMainWindow().width(), QtApplication.getInstance().getMainWindow().height(), QImage.Format_Grayscale8) self._draw_buffer.fill(Qt.black) self._painter = QPainter(self._draw_buffer) self._painter.setBrush(QBrush(Qt.white)) self._painter.setPen(self._endcap_pen) self._last_x, self._last_y = self._cursorCoordinates() self._painter.drawEllipse( self._last_x - self.brush_size / 2, self._last_y - self.brush_size / 2, self.brush_size, self.brush_size ) #Paint an initial ellipse at the spot you're clicking. QtApplication.getInstance().getController().getView( "SolidView").setExtraOverhang(self._draw_buffer) elif event.type == Event.MouseReleaseEvent and MouseEvent.LeftButton in event.buttons: #Complete drawing. self._last_x, self._last_y = self._cursorCoordinates() if self._painter: self._painter.setPen(self._endcap_pen) self._painter.drawEllipse( self._last_x - self.brush_size / 2, self._last_y - self.brush_size / 2, self.brush_size, self.brush_size ) #Paint another ellipse when you're releasing as endcap. self._painter = None QtApplication.getInstance().getController().getView( "SolidView").setExtraOverhang(self._draw_buffer) self._constructSupport( self._draw_buffer) #Actually place the support. self._resetDrawBuffer() elif event.type == Event.MouseMoveEvent and self._painter is not None: #While dragging. self._painter.setPen(self._line_pen) new_x, new_y = self._cursorCoordinates() self._painter.drawLine(self._last_x, self._last_y, new_x, new_y) self._last_x = new_x self._last_y = new_y QtApplication.getInstance().getController().getView( "SolidView").setExtraOverhang(self._draw_buffer)
def __init__(self): Resources.addSearchPath( os.path.join(QtApplication.getInstallPrefix(), "share", "cura", "resources")) if not hasattr(sys, "frozen"): Resources.addSearchPath( os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "resources")) self._open_file_queue = [] # Files to open when plug-ins are loaded. # Need to do this before ContainerRegistry tries to load the machines SettingDefinition.addSupportedProperty("global_only", DefinitionPropertyType.Function, default=False) SettingDefinition.addSettingType("extruder", int, str, UM.Settings.Validator) super().__init__(name="cura", version=CuraVersion, buildtype=CuraBuildType) self.setWindowIcon( QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) self.setRequiredPlugins([ "CuraEngineBackend", "MeshView", "LayerView", "STLReader", "SelectionTool", "CameraTool", "GCodeWriter", "LocalFileOutputDevice" ]) self._physics = None self._volume = None self._platform = None self._output_devices = {} self._print_information = None self._i18n_catalog = None self._previous_active_tool = None self._platform_activity = False self._scene_bounding_box = AxisAlignedBox() self._job_name = None self._center_after_select = False self._camera_animation = None self._cura_actions = None self._started = False self.getController().getScene().sceneChanged.connect( self.updatePlatformActivity) self.getController().toolOperationStopped.connect( self._onToolOperationStopped) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") ## Add the 4 types of profiles to storage. Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") Resources.addStorageType(self.ResourceTypes.MaterialInstanceContainer, "materials") Resources.addStorageType(self.ResourceTypes.UserInstanceContainer, "user") Resources.addStorageType(self.ResourceTypes.ExtruderStack, "extruders") Resources.addStorageType(self.ResourceTypes.MachineStack, "machine_instances") ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.QualityInstanceContainer) ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.VariantInstanceContainer) ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.MaterialInstanceContainer) ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.UserInstanceContainer) ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.ExtruderStack) ContainerRegistry.getInstance().addResourceType( self.ResourceTypes.MachineStack) # Add empty variant, material and quality containers. # Since they are empty, they should never be serialized and instead just programmatically created. # We need them to simplify the switching between materials. empty_container = ContainerRegistry.getInstance( ).getEmptyInstanceContainer() empty_variant_container = copy.deepcopy(empty_container) empty_variant_container._id = "empty_variant" empty_variant_container.addMetaDataEntry("type", "variant") ContainerRegistry.getInstance().addContainer(empty_variant_container) empty_material_container = copy.deepcopy(empty_container) empty_material_container._id = "empty_material" empty_material_container.addMetaDataEntry("type", "material") ContainerRegistry.getInstance().addContainer(empty_material_container) empty_quality_container = copy.deepcopy(empty_container) empty_quality_container._id = "empty_quality" empty_quality_container.addMetaDataEntry("type", "quality") ContainerRegistry.getInstance().addContainer(empty_quality_container) ContainerRegistry.getInstance().load() Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") Preferences.getInstance().addPreference("cura/jobname_prefix", True) Preferences.getInstance().addPreference("view/center_on_select", True) Preferences.getInstance().addPreference("mesh/scale_to_fit", True) Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True) Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode") Preferences.getInstance().setDefault( "general/visible_settings", """ machine_settings resolution layer_height shell wall_thickness top_bottom_thickness infill infill_sparse_density material material_print_temperature material_bed_temperature material_diameter material_flow retraction_enable speed speed_print speed_travel travel cooling cool_fan_enabled support support_enable support_type support_roof_density platform_adhesion adhesion_type brim_width raft_airgap layer_0_z_overlap raft_surface_layers meshfix blackmagic print_sequence dual experimental """.replace("\n", ";").replace(" ", "")) JobQueue.getInstance().jobFinished.connect(self._onJobFinished) self.applicationShuttingDown.connect(self.saveSettings) self._recent_files = [] files = Preferences.getInstance().getValue("cura/recent_files").split( ";") for f in files: if not os.path.isfile(f): continue self._recent_files.append(QUrl.fromLocalFile(f))
def __init__(self): Resources.addSearchPath(os.path.join(QtApplication.getInstallPrefix(), "share", "cura", "resources")) if not hasattr(sys, "frozen"): Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "resources")) self._open_file_queue = [] # Files to open when plug-ins are loaded. # Need to do this before ContainerRegistry tries to load the machines SettingDefinition.addSupportedProperty("global_only", DefinitionPropertyType.Function, default = False) SettingDefinition.addSettingType("extruder", int, str, UM.Settings.Validator) super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType) self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) self.setRequiredPlugins([ "CuraEngineBackend", "MeshView", "LayerView", "STLReader", "SelectionTool", "CameraTool", "GCodeWriter", "LocalFileOutputDevice" ]) self._physics = None self._volume = None self._platform = None self._output_devices = {} self._print_information = None self._i18n_catalog = None self._previous_active_tool = None self._platform_activity = False self._scene_bounding_box = AxisAlignedBox() self._job_name = None self._center_after_select = False self._camera_animation = None self._cura_actions = None self._started = False self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") ## Add the 4 types of profiles to storage. Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") Resources.addStorageType(self.ResourceTypes.MaterialInstanceContainer, "materials") Resources.addStorageType(self.ResourceTypes.UserInstanceContainer, "user") Resources.addStorageType(self.ResourceTypes.ExtruderStack, "extruders") Resources.addStorageType(self.ResourceTypes.MachineStack, "machine_instances") ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.QualityInstanceContainer) ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.VariantInstanceContainer) ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MaterialInstanceContainer) ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.UserInstanceContainer) ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.ExtruderStack) ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MachineStack) # Add empty variant, material and quality containers. # Since they are empty, they should never be serialized and instead just programmatically created. # We need them to simplify the switching between materials. empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() empty_variant_container = copy.deepcopy(empty_container) empty_variant_container._id = "empty_variant" empty_variant_container.addMetaDataEntry("type", "variant") ContainerRegistry.getInstance().addContainer(empty_variant_container) empty_material_container = copy.deepcopy(empty_container) empty_material_container._id = "empty_material" empty_material_container.addMetaDataEntry("type", "material") ContainerRegistry.getInstance().addContainer(empty_material_container) empty_quality_container = copy.deepcopy(empty_container) empty_quality_container._id = "empty_quality" empty_quality_container.addMetaDataEntry("type", "quality") ContainerRegistry.getInstance().addContainer(empty_quality_container) ContainerRegistry.getInstance().load() Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") Preferences.getInstance().addPreference("cura/jobname_prefix", True) Preferences.getInstance().addPreference("view/center_on_select", True) Preferences.getInstance().addPreference("mesh/scale_to_fit", True) Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True) Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode") Preferences.getInstance().setDefault("general/visible_settings", """ machine_settings resolution layer_height shell wall_thickness top_bottom_thickness infill infill_sparse_density material material_print_temperature material_bed_temperature material_diameter material_flow retraction_enable speed speed_print speed_travel travel cooling cool_fan_enabled support support_enable support_type support_roof_density platform_adhesion adhesion_type brim_width raft_airgap layer_0_z_overlap raft_surface_layers meshfix blackmagic print_sequence dual experimental """.replace("\n", ";").replace(" ", "")) JobQueue.getInstance().jobFinished.connect(self._onJobFinished) self.applicationShuttingDown.connect(self.saveSettings) self._recent_files = [] files = Preferences.getInstance().getValue("cura/recent_files").split(";") for f in files: if not os.path.isfile(f): continue self._recent_files.append(QUrl.fromLocalFile(f))
def __init__(self): Resources.addSearchPath(os.path.join(QtApplication.getInstallPrefix(), "share", "cura", "resources")) if not hasattr(sys, "frozen"): Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "resources")) self._open_file_queue = [] # Files to open when plug-ins are loaded. # Need to do this before ContainerRegistry tries to load the machines SettingDefinition.addSupportedProperty("settable_per_mesh", DefinitionPropertyType.Any, default = True, read_only = True) SettingDefinition.addSupportedProperty("settable_per_extruder", DefinitionPropertyType.Any, default = True, read_only = True) # this setting can be changed for each group in one-at-a-time mode SettingDefinition.addSupportedProperty("settable_per_meshgroup", DefinitionPropertyType.Any, default = True, read_only = True) SettingDefinition.addSupportedProperty("settable_globally", DefinitionPropertyType.Any, default = True, read_only = True) # From which stack the setting would inherit if not defined per object (handled in the engine) # AND for settings which are not settable_per_mesh: # which extruder is the only extruder this setting is obtained from SettingDefinition.addSupportedProperty("limit_to_extruder", DefinitionPropertyType.Function, default = "-1") # For settings which are not settable_per_mesh and not settable_per_extruder: # A function which determines the glabel/meshgroup value by looking at the values of the setting in all (used) extruders SettingDefinition.addSupportedProperty("resolve", DefinitionPropertyType.Function, default = None, depends_on = "value") SettingDefinition.addSettingType("extruder", None, str, Validator) SettingFunction.registerOperator("extruderValues", cura.Settings.ExtruderManager.getExtruderValues) SettingFunction.registerOperator("extruderValue", cura.Settings.ExtruderManager.getExtruderValue) SettingFunction.registerOperator("resolveOrValue", cura.Settings.ExtruderManager.getResolveOrValue) ## Add the 4 types of profiles to storage. Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") Resources.addStorageType(self.ResourceTypes.MaterialInstanceContainer, "materials") Resources.addStorageType(self.ResourceTypes.UserInstanceContainer, "user") Resources.addStorageType(self.ResourceTypes.ExtruderStack, "extruders") Resources.addStorageType(self.ResourceTypes.MachineStack, "machine_instances") ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.QualityInstanceContainer) ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.VariantInstanceContainer) ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MaterialInstanceContainer) ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.UserInstanceContainer) ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.ExtruderStack) ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MachineStack) ## Initialise the version upgrade manager with Cura's storage paths. import UM.VersionUpgradeManager #Needs to be here to prevent circular dependencies. UM.VersionUpgradeManager.VersionUpgradeManager.getInstance().setCurrentVersions( { ("quality", UM.Settings.InstanceContainer.Version): (self.ResourceTypes.QualityInstanceContainer, "application/x-uranium-instancecontainer"), ("machine_stack", UM.Settings.ContainerStack.Version): (self.ResourceTypes.MachineStack, "application/x-uranium-containerstack"), ("preferences", UM.Preferences.Version): (Resources.Preferences, "application/x-uranium-preferences"), ("user", UM.Settings.InstanceContainer.Version): (self.ResourceTypes.UserInstanceContainer, "application/x-uranium-instancecontainer") } ) self._machine_action_manager = MachineActionManager.MachineActionManager() self._machine_manager = None # This is initialized on demand. self._setting_inheritance_manager = None self._additional_components = {} # Components to add to certain areas in the interface super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType) self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) self.setRequiredPlugins([ "CuraEngineBackend", "MeshView", "LayerView", "STLReader", "SelectionTool", "CameraTool", "GCodeWriter", "LocalFileOutputDevice" ]) self._physics = None self._volume = None self._output_devices = {} self._print_information = None self._previous_active_tool = None self._platform_activity = False self._scene_bounding_box = AxisAlignedBox.Null self._job_name = None self._center_after_select = False self._camera_animation = None self._cura_actions = None self._started = False self._message_box_callback = None self._message_box_callback_arguments = [] self._i18n_catalog = i18nCatalog("cura") self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading machines...")) # Add empty variant, material and quality containers. # Since they are empty, they should never be serialized and instead just programmatically created. # We need them to simplify the switching between materials. empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() empty_variant_container = copy.deepcopy(empty_container) empty_variant_container._id = "empty_variant" empty_variant_container.addMetaDataEntry("type", "variant") ContainerRegistry.getInstance().addContainer(empty_variant_container) empty_material_container = copy.deepcopy(empty_container) empty_material_container._id = "empty_material" empty_material_container.addMetaDataEntry("type", "material") ContainerRegistry.getInstance().addContainer(empty_material_container) empty_quality_container = copy.deepcopy(empty_container) empty_quality_container._id = "empty_quality" empty_quality_container.setName("Not supported") empty_quality_container.addMetaDataEntry("quality_type", "normal") empty_quality_container.addMetaDataEntry("type", "quality") ContainerRegistry.getInstance().addContainer(empty_quality_container) empty_quality_changes_container = copy.deepcopy(empty_container) empty_quality_changes_container._id = "empty_quality_changes" empty_quality_changes_container.addMetaDataEntry("type", "quality_changes") ContainerRegistry.getInstance().addContainer(empty_quality_changes_container) # Set the filename to create if cura is writing in the config dir. self._config_lock_filename = os.path.join(Resources.getConfigStoragePath(), CONFIG_LOCK_FILENAME) self.waitConfigLockFile() ContainerRegistry.getInstance().load() Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") Preferences.getInstance().addPreference("cura/jobname_prefix", True) Preferences.getInstance().addPreference("view/center_on_select", True) Preferences.getInstance().addPreference("mesh/scale_to_fit", True) Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True) for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin "dialog_profile_path", "dialog_material_path"]: Preferences.getInstance().addPreference("local_file/%s" % key, os.path.expanduser("~/")) Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode") Preferences.getInstance().setDefault("general/visible_settings", """ machine_settings resolution layer_height shell wall_thickness top_bottom_thickness infill infill_sparse_density material material_print_temperature material_bed_temperature material_diameter material_flow retraction_enable speed speed_print speed_travel acceleration_print acceleration_travel jerk_print jerk_travel travel cooling cool_fan_enabled support support_enable support_extruder_nr support_type support_interface_density platform_adhesion adhesion_type adhesion_extruder_nr brim_width raft_airgap layer_0_z_overlap raft_surface_layers dual prime_tower_enable prime_tower_size prime_tower_position_x prime_tower_position_y meshfix blackmagic print_sequence infill_mesh experimental """.replace("\n", ";").replace(" ", "")) JobQueue.getInstance().jobFinished.connect(self._onJobFinished) self.applicationShuttingDown.connect(self.saveSettings) self.engineCreatedSignal.connect(self._onEngineCreated) self._recent_files = [] files = Preferences.getInstance().getValue("cura/recent_files").split(";") for f in files: if not os.path.isfile(f): continue self._recent_files.append(QUrl.fromLocalFile(f))
def __init__(self, parent=None) -> None: super().__init__(parent) self._max_layers = 0 self._current_layer_num = 0 self._minimum_layer_num = 0 self._current_layer_mesh = None self._current_layer_jumps = None self._top_layers_job = None # type: Optional["_CreateTopLayersJob"] self._activity = False self._old_max_layers = 0 self._max_paths = 0 self._current_path_num = 0 self._minimum_path_num = 0 self.currentLayerNumChanged.connect(self._onCurrentLayerNumChanged) self._busy = False self._simulation_running = False self._ghost_shader = None # type: Optional["ShaderProgram"] self._layer_pass = None # type: Optional[SimulationPass] self._composite_pass = None # type: Optional[CompositePass] self._old_layer_bindings = None # type: Optional[List[str]] self._simulationview_composite_shader = None # type: Optional["ShaderProgram"] self._old_composite_shader = None # type: Optional["ShaderProgram"] self._max_feedrate = sys.float_info.min self._min_feedrate = sys.float_info.max self._max_thickness = sys.float_info.min self._min_thickness = sys.float_info.max self._max_line_width = sys.float_info.min self._min_line_width = sys.float_info.max self._global_container_stack = None # type: Optional[ContainerStack] self._proxy = None self._resetSettings() self._legend_items = None self._show_travel_moves = False self._nozzle_node = None # type: Optional[NozzleNode] Application.getInstance().getPreferences().addPreference( "view/top_layer_count", 5) Application.getInstance().getPreferences().addPreference( "view/only_show_top_layers", False) Application.getInstance().getPreferences().addPreference( "view/force_layer_view_compatibility_mode", False) Application.getInstance().getPreferences().addPreference( "layerview/layer_view_type", 1) # Default to "Line Type". Application.getInstance().getPreferences().addPreference( "layerview/extruder_opacities", "") Application.getInstance().getPreferences().addPreference( "layerview/show_travel_moves", False) Application.getInstance().getPreferences().addPreference( "layerview/show_helpers", True) Application.getInstance().getPreferences().addPreference( "layerview/show_skin", True) Application.getInstance().getPreferences().addPreference( "layerview/show_infill", True) Application.getInstance().getPreferences().addPreference( "layerview/show_starts", True) self._updateWithPreferences() self._solid_layers = int( Application.getInstance().getPreferences().getValue( "view/top_layer_count")) self._only_show_top_layers = bool( Application.getInstance().getPreferences().getValue( "view/only_show_top_layers")) self._compatibility_mode = self._evaluateCompatibilityMode() self._wireprint_warning_message = Message(catalog.i18nc( "@info:status", "Cura does not accurately display layers when Wire Printing is enabled." ), title=catalog.i18nc( "@info:title", "Simulation View")) self._slice_first_warning_message = Message( catalog.i18nc("@info:status", "Nothing is shown because you need to slice first."), title=catalog.i18nc("@info:title", "No layers to show"), option_text=catalog.i18nc("@info:option_text", "Do not show this message again"), option_state=False) self._slice_first_warning_message.optionToggled.connect( self._onDontAskMeAgain) CuraApplication.getInstance().getPreferences().addPreference( self._no_layers_warning_preference, True) QtApplication.getInstance().engineCreatedSignal.connect( self._onEngineCreated)
def __init__(self, filename: str) -> None: super().__init__(filename) from UM.Qt.QtApplication import QtApplication self._application = QtApplication.getInstance() self._handler = QtApplication.getInstance().getMeshFileHandler()
def _createMonitorViewFromQML(self) -> None: if not self._monitor_view_qml_path: return if self._monitor_item is None: self._monitor_item = QtApplication.getInstance().createQmlComponent(self._monitor_view_qml_path, {"OutputDevice": self})