diff --git a/CMakeLists.txt b/CMakeLists.txt index c591ffa625..a18c4585d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,7 @@ if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "") CREATE_TRANSLATION_TARGETS() endif() -find_package(PythonInterp 3.4.0 REQUIRED) +find_package(PythonInterp 3.5.0 REQUIRED) install(DIRECTORY resources DESTINATION ${CMAKE_INSTALL_DATADIR}/cura) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index c1a62c872b..5c147d2006 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -75,8 +75,8 @@ class BuildVolume(SceneNode): self._has_errors = False Application.getInstance().getController().getScene().sceneChanged.connect(self._onSceneChanged) - # Number of objects loaded at the moment. - self._number_of_objects = 0 + #Objects loaded at the moment. We are connected to the property changed events of these objects. + self._scene_objects = set() self._change_timer = QTimer() self._change_timer.setInterval(100) @@ -102,14 +102,33 @@ class BuildVolume(SceneNode): def _onChangeTimerFinished(self): root = Application.getInstance().getController().getScene().getRoot() - new_number_of_objects = len([node for node in BreadthFirstIterator(root) if node.getMeshData() and type(node) is SceneNode]) - if new_number_of_objects != self._number_of_objects: - recalculate = False - if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time": - recalculate = (new_number_of_objects < 2 and self._number_of_objects > 1) or (new_number_of_objects > 1 and self._number_of_objects < 2) - self._number_of_objects = new_number_of_objects - if recalculate: - self._onSettingPropertyChanged("print_sequence", "value") # Create fake event, so right settings are triggered. + new_scene_objects = set(node for node in BreadthFirstIterator(root) if node.getMeshData() and type(node) is SceneNode) + if new_scene_objects != self._scene_objects: + for node in new_scene_objects - self._scene_objects: #Nodes that were added to the scene. + node.decoratorsChanged.connect(self._onNodeDecoratorChanged) + for node in self._scene_objects - new_scene_objects: #Nodes that were removed from the scene. + per_mesh_stack = node.callDecoration("getStack") + if per_mesh_stack: + per_mesh_stack.propertyChanged.disconnect(self._onSettingPropertyChanged) + active_extruder_changed = node.callDecoration("getActiveExtruderChangedSignal") + if active_extruder_changed is not None: + node.callDecoration("getActiveExtruderChangedSignal").disconnect(self._updateDisallowedAreasAndRebuild) + node.decoratorsChanged.disconnect(self._onNodeDecoratorChanged) + + self._scene_objects = new_scene_objects + self._onSettingPropertyChanged("print_sequence", "value") # Create fake event, so right settings are triggered. + + ## Updates the listeners that listen for changes in per-mesh stacks. + # + # \param node The node for which the decorators changed. + def _onNodeDecoratorChanged(self, node): + per_mesh_stack = node.callDecoration("getStack") + if per_mesh_stack: + per_mesh_stack.propertyChanged.connect(self._onSettingPropertyChanged) + active_extruder_changed = node.callDecoration("getActiveExtruderChangedSignal") + if active_extruder_changed is not None: + active_extruder_changed.connect(self._updateDisallowedAreasAndRebuild) + self._updateDisallowedAreasAndRebuild() def setWidth(self, width): if width: self._width = width @@ -324,7 +343,7 @@ class BuildVolume(SceneNode): self._width = self._global_container_stack.getProperty("machine_width", "value") machine_height = self._global_container_stack.getProperty("machine_height", "value") - if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time" and self._number_of_objects > 1: + if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time" and len(self._scene_objects) > 1: self._height = min(self._global_container_stack.getProperty("gantry_height", "value"), machine_height) if self._height < machine_height: self._build_volume_message.show() @@ -347,7 +366,7 @@ class BuildVolume(SceneNode): rebuild_me = False if setting_key == "print_sequence": machine_height = self._global_container_stack.getProperty("machine_height", "value") - if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time" and self._number_of_objects > 1: + if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time" and len(self._scene_objects) > 1: self._height = min(self._global_container_stack.getProperty("gantry_height", "value"), machine_height) if self._height < machine_height: self._build_volume_message.show() @@ -358,7 +377,7 @@ class BuildVolume(SceneNode): self._build_volume_message.hide() rebuild_me = True - if setting_key in self._skirt_settings or setting_key in self._prime_settings or setting_key in self._tower_settings or setting_key == "print_sequence" or setting_key in self._ooze_shield_settings or setting_key in self._distance_settings: + if setting_key in self._skirt_settings or setting_key in self._prime_settings or setting_key in self._tower_settings or setting_key == "print_sequence" or setting_key in self._ooze_shield_settings or setting_key in self._distance_settings or setting_key in self._extruder_settings: self._updateDisallowedAreas() rebuild_me = True @@ -372,24 +391,109 @@ class BuildVolume(SceneNode): def hasErrors(self): return self._has_errors + ## Calls _updateDisallowedAreas and makes sure the changes appear in the + # scene. + # + # This is required for a signal to trigger the update in one go. The + # ``_updateDisallowedAreas`` method itself shouldn't call ``rebuild``, + # since there may be other changes before it needs to be rebuilt, which + # would hit performance. + def _updateDisallowedAreasAndRebuild(self): + self._updateDisallowedAreas() + self.rebuild() + def _updateDisallowedAreas(self): if not self._global_container_stack: return - self._has_errors = False # Reset. self._error_areas = [] - disallowed_areas = copy.deepcopy( - self._global_container_stack.getProperty("machine_disallowed_areas", "value")) - areas = [] - machine_width = self._global_container_stack.getProperty("machine_width", "value") - machine_depth = self._global_container_stack.getProperty("machine_depth", "value") - prime_tower_area = None + extruder_manager = ExtruderManager.getInstance() + used_extruders = extruder_manager.getUsedExtruderStacks() + disallowed_border_size = self._getEdgeDisallowedSize() + + result_areas = self._computeDisallowedAreasStatic(disallowed_border_size, used_extruders) #Normal machine disallowed areas can always be added. + prime_areas = self._computeDisallowedAreasPrime(disallowed_border_size, used_extruders) + prime_disallowed_areas = self._computeDisallowedAreasStatic(0, used_extruders) #Where the priming is not allowed to happen. This is not added to the result, just for collision checking. + + #Check if prime positions intersect with disallowed areas. + for extruder in used_extruders: + extruder_id = extruder.getId() + + collision = False + for prime_polygon in prime_areas[extruder_id]: + for disallowed_polygon in prime_disallowed_areas[extruder_id]: + if prime_polygon.intersectsPolygon(disallowed_polygon) is not None: + collision = True + break + if collision: + break + + #Also check other prime positions (without additional offset). + for other_extruder_id in prime_areas: + if extruder_id == other_extruder_id: #It is allowed to collide with itself. + continue + for other_prime_polygon in prime_areas[other_extruder_id]: + if prime_polygon.intersectsPolygon(other_prime_polygon): + collision = True + break + if collision: + break + if collision: + break + + + if not collision: + #Prime areas are valid. Add as normal. + result_areas[extruder_id].extend(prime_areas[extruder_id]) + + nozzle_disallowed_areas = extruder.getProperty("nozzle_disallowed_areas", "value") + for area in nozzle_disallowed_areas: + polygon = Polygon(numpy.array(area, numpy.float32)) + polygon = polygon.getMinkowskiHull(Polygon.approximatedCircle(disallowed_border_size)) + result_areas[extruder_id].append(polygon) #Don't perform the offset on these. # Add prime tower location as disallowed area. + prime_tower_collision = False + prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders) + for extruder_id in prime_tower_areas: + for prime_tower_area in prime_tower_areas[extruder_id]: + for area in result_areas[extruder_id]: + if prime_tower_area.intersectsPolygon(area) is not None: + prime_tower_collision = True + break + if prime_tower_collision: #Already found a collision. + break + if not prime_tower_collision: + result_areas[extruder_id].extend(prime_tower_areas[extruder_id]) + else: + self._error_areas.extend(prime_tower_areas[extruder_id]) + + self._has_errors = len(self._error_areas) > 0 + + self._disallowed_areas = [] + for extruder_id in result_areas: + self._disallowed_areas.extend(result_areas[extruder_id]) + + ## Computes the disallowed areas for objects that are printed with print + # features. + # + # This means that the brim, travel avoidance and such will be applied to + # these features. + # + # \return A dictionary with for each used extruder ID the disallowed areas + # where that extruder may not print. + def _computeDisallowedAreasPrinted(self, used_extruders): + result = {} + for extruder in used_extruders: + result[extruder.getId()] = [] + + #Currently, the only normally printed object is the prime tower. if ExtruderManager.getInstance().getResolveOrValue("prime_tower_enable") == True: prime_tower_size = self._global_container_stack.getProperty("prime_tower_size", "value") - prime_tower_x = self._global_container_stack.getProperty("prime_tower_position_x", "value") - machine_width / 2 + machine_width = self._global_container_stack.getProperty("machine_width", "value") + machine_depth = self._global_container_stack.getProperty("machine_depth", "value") + prime_tower_x = self._global_container_stack.getProperty("prime_tower_position_x", "value") - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left. prime_tower_y = - self._global_container_stack.getProperty("prime_tower_position_y", "value") + machine_depth / 2 prime_tower_area = Polygon([ @@ -398,118 +502,118 @@ class BuildVolume(SceneNode): [prime_tower_x, prime_tower_y], [prime_tower_x - prime_tower_size, prime_tower_y], ]) - disallowed_polygons = [] + prime_tower_area = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(0)) + for extruder in used_extruders: + result[extruder.getId()].append(prime_tower_area) #The prime tower location is the same for each extruder, regardless of offset. - # Check if prime positions intersect with disallowed areas - prime_collision = False - if disallowed_areas: - for area in disallowed_areas: - poly = Polygon(numpy.array(area, numpy.float32)) + return result - # Minkowski with zero, to ensure that the polygon is correct & watertight. - poly = poly.getMinkowskiHull(Polygon.approximatedCircle(0)) - disallowed_polygons.append(poly) + ## Computes the disallowed areas for the prime locations. + # + # These are special because they are not subject to things like brim or + # travel avoidance. They do get a dilute with the border size though + # because they may not intersect with brims and such of other objects. + # + # \param border_size The size with which to offset the disallowed areas + # due to skirt, brim, travel avoid distance, etc. + # \param used_extruders The extruder stacks to generate disallowed areas + # for. + # \return A dictionary with for each used extruder ID the prime areas. + def _computeDisallowedAreasPrime(self, border_size, used_extruders): + result = {} - extruder_manager = ExtruderManager.getInstance() - extruders = extruder_manager.getMachineExtruders(self._global_container_stack.getId()) - prime_polygons = [] - # Each extruder has it's own prime location - for extruder in extruders: - prime_x = extruder.getProperty("extruder_prime_pos_x", "value") - machine_width / 2 - prime_y = machine_depth / 2 - extruder.getProperty("extruder_prime_pos_y", "value") + machine_width = self._global_container_stack.getProperty("machine_width", "value") + machine_depth = self._global_container_stack.getProperty("machine_depth", "value") + for extruder in used_extruders: + prime_x = extruder.getProperty("extruder_prime_pos_x", "value") - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left. + prime_y = machine_depth / 2 - extruder.getProperty("extruder_prime_pos_y", "value") - prime_polygon = Polygon([ - [prime_x - PRIME_CLEARANCE, prime_y - PRIME_CLEARANCE], - [prime_x + PRIME_CLEARANCE, prime_y - PRIME_CLEARANCE], - [prime_x + PRIME_CLEARANCE, prime_y + PRIME_CLEARANCE], - [prime_x - PRIME_CLEARANCE, prime_y + PRIME_CLEARANCE], - ]) - prime_polygon = prime_polygon.getMinkowskiHull(Polygon.approximatedCircle(0)) - collision = False + prime_polygon = Polygon.approximatedCircle(PRIME_CLEARANCE) + prime_polygon = prime_polygon.translate(prime_x, prime_y) + prime_polygon = prime_polygon.getMinkowskiHull(Polygon.approximatedCircle(border_size)) + result[extruder.getId()] = [prime_polygon] - # Check if prime polygon is intersecting with any of the other disallowed areas. - # Note that we check the prime area without bed adhesion. - for poly in disallowed_polygons: - if prime_polygon.intersectsPolygon(poly) is not None: - collision = True - break + return result - # Also collide with other prime positions - for poly in prime_polygons: - if prime_polygon.intersectsPolygon(poly) is not None: - collision = True - break + ## Computes the disallowed areas that are statically placed in the machine. + # + # It computes different disallowed areas depending on the offset of the + # extruder. The resulting dictionary will therefore have an entry for each + # extruder that is used. + # + # \param border_size The size with which to offset the disallowed areas + # due to skirt, brim, travel avoid distance, etc. + # \param used_extruders The extruder stacks to generate disallowed areas + # for. + # \return A dictionary with for each used extruder ID the disallowed areas + # where that extruder may not print. + def _computeDisallowedAreasStatic(self, border_size, used_extruders): + #Convert disallowed areas to polygons and dilate them. + machine_disallowed_polygons = [] + for area in self._global_container_stack.getProperty("machine_disallowed_areas", "value"): + polygon = Polygon(numpy.array(area, numpy.float32)) + polygon = polygon.getMinkowskiHull(Polygon.approximatedCircle(border_size)) + machine_disallowed_polygons.append(polygon) - if not collision: - # Prime area is valid. Add as normal. - # Once it's added like this, it will recieve a bed adhesion offset, just like the others. - prime_polygons.append(prime_polygon) - else: - self._error_areas.append(prime_polygon) - prime_collision = collision or prime_collision + result = {} + for extruder in used_extruders: + extruder_id = extruder.getId() + offset_x = extruder.getProperty("machine_nozzle_offset_x", "value") + if offset_x is None: + offset_x = 0 + offset_y = extruder.getProperty("machine_nozzle_offset_y", "value") + if offset_y is None: + offset_y = 0 + result[extruder_id] = [] - disallowed_polygons.extend(prime_polygons) + for polygon in machine_disallowed_polygons: + result[extruder_id].append(polygon.translate(offset_x, offset_y)) #Compensate for the nozzle offset of this extruder. - disallowed_border_size = self._getEdgeDisallowedSize() - - # Extend every area already in the disallowed_areas with the skirt size. - if disallowed_areas: - for poly in disallowed_polygons: - poly = poly.getMinkowskiHull(Polygon.approximatedCircle(disallowed_border_size)) - areas.append(poly) - - # Add the skirt areas around the borders of the build plate. - if disallowed_border_size > 0: + #Add the border around the edge of the build volume. + left_unreachable_border = 0 + right_unreachable_border = 0 + top_unreachable_border = 0 + bottom_unreachable_border = 0 + #The build volume is defined as the union of the area that all extruders can reach, so we need to know the relative offset to all extruders. + for other_extruder in ExtruderManager.getInstance().getActiveExtruderStacks(): + other_offset_x = other_extruder.getProperty("machine_nozzle_offset_x", "value") + other_offset_y = other_extruder.getProperty("machine_nozzle_offset_y", "value") + left_unreachable_border = min(left_unreachable_border, other_offset_x - offset_x) + right_unreachable_border = max(right_unreachable_border, other_offset_x - offset_x) + top_unreachable_border = min(top_unreachable_border, other_offset_y - offset_y) + bottom_unreachable_border = max(bottom_unreachable_border, other_offset_y - offset_y) half_machine_width = self._global_container_stack.getProperty("machine_width", "value") / 2 half_machine_depth = self._global_container_stack.getProperty("machine_depth", "value") / 2 + if border_size - left_unreachable_border > 0: + result[extruder_id].append(Polygon(numpy.array([ + [-half_machine_width, -half_machine_depth], + [-half_machine_width, half_machine_depth], + [-half_machine_width + border_size - left_unreachable_border, half_machine_depth - border_size - bottom_unreachable_border], + [-half_machine_width + border_size - left_unreachable_border, -half_machine_depth + border_size - top_unreachable_border] + ], numpy.float32))) + if border_size + right_unreachable_border > 0: + result[extruder_id].append(Polygon(numpy.array([ + [half_machine_width, half_machine_depth], + [half_machine_width, -half_machine_depth], + [half_machine_width - border_size - right_unreachable_border, -half_machine_depth + border_size - top_unreachable_border], + [half_machine_width - border_size - right_unreachable_border, half_machine_depth - border_size - bottom_unreachable_border] + ], numpy.float32))) + if border_size + bottom_unreachable_border > 0: + result[extruder_id].append(Polygon(numpy.array([ + [-half_machine_width, half_machine_depth], + [half_machine_width, half_machine_depth], + [half_machine_width - border_size - right_unreachable_border, half_machine_depth - border_size - bottom_unreachable_border], + [-half_machine_width + border_size - left_unreachable_border, half_machine_depth - border_size - bottom_unreachable_border] + ], numpy.float32))) + if border_size - top_unreachable_border > 0: + result[extruder_id].append(Polygon(numpy.array([ + [half_machine_width, -half_machine_depth], + [-half_machine_width, -half_machine_depth], + [-half_machine_width + border_size - left_unreachable_border, -half_machine_depth + border_size - top_unreachable_border], + [half_machine_width - border_size - right_unreachable_border, -half_machine_depth + border_size - top_unreachable_border] + ], numpy.float32))) - areas.append(Polygon(numpy.array([ - [-half_machine_width, -half_machine_depth], - [-half_machine_width, half_machine_depth], - [-half_machine_width + disallowed_border_size, half_machine_depth - disallowed_border_size], - [-half_machine_width + disallowed_border_size, -half_machine_depth + disallowed_border_size] - ], numpy.float32))) - - areas.append(Polygon(numpy.array([ - [half_machine_width, half_machine_depth], - [half_machine_width, -half_machine_depth], - [half_machine_width - disallowed_border_size, -half_machine_depth + disallowed_border_size], - [half_machine_width - disallowed_border_size, half_machine_depth - disallowed_border_size] - ], numpy.float32))) - - areas.append(Polygon(numpy.array([ - [-half_machine_width, half_machine_depth], - [half_machine_width, half_machine_depth], - [half_machine_width - disallowed_border_size, half_machine_depth - disallowed_border_size], - [-half_machine_width + disallowed_border_size, half_machine_depth - disallowed_border_size] - ], numpy.float32))) - - areas.append(Polygon(numpy.array([ - [half_machine_width, -half_machine_depth], - [-half_machine_width, -half_machine_depth], - [-half_machine_width + disallowed_border_size, -half_machine_depth + disallowed_border_size], - [half_machine_width - disallowed_border_size, -half_machine_depth + disallowed_border_size] - ], numpy.float32))) - - # Check if the prime tower area intersects with any of the other areas. - # If this is the case, add it to the error area's so it can be drawn in red. - # If not, add it back to disallowed area's, so it's rendered as normal. - prime_tower_collision = False - if prime_tower_area: - # Using Minkowski of 0 fixes the prime tower area so it's rendered correctly - prime_tower_area = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(0)) - for area in areas: - if prime_tower_area.intersectsPolygon(area) is not None: - prime_tower_collision = True - break - - if not prime_tower_collision: - areas.append(prime_tower_area) - else: - self._error_areas.append(prime_tower_area) - # The buildplate has errors if either prime tower or prime has a colission. - self._has_errors = prime_tower_collision or prime_collision - self._disallowed_areas = areas + return result ## Private convenience function to get a setting from the adhesion # extruder. @@ -633,3 +737,4 @@ class BuildVolume(SceneNode): _tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y"] _ooze_shield_settings = ["ooze_shield_enabled", "ooze_shield_dist"] _distance_settings = ["infill_wipe_dist", "travel_avoid_distance", "support_offset", "support_enable", "travel_avoid_other_parts"] + _extruder_settings = ["support_enable", "support_interface_enable", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_interface_extruder_nr", "brim_line_count", "adhesion_extruder_nr", "adhesion_type"] #Settings that can affect which extruders are used. \ No newline at end of file diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 59e5a15f71..0216bacce4 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -558,7 +558,9 @@ class CuraApplication(QtApplication): qmlRegisterSingletonType(cura.Settings.ContainerManager, "Cura", 1, 0, "ContainerManager", cura.Settings.ContainerManager.createContainerManager) - qmlRegisterSingletonType(QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml")), "Cura", 1, 0, "Actions") + # As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work. + actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml"))) + qmlRegisterSingletonType(actions_url, "Cura", 1, 0, "Actions") engine.rootContext().setContextProperty("ExtruderManager", cura.Settings.ExtruderManager.getInstance()) @@ -571,11 +573,17 @@ class CuraApplication(QtApplication): def onSelectionChanged(self): if Selection.hasSelection(): - if not self.getController().getActiveTool(): + if self.getController().getActiveTool(): + # If the tool has been disabled by the new selection + if not self.getController().getActiveTool().getEnabled(): + # Default + self.getController().setActiveTool("TranslateTool") + else: if self._previous_active_tool: self.getController().setActiveTool(self._previous_active_tool) self._previous_active_tool = None else: + # Default self.getController().setActiveTool("TranslateTool") if Preferences.getInstance().getValue("view/center_on_select"): self._center_after_select = True @@ -686,10 +694,9 @@ class CuraApplication(QtApplication): while current_node.getParent() and current_node.getParent().callDecoration("isGroup"): current_node = current_node.getParent() - new_node = copy.deepcopy(current_node) - op = GroupedOperation() for _ in range(count): + new_node = copy.deepcopy(current_node) op.addOperation(AddSceneNodeOperation(new_node, current_node.getParent())) op.push() @@ -866,7 +873,7 @@ class CuraApplication(QtApplication): return # Compute the center of the objects when their origins are aligned. - object_centers = [node.getBoundingBox().center for node in group_node.getChildren()] + object_centers = [node.getMeshData().getCenterPosition().scale(node.getScale()) for node in group_node.getAllChildren() if node.getMeshData()] if object_centers and len(object_centers) > 0: middle_x = sum([v.x for v in object_centers]) / len(object_centers) middle_y = sum([v.y for v in object_centers]) / len(object_centers) @@ -877,7 +884,7 @@ class CuraApplication(QtApplication): # Move each node to the same position. for center, node in zip(object_centers, group_node.getChildren()): # Align the object and also apply the offset to center it inside the group. - node.translate(-1 * (center - offset), SceneNode.TransformSpace.World) + node.setPosition(center - offset) # Use the previously found center of the group bounding box as the new location of the group group_node.setPosition(group_node.getBoundingBox().center) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index efabeae641..b2e3f5fd33 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -138,14 +138,14 @@ class PrinterOutputDevice(QObject, OutputDevice): def startCamera(self): self._startCamera() - def _startCamera(self, job_state): + def _startCamera(self): Logger.log("w", "_startCamera is not implemented by this output device") @pyqtSlot() def stopCamera(self): self._stopCamera() - def _stopCamera(self, job_state): + def _stopCamera(self): Logger.log("w", "_stopCamera is not implemented by this output device") @pyqtProperty(str, notify = jobNameChanged) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 50d2034860..d414386563 100644 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -5,6 +5,8 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot, QObject, QVariant # import UM.Application #To get the global container stack to find the current machine. import UM.Logger +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator #To find which extruders are used in the scene. +from UM.Scene.SceneNode import SceneNode #To find which extruders are used in the scene. import UM.Settings.ContainerRegistry #Finding containers by ID. import UM.Settings.SettingFunction @@ -299,6 +301,59 @@ class ExtruderManager(QObject): result.append(stack.getProperty(setting_key, property)) return result + ## Gets the extruder stacks that are actually being used at the moment. + # + # An extruder stack is being used if it is the extruder to print any mesh + # with, or if it is the support infill extruder, the support interface + # extruder, or the bed adhesion extruder. + # + # If there are no extruders, this returns the global stack as a singleton + # list. + # + # \return A list of extruder stacks. + def getUsedExtruderStacks(self): + global_stack = UM.Application.getInstance().getGlobalContainerStack() + container_registry = UM.Settings.ContainerRegistry.getInstance() + + if global_stack.getProperty("machine_extruder_count", "value") <= 1: #For single extrusion. + return [global_stack] + + used_extruder_stack_ids = set() + + #Get the extruders of all meshes in the scene. + support_enabled = False + support_interface_enabled = False + scene_root = UM.Application.getInstance().getController().getScene().getRoot() + meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] #Only use the nodes that will be printed. + for mesh in meshes: + extruder_stack_id = mesh.callDecoration("getActiveExtruder") + if not extruder_stack_id: #No per-object settings for this node. + extruder_stack_id = self.extruderIds["0"] + used_extruder_stack_ids.add(extruder_stack_id) + + #Get whether any of them use support. + per_mesh_stack = mesh.callDecoration("getStack") + if per_mesh_stack: + support_enabled |= per_mesh_stack.getProperty("support_enable", "value") + support_interface_enabled |= per_mesh_stack.getProperty("support_interface_enable", "value") + else: #Take the setting from the build extruder stack. + extruder_stack = container_registry.findContainerStacks(id = extruder_stack_id)[0] + support_enabled |= extruder_stack.getProperty("support_enable", "value") + support_interface_enabled |= extruder_stack.getProperty("support_enable", "value") + + #The support extruders. + if support_enabled: + used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_infill_extruder_nr", "value"))]) + used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_extruder_nr_layer_0", "value"))]) + if support_interface_enabled: + used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_interface_extruder_nr", "value"))]) + + #The platform adhesion extruder. Not used if using brim and brim width is 0. + if global_stack.getProperty("adhesion_type", "value") != "brim" or global_stack.getProperty("brim_line_count", "value") > 0: + used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("adhesion_extruder_nr", "value"))]) + + return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids] + ## Removes the container stack and user profile for the extruders for a specific machine. # # \param machine_id The machine to remove the extruders for. diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index a8cfcd8d80..d38dac565b 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -61,6 +61,12 @@ class SettingOverrideDecorator(SceneNodeDecorator): def getActiveExtruder(self): return self._extruder_stack + ## Gets the signal that emits if the active extruder changed. + # + # This can then be accessed via a decorator. + def getActiveExtruderChangedSignal(self): + return self.activeExtruderChanged + ## Gets the currently active extruders position # # \return An extruder's position, or None if no position info is available. diff --git a/resources/definitions/bfb.def.json b/resources/definitions/bfb.def.json new file mode 100644 index 0000000000..b685b3d94d --- /dev/null +++ b/resources/definitions/bfb.def.json @@ -0,0 +1,40 @@ +{ + "id": "bfb", + "name": "BFB", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "BFB", + "category": "Other", + "file_formats": "text/x-gcode", + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "speed_topbottom": { "default_value": 40 }, + "speed_print": { "default_value": 40 }, + "machine_extruder_count": { "default_value": 1 }, + "prime_tower_size": { "default_value": 7.745966692414834 }, + "machine_name": { "default_value": "BFB_Test" }, + "machine_heated_bed": { "default_value": false }, + "machine_nozzle_size": { "default_value": 0.5 }, + "speed_layer_0": { "default_value": 25 }, + "machine_width": { "default_value": 275 }, + "machine_gcode_flavor": { "default_value": "BFB" }, + "machine_depth": { "default_value": 265 }, + "speed_infill": { "default_value": 30 }, + "material_diameter": { "default_value": 1.7 }, + "machine_center_is_zero": { "default_value": true }, + "machine_height": { "default_value": 240 }, + "layer_height": { "default_value": 0.25 }, + "material_print_temperature": { "default_value": 200 }, + "retraction_amount": { "default_value": 0.05 }, + "speed_wall_0": { "default_value": 25 }, + "speed_travel": { "default_value": 50 }, + "infill_sparse_density": { "default_value": 10 }, + "layer_height_0": { "default_value": 0.5 }, + "speed_wall_x": { "default_value": 20 } + } +} diff --git a/resources/definitions/deltabot.def.json b/resources/definitions/deltabot.def.json new file mode 100644 index 0000000000..5d36857e9e --- /dev/null +++ b/resources/definitions/deltabot.def.json @@ -0,0 +1,35 @@ +{ + "id": "deltabot", + "name": "DeltaBot", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Danny Lu", + "category": "Other", + "file_formats": "text/x-gcode", + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "speed_travel": { "default_value": 150 }, + "prime_tower_size": { "default_value": 8.660254037844387 }, + "infill_sparse_density": { "default_value": 10 }, + "speed_wall_x": { "default_value": 30 }, + "speed_wall_0": { "default_value": 30 }, + "speed_topbottom": { "default_value": 30 }, + "layer_height": { "default_value": 0.2 }, + "machine_nozzle_size": { "default_value": 0.5 }, + "speed_print": { "default_value": 30 }, + "speed_infill": { "default_value": 30 }, + "machine_extruder_count": { "default_value": 1 }, + "machine_heated_bed": { "default_value": true }, + "machine_center_is_zero": { "default_value": true }, + "machine_height": { "default_value": 150 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_depth": { "default_value": 150 }, + "machine_width": { "default_value": 150 }, + "machine_name": { "default_value": "DeltaBot style" } + } +} diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 97ca82b1d6..1962476424 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -283,6 +283,18 @@ "settable_per_extruder": false, "settable_per_meshgroup": false }, + "nozzle_disallowed_areas": + { + "label": "Nozzle Disallowed Areas", + "description": "A list of polygons with areas the nozzle is not allowed to enter.", + "type": "polygons", + "default_value": + [ + ], + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, "machine_head_polygon": { "label": "Machine head polygon", @@ -1148,7 +1160,7 @@ "minimum_value": "-273.15", "minimum_value_warning": "0", "maximum_value_warning": "260", - "enabled": "not (material_flow_dependent_temperature)", + "enabled": "not (material_flow_dependent_temperature) and machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1163,7 +1175,7 @@ "minimum_value": "-273.15", "minimum_value_warning": "0", "maximum_value_warning": "260", - "enabled": "not (material_flow_dependent_temperature)", + "enabled": "machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1204,7 +1216,7 @@ "minimum_value": "-273.15", "minimum_value_warning": "0", "maximum_value_warning": "260", - "enabled": "machine_heated_bed", + "enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": false, "settable_per_meshgroup": false @@ -1220,7 +1232,7 @@ "minimum_value": "-273.15", "minimum_value_warning": "0", "maximum_value_warning": "260", - "enabled": "machine_heated_bed", + "enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": false, "settable_per_meshgroup": false @@ -1235,6 +1247,7 @@ "minimum_value": "0.0001", "minimum_value_warning": "0.4", "maximum_value_warning": "3.5", + "enabled": "machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1248,6 +1261,7 @@ "minimum_value": "5", "minimum_value_warning": "50", "maximum_value_warning": "150", + "enabled": "machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": true }, "retraction_enable": @@ -1259,6 +1273,14 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "retract_at_layer_change":{ + "label": "Retract at Layer Change", + "description": "Retract the filament when the nozzle is moving to the next layer.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": true + }, "retraction_amount": { "label": "Retraction Distance", @@ -1268,7 +1290,7 @@ "default_value": 6.5, "minimum_value_warning": "-0.0001", "maximum_value_warning": "10.0", - "enabled": "retraction_enable", + "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1283,7 +1305,7 @@ "minimum_value_warning": "1", "maximum_value": "machine_max_feedrate_e", "maximum_value_warning": "70", - "enabled": "retraction_enable", + "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -1299,7 +1321,7 @@ "maximum_value": "machine_max_feedrate_e", "minimum_value_warning": "1", "maximum_value_warning": "70", - "enabled": "retraction_enable", + "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"", "value": "retraction_speed", "settable_per_mesh": false, "settable_per_extruder": true @@ -1315,7 +1337,7 @@ "maximum_value": "machine_max_feedrate_e", "minimum_value_warning": "1", "maximum_value_warning": "70", - "enabled": "retraction_enable", + "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"", "value": "retraction_speed", "settable_per_mesh": false, "settable_per_extruder": true @@ -1385,6 +1407,7 @@ "minimum_value": "-273.15", "minimum_value_warning": "0", "maximum_value_warning": "260", + "enabled": "machine_extruder_count > 1 and machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -2223,7 +2246,7 @@ "retraction_combing": { "label": "Combing Mode", - "description": "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only.", + "description": "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only.", "type": "enum", "options": { diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index 48c3ace5d9..40a2849979 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -54,7 +54,7 @@ "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position" + "default_value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\nM190 S{material_bed_temperature}\nM104 T0 S{material_print_temperature}\nM109 T0 S{material_print_temperature}\nM104 T1 S{material_print_temperature}\nM109 T1 S{material_print_temperature}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position" }, "machine_end_gcode": { "default_value": "M104 S0 ; turn off extruders\nM140 S0 ; heated bed heater off\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors" diff --git a/resources/definitions/julia.def.json b/resources/definitions/julia.def.json new file mode 100644 index 0000000000..a0eda65bb7 --- /dev/null +++ b/resources/definitions/julia.def.json @@ -0,0 +1,52 @@ +{ + "id": "julia", + "name": "Julia", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Fracktal", + "category": "Other", + "file_formats": "text/x-gcode", + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "machine_start_gcode": { + "default_value": " ;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n ;metric values\n M107\n G28\n G29\n G90 ;absolute positioning\n G92 E0; reset extruder distance\n G1 Z5 F300 ;move nozzle up 5mm for safe homing\n G1 X0 Y0 Z0 F5000; move nozzle to home\n M300 S600P200\n M300 S800 P200\n M190 S{material_bed_temperature} ;Uncomment to add your own bed temperature line\n M109 S{material_print_temperature} ;Uncomment to add your own temperature line\n M82 ;set extruder to absolute mode\n M107 ;start with the fan off\n G1 Z15.0 F{speed_travel} ;move the platform down 15mm\n G92 E0 ;zero the extruded length\n G1 F200 E3 ;extrude 3mm of feed stock\n G92 E0 ;zero the extruded length again\n G1 F{speed_travel}\n ;Put printing message on LCD screen\n M117 Printing...\n" + }, + "machine_end_gcode": { + "default_value": " M104 S0 ;extruder heater off\n M140 S0 ;heated bed heater off (if you have it)\n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning\n" + }, + "material_bed_temperature": { "default_value": 100 }, + "layer_height": { "default_value": 0.2 }, + "support_angle": { "default_value": 30 }, + "infill_overlap": { "default_value": 30 }, + "layer_height_0": { "default_value": 0.2 }, + "speed_print": { "default_value": 80 }, + "speed_wall_0": { "default_value": 30 }, + "speed_travel": { "default_value": 150 }, + "brim_line_count": { "default_value": 15 }, + "skin_overlap": { "default_value": 30 }, + "prime_tower_size": { "default_value": 8.660254037844387 }, + "material_diameter": { "default_value": 1.75 }, + "bottom_thickness": { "default_value": 0.8 }, + "retraction_amount": { "default_value": 3 }, + "speed_topbottom": { "default_value": 80 }, + "material_print_temperature": { "default_value": 230 }, + "support_pattern": { "default_value": "grid" }, + "speed_infill": { "default_value": 80 }, + "infill_sparse_density": { "default_value": 10 }, + "top_thickness": { "default_value": 0.8 }, + "machine_extruder_count": { "default_value": 1 }, + "retraction_combing": { "default_value": "off" }, + "machine_heated_bed": { "default_value": true }, + "machine_center_is_zero": { "default_value": false }, + "machine_height": { "default_value": 260 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_depth": { "default_value": 250 }, + "machine_width": { "default_value": 210 }, + "machine_name": { "default_value": "Julia V2" } + } +} diff --git a/resources/definitions/kupido.def.json b/resources/definitions/kupido.def.json new file mode 100644 index 0000000000..97be1a0152 --- /dev/null +++ b/resources/definitions/kupido.def.json @@ -0,0 +1,38 @@ +{ + "id": "kupido", + "name": "Kupido", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Kupido", + "category": "Other", + "file_formats": "text/x-gcode", + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "machine_name": { "default_value": "Kupido" }, + "machine_start_gcode": { + "default_value": " ;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n ;M190 S{material_bed_temperature} ;Uncomment to add your own bed temperature line\n ;M109 S{material_print_temperature} ;Uncomment to add your own temperature line\n G21 ;metric values\n G90 ;absolute positioning\n M82 ;set extruder to absolute mode\n M107 ;start with the fan off\n G28 X0 Y0 ;move X Y to endstops\n G28 Z0 ;move Z to endstops\n G1 Z20.0 F40 ;move the platform down 20mm\n G1 Y0 X170 F{speed_travel}\n G92 E0 ;zero the extruded length\n G1 F200 E10 ;extrude 3mm of feed stock\n G92 E0 ;zero the extruded length again\n G4 P7000\n G1 F{speed_travel}\n ;Put printing message on LCD screen\n M117 Printing...\n" + }, + "machine_end_gcode": { + "default_value": " M104 S0 ;extruder heater off\n M140 S0 ;heated bed heater off (if you have it)\n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning\n" + }, + "prime_tower_size": { "default_value": 8.660254037844387 }, + "retraction_speed": { "default_value": 60 }, + "material_bed_temperature": { "default_value": 60 }, + "speed_wall_x": { "default_value": 40 }, + "skirt_line_count": { "default_value": 2 }, + "retraction_min_travel": { "default_value": 2 }, + "speed_wall_0": { "default_value": 30 }, + "material_print_temperature": { "default_value": 220 }, + "brim_line_count": { "default_value": 15 }, + "retraction_amount": { "default_value": 3.6 }, + "speed_topbottom": { "default_value": 20 }, + "layer_height": { "default_value": 0.2 }, + "speed_print": { "default_value": 30 }, + "speed_infill": { "default_value": 30 } + } +} diff --git a/resources/definitions/makerbotreplicator.def.json b/resources/definitions/makerbotreplicator.def.json new file mode 100644 index 0000000000..d762db67fc --- /dev/null +++ b/resources/definitions/makerbotreplicator.def.json @@ -0,0 +1,31 @@ +{ + "id": "makerbotreplicator", + "name": "MakerBotReplicator", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "MakerBot", + "category": "Other", + "file_formats": "application/x3g", + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "prime_tower_size": { "default_value": 10.0 }, + "infill_sparse_density": { "default_value": 10 }, + "speed_travel": { "default_value": 150 }, + "material_diameter": { "default_value": 1.75 }, + "layer_height": { "default_value": 0.15 }, + "material_print_temperature": { "default_value": 220 }, + "machine_extruder_count": { "default_value": 1 }, + "machine_heated_bed": { "default_value": true }, + "machine_center_is_zero": { "default_value": false }, + "machine_height": { "default_value": 150 }, + "machine_gcode_flavor": { "default_value": "MakerBot" }, + "machine_depth": { "default_value": 145 }, + "machine_width": { "default_value": 225 }, + "machine_name": { "default_value": "MakerBot Replicator" } + } +} diff --git a/resources/definitions/ord.def.json b/resources/definitions/ord.def.json new file mode 100644 index 0000000000..bedd8c3121 --- /dev/null +++ b/resources/definitions/ord.def.json @@ -0,0 +1,41 @@ +{ + "id": "ord", + "name": "RoVa3D", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "ORD Solutions", + "category": "Other", + "file_formats": "text/x-gcode", + "machine_extruder_trains": + { + "0": "ord_extruder_0", + "1": "ord_extruder_1", + "2": "ord_extruder_2", + "3": "ord_extruder_3", + "4": "ord_extruder_4" + }, + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "material_bed_temperature": { "default_value": 60 }, + "prime_tower_size": { "default_value": 7.0710678118654755 }, + "infill_sparse_density": { "default_value": 15 }, + "speed_travel": { "default_value": 150 }, + "material_diameter": { "default_value": 1.75 }, + "layer_height": { "default_value": 0.3 }, + "machine_nozzle_size": { "default_value": 0.35 }, + "material_print_temperature": { "default_value": 240 }, + "machine_extruder_count": { "default_value": 5 }, + "machine_heated_bed": { "default_value": true }, + "machine_center_is_zero": { "default_value": false }, + "machine_height": { "default_value": 200 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_depth": { "default_value": 250 }, + "machine_width": { "default_value": 215 }, + "machine_name": { "default_value": "RoVa3D" } + } +} diff --git a/resources/definitions/punchtec_connect_xl.def.json b/resources/definitions/punchtec_connect_xl.def.json new file mode 100644 index 0000000000..ce4245a04f --- /dev/null +++ b/resources/definitions/punchtec_connect_xl.def.json @@ -0,0 +1,41 @@ +{ + "id": "punchtec_connect_xl", + "name": "Punchtec Connect XL", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Punchtec", + "category": "Other", + "file_formats": "text/x-gcode", + "machine_extruder_trains": + { + "0": "punchtec_connect_xl_extruder_0", + "1": "punchtec_connect_xl_extruder_1" + }, + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "machine_head_polygon": { "default_value": [[ 0, 0], [ 0, 0], [ 0, 0], [ 0, 0]] }, + "speed_travel": { "default_value": 150 }, + "prime_tower_size": { "default_value": 8.660254037844387 }, + "speed_wall_x": { "default_value": 40 }, + "speed_wall_0": { "default_value": 40 }, + "material_diameter": { "default_value": 1.75 }, + "speed_topbottom": { "default_value": 40 }, + "layer_height": { "default_value": 0.2 }, + "material_print_temperature": { "default_value": 195 }, + "speed_print": { "default_value": 40 }, + "speed_infill": { "default_value": 40 }, + "machine_extruder_count": { "default_value": 2 }, + "machine_heated_bed": { "default_value": true }, + "machine_center_is_zero": { "default_value": false }, + "machine_height": { "default_value": 200 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_depth": { "default_value": 304 }, + "machine_width": { "default_value": 304 }, + "machine_name": { "default_value": "Punchtec Connect XL" } + } +} diff --git a/resources/definitions/rigid3d.def.json b/resources/definitions/rigid3d.def.json new file mode 100644 index 0000000000..b167646f6e --- /dev/null +++ b/resources/definitions/rigid3d.def.json @@ -0,0 +1,53 @@ +{ + "id": "rigid3d", + "name": "Rigid3D", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Rigid3D", + "category": "Other", + "file_formats": "text/x-gcode", + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "machine_start_gcode": { + "default_value": " ; -- START GCODE --\n G21\n G28 ; Home extruder\n G29 ; Autolevel bed\n M107 ; Turn off fan\n G90 ; Absolute positioning\n M82 ; Extruder in absolute mode\n G92 E0 ; Reset extruder position\n ; -- end of START GCODE --\n\n" + }, + "machine_end_gcode": { + "default_value": " ; -- END GCODE --\n G1 X0 Y230 ; Get extruder out of way.\n M107 ; Turn off fan\n G91 ; Relative positioning\n G0 Z20 ; Lift extruder up\n T0\n G1 E-1 ; Reduce filament pressure\n M104 T0 S0 ; Turn ectruder heater off\n G90 ; Absolute positioning\n G92 E0 ; Reset extruder position\n M140 S0 ; Disable heated bed\n M84 ; Turn steppers off\n ; -- end of END GCODE --\n" + }, + "machine_head_polygon": { "default_value": [[ 22, 67], [ 22, 51], [ 36, 51], [ 36, 67]] }, + "skirt_gap": { "default_value": 5.0 }, + "cool_min_layer_time": { "default_value": 10 }, + "prime_tower_size": { "default_value": 7.745966692414834 }, + "speed_wall_x": { "default_value": 40 }, + "speed_travel": { "default_value": 100 }, + "bottom_thickness": { "default_value": 0.75 }, + "material_diameter": { "default_value": 1.75 }, + "layer_height_0": { "default_value": 0.25 }, + "support_angle": { "default_value": 45 }, + "material_bed_temperature": { "default_value": 100 }, + "top_thickness": { "default_value": 0.75 }, + "material_print_temperature": { "default_value": 235 }, + "retraction_speed": { "default_value": 60.0 }, + "wall_thickness": { "default_value": 0.8 }, + "retraction_min_travel": { "default_value": 2 }, + "speed_wall_0": { "default_value": 30 }, + "retraction_amount": { "default_value": 1 }, + "speed_topbottom": { "default_value": 30 }, + "layer_height": { "default_value": 0.25 }, + "speed_print": { "default_value": 40 }, + "speed_infill": { "default_value": 40 }, + "machine_extruder_count": { "default_value": 1 }, + "machine_heated_bed": { "default_value": true }, + "machine_center_is_zero": { "default_value": false }, + "machine_height": { "default_value": 210 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_depth": { "default_value": 250 }, + "machine_width": { "default_value": 250 }, + "machine_name": { "default_value": "Rigid3D" } + } +} diff --git a/resources/definitions/rigid3d_3rdgen.def.json b/resources/definitions/rigid3d_3rdgen.def.json new file mode 100644 index 0000000000..e7c73ed54d --- /dev/null +++ b/resources/definitions/rigid3d_3rdgen.def.json @@ -0,0 +1,50 @@ +{ + "id": "rigid3d_3rdgen", + "name": "Rigid3D 3rdGen", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Rigid3D", + "category": "Other", + "file_formats": "text/x-gcode", + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "machine_start_gcode": { + "default_value": " ; -- START GCODE --\n G21\n G28 ; Home extruder\n G29 ; Autolevel bed\n M107 ; Turn off fan\n G90 ; Absolute positioning\n M82 ; Extruder in absolute mode\n G92 E0 ; Reset extruder position\n ; -- end of START GCODE --\n\n" + }, + "machine_end_gcode": { + "default_value": " ; -- END GCODE --\n G1 X0 Y230 ; Get extruder out of way.\n M107 ; Turn off fan\n G91 ; Relative positioning\n G0 Z20 ; Lift extruder up\n T0\n G1 E-1 ; Reduce filament pressure\n M104 T0 S0 ; Turn extruder heater off\n G90 ; Absolute positioning\n G92 E0 ; Reset extruder position\n M140 S0 ; Disable heated bed\n M84 ; Turn steppers off\n ; -- end of END GCODE --\n" + }, + "machine_head_polygon": { "default_value": [[ 18, 0], [ 18, 65], [ 32, 65], [ 32, 0]] }, + "cool_min_layer_time": { "default_value": 10 }, + "prime_tower_size": { "default_value": 7.745966692414834 }, + "skirt_gap": { "default_value": 5.0 }, + "speed_travel": { "default_value": 120 }, + "bottom_thickness": { "default_value": 0.75 }, + "material_diameter": { "default_value": 1.75 }, + "layer_height_0": { "default_value": 0.25 }, + "support_angle": { "default_value": 45 }, + "material_bed_temperature": { "default_value": 100 }, + "retraction_min_travel": { "default_value": 2 }, + "speed_wall_0": { "default_value": 30 }, + "retraction_speed": { "default_value": 60.0 }, + "wall_thickness": { "default_value": 0.8 }, + "material_print_temperature": { "default_value": 235 }, + "retraction_amount": { "default_value": 1 }, + "speed_topbottom": { "default_value": 25 }, + "layer_height": { "default_value": 0.25 }, + "top_thickness": { "default_value": 0.75 }, + "machine_extruder_count": { "default_value": 1 }, + "machine_heated_bed": { "default_value": true }, + "machine_center_is_zero": { "default_value": false }, + "machine_height": { "default_value": 240 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_depth": { "default_value": 290 }, + "machine_width": { "default_value": 275 }, + "machine_name": { "default_value": "Rigid3D 3rd Geneartion" } + } +} diff --git a/resources/definitions/rigid3d_hobby.def.json b/resources/definitions/rigid3d_hobby.def.json new file mode 100644 index 0000000000..09ba77f63c --- /dev/null +++ b/resources/definitions/rigid3d_hobby.def.json @@ -0,0 +1,47 @@ +{ + "id": "rigid3d_hobby", + "name": "Rigid3D Hobby", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Rigid3D", + "category": "Other", + "file_formats": "text/x-gcode", + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "machine_head_polygon": { "default_value": [[ 16, 30], [ 16, 45], [ 16, 45], [ 16, 30]] }, + "prime_tower_size": { "default_value": 8.660254037844387 }, + "speed_travel": { "default_value": 40 }, + "skirt_gap": { "default_value": 5.0 }, + "cool_min_layer_time": { "default_value": 15 }, + "support_pattern": { "default_value": "grid" }, + "material_diameter": { "default_value": 1.75 }, + "layer_height_0": { "default_value": 0.25 }, + "speed_wall_x": { "default_value": 30 }, + "skirt_line_count": { "default_value": 2 }, + "support_angle": { "default_value": 45 }, + "speed_topbottom": { "default_value": 20 }, + "material_print_temperature": { "default_value": 205 }, + "retraction_speed": { "default_value": 80 }, + "wall_thickness": { "default_value": 0.8 }, + "retraction_min_travel": { "default_value": 2 }, + "speed_wall_0": { "default_value": 20 }, + "retraction_amount": { "default_value": 2 }, + "speed_layer_0": { "default_value": 15 }, + "layer_height": { "default_value": 0.2 }, + "speed_print": { "default_value": 30 }, + "speed_infill": { "default_value": 30 }, + "machine_extruder_count": { "default_value": 1 }, + "machine_heated_bed": { "default_value": false }, + "machine_center_is_zero": { "default_value": false }, + "machine_height": { "default_value": 150 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_depth": { "default_value": 150 }, + "machine_width": { "default_value": 150 }, + "machine_name": { "default_value": "Rigid3D Hobby" } + } +} diff --git a/resources/definitions/rigid3d_zero.def.json b/resources/definitions/rigid3d_zero.def.json new file mode 100644 index 0000000000..d5f8c1ef6a --- /dev/null +++ b/resources/definitions/rigid3d_zero.def.json @@ -0,0 +1,53 @@ +{ + "id": "rigid3d_zero", + "name": "Rigid3D Zero", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Rigid3D", + "category": "Other", + "file_formats": "text/x-gcode", + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "machine_start_gcode": { + "default_value": " ; -- START GCODE --\n G21\n G28 ; Home extruder\n G29 ; Autolevel bed\n M107 ; Turn off fan\n G90 ; Absolute positioning\n M82 ; Extruder in absolute mode\n G92 E0 ; Reset extruder position\n ; -- end of START GCODE --\n\n" + }, + "machine_end_gcode": { + "default_value": " ; -- END GCODE --\n G1 X0 Y230 ; Get extruder out of way.\n M107 ; Turn off fan\n G91 ; Relative positioning\n G0 Z20 ; Lift extruder up\n T0\n G1 E-1 ; Reduce filament pressure\n M104 T0 S0 ; Turn ectruder heater off\n G90 ; Absolute positioning\n G92 E0 ; Reset extruder position\n M140 S0 ; Disable heated bed\n M84 ; Turn steppers off\n ; -- end of END GCODE --\n" + }, + "machine_head_polygon": { "default_value": [[ 40, 15], [ 40, 60], [ 30, 60], [ 30, 15]] }, + "support_pattern": { "default_value": "grid" }, + "cool_min_layer_time": { "default_value": 10 }, + "speed_travel": { "default_value": 80 }, + "support_angle": { "default_value": 45 }, + "retraction_min_travel": { "default_value": 2 }, + "speed_wall_0": { "default_value": 20 }, + "speed_layer_0": { "default_value": 15 }, + "speed_infill": { "default_value": 30 }, + "speed_topbottom": { "default_value": 30 }, + "prime_tower_size": { "default_value": 7.745966692414834 }, + "skirt_line_count": { "default_value": 2 }, + "speed_wall_x": { "default_value": 30 }, + "material_diameter": { "default_value": 1.75 }, + "bottom_thickness": { "default_value": 0.75 }, + "layer_height_0": { "default_value": 0.25 }, + "top_thickness": { "default_value": 0.75 }, + "wall_thickness": { "default_value": 0.8 }, + "material_print_temperature": { "default_value": 195 }, + "retraction_amount": { "default_value": 1.5 }, + "skirt_gap": { "default_value": 5.0 }, + "layer_height": { "default_value": 0.25 }, + "speed_print": { "default_value": 30 }, + "machine_extruder_count": { "default_value": 1 }, + "machine_center_is_zero": { "default_value": false }, + "machine_height": { "default_value": 190 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_depth": { "default_value": 250 }, + "machine_width": { "default_value": 250 }, + "machine_name": { "default_value": "Rigid3D Zero" } + } +} diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json index 8b268410f9..9dbde35921 100644 --- a/resources/definitions/rigidbot.def.json +++ b/resources/definitions/rigidbot.def.json @@ -39,10 +39,10 @@ "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." + "default_value": ";Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;M190 S{material_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{material_print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." }, "machine_end_gcode": { - "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" + "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning" }, "layer_height": { "default_value": 0.2 diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json index f8cf1e1da0..6ac84cbde1 100644 --- a/resources/definitions/rigidbot_big.def.json +++ b/resources/definitions/rigidbot_big.def.json @@ -42,10 +42,10 @@ "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." + "default_value": ";Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;M190 S{material_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{material_print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." }, "machine_end_gcode": { - "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" + "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning" }, "layer_height": { "default_value": 0.2 diff --git a/resources/definitions/robo_3d_r1.def.json b/resources/definitions/robo_3d_r1.def.json new file mode 100644 index 0000000000..b137b2054b --- /dev/null +++ b/resources/definitions/robo_3d_r1.def.json @@ -0,0 +1,61 @@ +{ + "id": "robo_3d_r1", + "name": "Robo 3D R1", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Robo 3D", + "category": "Other", + "file_formats": "text/x-gcode", + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "machine_start_gcode": { + "default_value": " G92 E0 ;\n M565 Z-1 ;\n G1 Z5 F5000 ;\n G29 ;\n" + }, + "machine_end_gcode": { + "default_value": " M104 S0 ;extruder heater off\n M140 S0 ;heated bed heater off (if you have it)\n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning\n" + }, + "cool_min_layer_time": { "default_value": 7 }, + "speed_topbottom": { "default_value": 40 }, + "retraction_speed": { "default_value": 50 }, + "layer_0_z_overlap": { "default_value": 0.2 }, + "cool_min_speed": { "default_value": 19 }, + "material_bed_temperature": { "default_value": 60 }, + "support_angle": { "default_value": 50 }, + "speed_layer_0": { "default_value": 30 }, + "line_width": { "default_value": 0.4 }, + "speed_infill": { "default_value": 60 }, + "prime_tower_size": { "default_value": 8.660254037844387 }, + "support_enable": { "default_value": true }, + "cool_fan_full_at_height": { "default_value": 0.1 }, + "material_diameter": { "default_value": 1.75 }, + "bottom_thickness": { "default_value": 1.2 }, + "raft_airgap": { "default_value": 0.2 }, + "layer_height_0": { "default_value": 0.15 }, + "top_thickness": { "default_value": 1.2 }, + "speed_wall_0": { "default_value": 40 }, + "retraction_min_travel": { "default_value": 5 }, + "material_flow": { "default_value": 100 }, + "infill_sparse_density": { "default_value": 10 }, + "wall_thickness": { "default_value": 1.2 }, + "material_print_temperature": { "default_value": 190 }, + "retraction_amount": { "default_value": 3 }, + "layer_height": { "default_value": 0.2 }, + "speed_print": { "default_value": 40 }, + "machine_extruder_count": { "default_value": 1 }, + "retraction_combing": { "default_value": "off" }, + "machine_heated_bed": { "default_value": true }, + "machine_center_is_zero": { "default_value": false }, + "machine_height": { "default_value": 210 }, + "adhesion_type": { "default_value": "raft" }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_depth": { "default_value": 245 }, + "machine_width": { "default_value": 225 }, + "support_z_distance": { "default_value": 0.22 }, + "machine_name": { "default_value": "ROBO 3D R1" } + } +} diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index c26a3a8856..84e09113f3 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -86,12 +86,6 @@ "machine_nozzle_expansion_angle": { "default_value": 45 }, - "material_print_temperature": { - "enabled": "not (material_flow_dependent_temperature) and machine_gcode_flavor != \"UltiGCode\"" - }, - "material_bed_temperature": { - "enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"" - }, "machine_max_feedrate_x": { "default_value": 300 }, @@ -106,24 +100,6 @@ }, "machine_acceleration": { "default_value": 3000 - }, - "material_diameter": { - "enabled": "machine_gcode_flavor != \"UltiGCode\"" - }, - "material_flow": { - "enabled": "machine_gcode_flavor != \"UltiGCode\"" - }, - "retraction_amount": { - "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"" - }, - "retraction_speed": { - "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"" - }, - "retraction_retract_speed": { - "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"" - }, - "retraction_prime_speed": { - "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"" } } } diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 653185b9ca..16feda7d64 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -34,7 +34,7 @@ "overrides": { "machine_name": { "default_value": "Ultimaker 3" }, - "machine_width": { "default_value": 215 }, + "machine_width": { "default_value": 233 }, "machine_depth": { "default_value": 215 }, "machine_height": { "default_value": 200 }, "machine_heated_bed": { "default_value": true }, @@ -44,10 +44,10 @@ { "default_value": [ - [ -40, 10 ], - [ -40, -30 ], - [ 60, 10 ], - [ 60, -30 ] + [ -29, 6.1 ], + [ -29, -33.9 ], + [ 71, 6.1 ], + [ 71, -33.9 ] ] }, "machine_gcode_flavor": { "default_value": "Griffin" }, @@ -57,15 +57,12 @@ "machine_acceleration": { "default_value": 3000 }, "gantry_height": { "default_value": 60 }, "machine_disallowed_areas": { "default_value": [ - [[-91.5, -115], [-115, -115], [-115, -104.6], [-91.5, -104.6]], - [[-99.5, -104.6], [-115, -104.6], [-115, 104.6], [-99.5, 104.6]], - [[-94.5, 104.6], [-115, 104.6], [-115, 105.5], [-94.5, 105.5]], - [[-91.4, 105.5], [-115, 105.5], [-115, 115], [-91.4, 115]], - - [[77.3, -115], [77.3, -98.6], [115, -98.6], [115, -115]], - [[97.2, -98.6], [97.2, -54.5], [113, -54.5], [113, -98.6]], - [[100.5, -54.5], [100.5, 99.3], [115, 99.3], [115, -54.5]], - [[77, 99.3], [77, 115], [115, 115], [115, 99.3]] + [[92.8, -53.4], [92.8, -97.5], [116.5, -97.5], [116.5, -53.4]], + [[73.8, 107.5], [73.8, 100.5], [116.5, 100.5], [116.5, 107.5]], + [[74.6, 107.5], [74.6, 100.5], [116.5, 100.5], [116.5, 107.5]], + [[74.9, -97.5], [74.9, -107.5], [116.5, -107.5], [116.5, -97.5]], + [[-116.5, -103.5], [-116.5, -107.5], [-100.9, -107.5], [-100.9, -103.5]], + [[-116.5, 105.8], [-96.9, 105.8], [-96.9, 107.5], [-116.5, 107.5]] ]}, "machine_extruder_count": { "default_value": 2 }, "extruder_prime_pos_abs": { "default_value": true }, @@ -74,8 +71,6 @@ "prime_tower_position_x": { "default_value": 175 }, "prime_tower_position_y": { "default_value": 179 }, - "extruder_prime_pos_x": { "enabled": false }, - "extruder_prime_pos_y": { "enabled": false }, "print_sequence": {"enabled": false}, "acceleration_enabled": { "value": "True" }, diff --git a/resources/definitions/zone3d_printer.def.json b/resources/definitions/zone3d_printer.def.json new file mode 100644 index 0000000000..1663ffdf2b --- /dev/null +++ b/resources/definitions/zone3d_printer.def.json @@ -0,0 +1,30 @@ +{ + "id": "zone3d_printer", + "name": "Zone3d Printer", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Unknown", + "category": "Other", + "file_formats": "text/x-gcode", + "platform_offset": [ 0, 0, 0] + }, + + "overrides": { + "material_diameter": { "default_value": 1.75 }, + "prime_tower_size": { "default_value": 10.350983390135314 }, + "material_print_temperature": { "default_value": 260 }, + "layer_height": { "default_value": 0.14 }, + "speed_travel": { "default_value": 150 }, + "machine_extruder_count": { "default_value": 1 }, + "machine_heated_bed": { "default_value": true }, + "machine_center_is_zero": { "default_value": false }, + "machine_height": { "default_value": 210 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_depth": { "default_value": 220 }, + "machine_width": { "default_value": 240 }, + "machine_name": { "default_value": "Zone3D Printer" } + } +} diff --git a/resources/extruders/ord_extruder_0.def.json b/resources/extruders/ord_extruder_0.def.json new file mode 100644 index 0000000000..c3f8d75cc0 --- /dev/null +++ b/resources/extruders/ord_extruder_0.def.json @@ -0,0 +1,19 @@ +{ + "id": "ord_extruder_0", + "version": 2, + "name": "0", + "inherits": "fdmextruder", + "metadata": { + "machine": "ord", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "4" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 } + } +} diff --git a/resources/extruders/ord_extruder_1.def.json b/resources/extruders/ord_extruder_1.def.json new file mode 100644 index 0000000000..9b7990605d --- /dev/null +++ b/resources/extruders/ord_extruder_1.def.json @@ -0,0 +1,19 @@ +{ + "id": "ord_extruder_1", + "version": 2, + "name": "1", + "inherits": "fdmextruder", + "metadata": { + "machine": "ord", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "4" + }, + "machine_nozzle_offset_x": { "default_value": 62.95 }, + "machine_nozzle_offset_y": { "default_value": 2.05 } + } +} diff --git a/resources/extruders/ord_extruder_2.def.json b/resources/extruders/ord_extruder_2.def.json new file mode 100644 index 0000000000..4e8a9f6c15 --- /dev/null +++ b/resources/extruders/ord_extruder_2.def.json @@ -0,0 +1,19 @@ +{ + "id": "ord_extruder_2", + "version": 2, + "name": "2", + "inherits": "fdmextruder", + "metadata": { + "machine": "ord", + "position": "2" + }, + + "overrides": { + "extruder_nr": { + "default_value": 2, + "maximum_value": "4" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 27.7 } + } +} diff --git a/resources/extruders/ord_extruder_3.def.json b/resources/extruders/ord_extruder_3.def.json new file mode 100644 index 0000000000..e8da77a6ec --- /dev/null +++ b/resources/extruders/ord_extruder_3.def.json @@ -0,0 +1,19 @@ +{ + "id": "ord_extruder_3", + "version": 2, + "name": "3", + "inherits": "fdmextruder", + "metadata": { + "machine": "ord", + "position": "3" + }, + + "overrides": { + "extruder_nr": { + "default_value": 3, + "maximum_value": "4" + }, + "machine_nozzle_offset_x": { "default_value": 63.18 }, + "machine_nozzle_offset_y": { "default_value": 28.65 } + } +} diff --git a/resources/extruders/ord_extruder_4.def.json b/resources/extruders/ord_extruder_4.def.json new file mode 100644 index 0000000000..aa6c8052bf --- /dev/null +++ b/resources/extruders/ord_extruder_4.def.json @@ -0,0 +1,19 @@ +{ + "id": "ord_extruder_4", + "version": 2, + "name": "4", + "inherits": "fdmextruder", + "metadata": { + "machine": "ord", + "position": "4" + }, + + "overrides": { + "extruder_nr": { + "default_value": 4, + "maximum_value": "4" + }, + "machine_nozzle_offset_x": { "default_value": 31.6 }, + "machine_nozzle_offset_y": { "default_value": 28.2 } + } +} diff --git a/resources/extruders/punchtec_connect_xl_extruder_left.def.json b/resources/extruders/punchtec_connect_xl_extruder_left.def.json new file mode 100644 index 0000000000..b618999fc2 --- /dev/null +++ b/resources/extruders/punchtec_connect_xl_extruder_left.def.json @@ -0,0 +1,19 @@ +{ + "id": "punchtec_connect_xl_extruder_0", + "version": 2, + "name": "0", + "inherits": "fdmextruder", + "metadata": { + "machine": "punchtec_connect_xl", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 } + } +} diff --git a/resources/extruders/punchtec_connect_xl_extruder_right.def.json b/resources/extruders/punchtec_connect_xl_extruder_right.def.json new file mode 100644 index 0000000000..1173bb5584 --- /dev/null +++ b/resources/extruders/punchtec_connect_xl_extruder_right.def.json @@ -0,0 +1,19 @@ +{ + "id": "punchtec_connect_xl_extruder_1", + "version": 2, + "name": "1", + "inherits": "fdmextruder", + "metadata": { + "machine": "punchtec_connect_xl", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 } + } +} diff --git a/resources/extruders/ultimaker3_extended_extruder_left.def.json b/resources/extruders/ultimaker3_extended_extruder_left.def.json index 918d544fd9..202272b096 100644 --- a/resources/extruders/ultimaker3_extended_extruder_left.def.json +++ b/resources/extruders/ultimaker3_extended_extruder_left.def.json @@ -13,8 +13,8 @@ "default_value": 0, "maximum_value": "1" }, - "machine_nozzle_offset_x": { "default_value": -11.0 }, - "machine_nozzle_offset_y": { "default_value": 3.9 }, + "machine_nozzle_offset_x": { "default_value": 0 }, + "machine_nozzle_offset_y": { "default_value": 0 }, "machine_extruder_start_pos_abs": { "default_value": true }, "machine_extruder_start_pos_x": { "default_value": 213 }, @@ -23,8 +23,8 @@ "machine_extruder_end_pos_x": { "default_value": 213 }, "machine_extruder_end_pos_y": { "default_value": 207 }, "machine_nozzle_head_distance": { "default_value": 2.7 }, - "extruder_prime_pos_x": { "default_value": 170, "enabled": false }, - "extruder_prime_pos_y": { "default_value": 6, "enabled": false }, - "extruder_prime_pos_z": { "default_value": 2, "enabled": false } + "extruder_prime_pos_x": { "default_value": 170 }, + "extruder_prime_pos_y": { "default_value": 6 }, + "extruder_prime_pos_z": { "default_value": 2 } } } diff --git a/resources/extruders/ultimaker3_extended_extruder_right.def.json b/resources/extruders/ultimaker3_extended_extruder_right.def.json index 130f31deaa..0f85b2dd09 100644 --- a/resources/extruders/ultimaker3_extended_extruder_right.def.json +++ b/resources/extruders/ultimaker3_extended_extruder_right.def.json @@ -13,8 +13,8 @@ "default_value": 1, "maximum_value": "1" }, - "machine_nozzle_offset_x": { "default_value": 7.0 }, - "machine_nozzle_offset_y": { "default_value": 3.9 }, + "machine_nozzle_offset_x": { "default_value": 18 }, + "machine_nozzle_offset_y": { "default_value": 0 }, "machine_extruder_start_pos_abs": { "default_value": true }, "machine_extruder_start_pos_x": { "default_value": 213 }, @@ -23,8 +23,8 @@ "machine_extruder_end_pos_x": { "default_value": 213 }, "machine_extruder_end_pos_y": { "default_value": 189 }, "machine_nozzle_head_distance": { "default_value": 4.2 }, - "extruder_prime_pos_x": { "default_value": 182, "enabled": false }, - "extruder_prime_pos_y": { "default_value": 6, "enabled": false }, - "extruder_prime_pos_z": { "default_value": 2, "enabled": false } + "extruder_prime_pos_x": { "default_value": 182 }, + "extruder_prime_pos_y": { "default_value": 6 }, + "extruder_prime_pos_z": { "default_value": 2 } } } diff --git a/resources/extruders/ultimaker3_extruder_left.def.json b/resources/extruders/ultimaker3_extruder_left.def.json index 7e7b77fcb6..83efa25dbb 100644 --- a/resources/extruders/ultimaker3_extruder_left.def.json +++ b/resources/extruders/ultimaker3_extruder_left.def.json @@ -13,8 +13,8 @@ "default_value": 0, "maximum_value": "1" }, - "machine_nozzle_offset_x": { "default_value": -11.0 }, - "machine_nozzle_offset_y": { "default_value": 3.9 }, + "machine_nozzle_offset_x": { "default_value": 0 }, + "machine_nozzle_offset_y": { "default_value": 0 }, "machine_extruder_start_pos_abs": { "default_value": true }, "machine_extruder_start_pos_x": { "default_value": 213 }, @@ -23,8 +23,8 @@ "machine_extruder_end_pos_x": { "default_value": 213 }, "machine_extruder_end_pos_y": { "default_value": 207 }, "machine_nozzle_head_distance": { "default_value": 2.7 }, - "extruder_prime_pos_x": { "default_value": 170, "enabled": false }, - "extruder_prime_pos_y": { "default_value": 6, "enabled": false }, - "extruder_prime_pos_z": { "default_value": 2, "enabled": false } + "extruder_prime_pos_x": { "default_value": 170 }, + "extruder_prime_pos_y": { "default_value": 6 }, + "extruder_prime_pos_z": { "default_value": 2 } } } diff --git a/resources/extruders/ultimaker3_extruder_right.def.json b/resources/extruders/ultimaker3_extruder_right.def.json index ff616572ee..4a75059c40 100644 --- a/resources/extruders/ultimaker3_extruder_right.def.json +++ b/resources/extruders/ultimaker3_extruder_right.def.json @@ -13,8 +13,8 @@ "default_value": 1, "maximum_value": "1" }, - "machine_nozzle_offset_x": { "default_value": 7.0 }, - "machine_nozzle_offset_y": { "default_value": 3.9 }, + "machine_nozzle_offset_x": { "default_value": 18 }, + "machine_nozzle_offset_y": { "default_value": 0 }, "machine_extruder_start_pos_abs": { "default_value": true }, "machine_extruder_start_pos_x": { "default_value": 213 }, @@ -23,8 +23,8 @@ "machine_extruder_end_pos_x": { "default_value": 213 }, "machine_extruder_end_pos_y": { "default_value": 189 }, "machine_nozzle_head_distance": { "default_value": 4.2 }, - "extruder_prime_pos_x": { "default_value": 182, "enabled": false }, - "extruder_prime_pos_y": { "default_value": 6, "enabled": false }, - "extruder_prime_pos_z": { "default_value": 2, "enabled": false } + "extruder_prime_pos_x": { "default_value": 182 }, + "extruder_prime_pos_y": { "default_value": 6 }, + "extruder_prime_pos_z": { "default_value": 2 } } } diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 9d910dc660..9821a6a0df 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -233,7 +233,7 @@ Item Action { id: multiplyObjectAction; - text: catalog.i18nc("@action:inmenu","&Duplicate Model"); + text: catalog.i18nc("@action:inmenu","&Multiply Model..."); iconName: "edit-duplicate" } diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 0c0eff2f66..558a71c6d0 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -435,6 +435,10 @@ UM.MainWindow visible: base.monitoringPrint onVisibleChanged: { + if(Cura.MachineManager.printerOutputDevices.length == 0 ) + { + return; + } if(visible) { Cura.MachineManager.printerOutputDevices[0].startCamera() @@ -580,7 +584,7 @@ UM.MainWindow target: Cura.MachineManager onBlurSettings: { - forceActiveFocus() + contentItem.forceActiveFocus() } } @@ -616,6 +620,11 @@ UM.MainWindow } } + MultiplyObjectOptions + { + id: multiplyObjectOptions + } + Connections { target: Cura.Actions.multiplyObject @@ -623,7 +632,9 @@ UM.MainWindow { if(objectContextMenu.objectId != 0) { - Printer.multiplyObject(objectContextMenu.objectId, 1); + multiplyObjectOptions.objectId = objectContextMenu.objectId; + multiplyObjectOptions.visible = true; + multiplyObjectOptions.reset(); objectContextMenu.objectId = 0; } } diff --git a/resources/qml/MultiplyObjectOptions.qml b/resources/qml/MultiplyObjectOptions.qml new file mode 100644 index 0000000000..7756ab074b --- /dev/null +++ b/resources/qml/MultiplyObjectOptions.qml @@ -0,0 +1,66 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Window 2.1 + +import UM 1.1 as UM + +UM.Dialog +{ + id: base + + //: Dialog title + title: catalog.i18nc("@title:window", "Multiply Model") + + minimumWidth: 400 * Screen.devicePixelRatio + minimumHeight: 80 * Screen.devicePixelRatio + width: minimumWidth + height: minimumHeight + + property int objectId: 0; + onAccepted: Printer.multiplyObject(base.objectId, parseInt(copiesField.text)) + + property variant catalog: UM.I18nCatalog { name: "cura" } + + signal reset() + onReset: { + copiesField.text = "1"; + copiesField.selectAll(); + copiesField.focus = true; + } + + Row + { + spacing: UM.Theme.getSize("default_margin").width + + Label { + text: "Number of copies:" + anchors.verticalCenter: copiesField.verticalCenter + } + + TextField { + id: copiesField + validator: RegExpValidator { regExp: /^\d{0,2}/ } + maximumLength: 2 + } + } + + + rightButtons: + [ + Button + { + text: catalog.i18nc("@action:button","OK") + onClicked: base.accept() + enabled: base.objectId != 0 && parseInt(copiesField.text) > 0 + }, + Button + { + text: catalog.i18nc("@action:button","Cancel") + onClicked: base.reject() + } + ] +} + diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml index ff30a7146e..82d7def5ce 100644 --- a/resources/qml/Settings/SettingExtruder.qml +++ b/resources/qml/Settings/SettingExtruder.qml @@ -21,7 +21,11 @@ SettingItem id: extruders_model onModelChanged: control.color = extruders_model.getItem(control.currentIndex).color } - property string color: extruders_model.getItem(control.currentIndex).color + property string color: + { + var model_color = extruders_model.getItem(control.currentIndex).color; + return (model_color) ? model_color : ""; + } textRole: "name"