Browse Source

CURA-4525 solved merge conflict

Jack Ha 7 years ago
parent
commit
8854a28d56

+ 6 - 1
cura/CuraActions.py

@@ -13,6 +13,7 @@ from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
 from UM.Operations.GroupedOperation import GroupedOperation
 from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
 from UM.Operations.SetTransformOperation import SetTransformOperation
+from UM.Operations.TranslateOperation import TranslateOperation
 
 from cura.Operations.SetParentOperation import SetParentOperation
 from cura.MultiplyObjectsJob import MultiplyObjectsJob
@@ -59,7 +60,11 @@ class CuraActions(QObject):
             while current_node.getParent() and current_node.getParent().callDecoration("isGroup"):
                 current_node = current_node.getParent()
 
-            center_operation = SetTransformOperation(current_node, Vector())
+            #   This was formerly done with SetTransformOperation but because of
+            #   unpredictable matrix deconstruction it was possible that mirrors
+            #   could manifest as rotations. Centering is therefore done by
+            #   moving the node to negative whatever its position is:
+            center_operation = TranslateOperation(current_node, -current_node._position)
             operation.addOperation(center_operation)
         operation.push()
 

+ 55 - 12
plugins/CuraEngineBackend/StartSliceJob.py

@@ -36,9 +36,32 @@ class StartJobResult(IntEnum):
 ##  Formatter class that handles token expansion in start/end gcod
 class GcodeStartEndFormatter(Formatter):
     def get_value(self, key, args, kwargs):  # [CodeStyle: get_value is an overridden function from the Formatter class]
+        # The kwargs dictionary contains a dictionary for each stack (with a string of the extruder_nr as their key),
+        # and a default_extruder_nr to use when no extruder_nr is specified
+
         if isinstance(key, str):
             try:
-                return kwargs[key]
+                extruder_nr = kwargs["default_extruder_nr"]
+            except ValueError:
+                extruder_nr = -1
+
+            key_fragments = [fragment.strip() for fragment in key.split(',')]
+            if len(key_fragments) == 2:
+                try:
+                    extruder_nr = int(key_fragments[1])
+                except ValueError:
+                    try:
+                        extruder_nr = int(kwargs["-1"][key_fragments[1]]) # get extruder_nr values from the global stack
+                    except (KeyError, ValueError):
+                        # either the key does not exist, or the value is not an int
+                        Logger.log("w", "Unable to determine stack nr '%s' for key '%s' in start/end gcode, using global stack", key_fragments[1], key_fragments[0])
+            elif len(key_fragments) != 1:
+                Logger.log("w", "Incorrectly formatted placeholder '%s' in start/end gcode", key)
+                return "{" + str(key) + "}"
+
+            key = key_fragments[0]
+            try:
+                return kwargs[str(extruder_nr)][key]
             except KeyError:
                 Logger.log("w", "Unable to replace '%s' placeholder in start/end gcode", key)
                 return "{" + key + "}"
@@ -57,6 +80,8 @@ class StartSliceJob(Job):
         self._is_cancelled = False
         self._build_plate_number = None
 
+        self._all_extruders_settings = None # cache for all setting values from all stacks (global & extruder) for the current machine
+
     def getSliceMessage(self):
         return self._slice_message
 
@@ -242,16 +267,33 @@ class StartSliceJob(Job):
         result["date"] = time.strftime("%d-%m-%Y")
         result["day"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][int(time.strftime("%w"))]
 
+        initial_extruder_stack = Application.getInstance().getExtruderManager().getUsedExtruderStacks()[0]
+        initial_extruder_nr = initial_extruder_stack.getProperty("extruder_nr", "value")
+        result["initial_extruder_nr"] = initial_extruder_nr
+
         return result
 
     ##  Replace setting tokens in a piece of g-code.
     #   \param value A piece of g-code to replace tokens in.
-    #   \param settings A dictionary of tokens to replace and their respective
-    #   replacement strings.
-    def _expandGcodeTokens(self, value: str, settings: dict):
+    #   \param default_extruder_nr Stack nr to use when no stack nr is specified, defaults to the global stack
+    def _expandGcodeTokens(self, value: str, default_extruder_nr: int = -1):
+        if not self._all_extruders_settings:
+            global_stack = Application.getInstance().getGlobalContainerStack()
+
+            # NB: keys must be strings for the string formatter
+            self._all_extruders_settings = {
+                "-1": self._buildReplacementTokens(global_stack)
+            }
+
+            for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()):
+                extruder_nr = extruder_stack.getProperty("extruder_nr", "value")
+                self._all_extruders_settings[str(extruder_nr)] = self._buildReplacementTokens(extruder_stack)
+
         try:
             # any setting can be used as a token
             fmt = GcodeStartEndFormatter()
+            settings = self._all_extruders_settings.copy()
+            settings["default_extruder_nr"] = default_extruder_nr
             return str(fmt.format(value, **settings))
         except:
             Logger.logException("w", "Unable to do token replacement on start/end gcode")
@@ -268,8 +310,9 @@ class StartSliceJob(Job):
         settings["material_guid"] = stack.material.getMetaDataEntry("GUID", "")
 
         # Replace the setting tokens in start and end g-code.
-        settings["machine_extruder_start_code"] = self._expandGcodeTokens(settings["machine_extruder_start_code"], settings)
-        settings["machine_extruder_end_code"] = self._expandGcodeTokens(settings["machine_extruder_end_code"], settings)
+        extruder_nr = stack.getProperty("extruder_nr", "value")
+        settings["machine_extruder_start_code"] = self._expandGcodeTokens(settings["machine_extruder_start_code"], extruder_nr)
+        settings["machine_extruder_end_code"] = self._expandGcodeTokens(settings["machine_extruder_end_code"], extruder_nr)
 
         for key, value in settings.items():
             # Do not send settings that are not settable_per_extruder.
@@ -294,13 +337,13 @@ class StartSliceJob(Job):
         print_temperature_settings = {"material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature"}
         settings["material_print_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in print_temperature_settings))
 
-        # Find the correct temperatures from the first used extruder
-        extruder_stack = Application.getInstance().getExtruderManager().getUsedExtruderStacks()[0]
-        extruder_0_settings = self._buildReplacementTokens(extruder_stack)
-
         # Replace the setting tokens in start and end g-code.
-        settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], extruder_0_settings)
-        settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], extruder_0_settings)
+        # Use values from the first used extruder by default so we get the expected temperatures
+        initial_extruder_stack = Application.getInstance().getExtruderManager().getUsedExtruderStacks()[0]
+        initial_extruder_nr = initial_extruder_stack.getProperty("extruder_nr", "value")
+
+        settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], initial_extruder_nr)
+        settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], initial_extruder_nr)
 
         # Add all sub-messages for each individual setting.
         for key, value in settings.items():

+ 7 - 2
plugins/MachineSettingsAction/MachineSettingsAction.py

@@ -27,7 +27,9 @@ class MachineSettingsAction(MachineAction):
         self._qml_url = "MachineSettingsAction.qml"
 
         self._global_container_stack = None
-        self._container_index = 0
+
+        from cura.Settings.CuraContainerStack import _ContainerIndexes
+        self._container_index = _ContainerIndexes.DefinitionChanges
 
         self._container_registry = ContainerRegistry.getInstance()
         self._container_registry.containerAdded.connect(self._onContainerAdded)
@@ -241,6 +243,7 @@ class MachineSettingsAction(MachineAction):
                 "type": "material",
                 "approximate_diameter": machine_approximate_diameter,
                 "material": old_material.getMetaDataEntry("material", "value"),
+                "brand": old_material.getMetaDataEntry("brand", "value"),
                 "supplier": old_material.getMetaDataEntry("supplier", "value"),
                 "color_name": old_material.getMetaDataEntry("color_name", "value"),
                 "definition": materials_definition
@@ -251,6 +254,7 @@ class MachineSettingsAction(MachineAction):
             if old_material == self._empty_container:
                 search_criteria.pop("material", None)
                 search_criteria.pop("supplier", None)
+                search_criteria.pop("brand", None)
                 search_criteria.pop("definition", None)
                 search_criteria["id"] = extruder_stack.getMetaDataEntry("preferred_material")
 
@@ -258,6 +262,7 @@ class MachineSettingsAction(MachineAction):
             if not materials:
                 # Same material with new diameter is not found, search for generic version of the same material type
                 search_criteria.pop("supplier", None)
+                search_criteria.pop("brand", None)
                 search_criteria["color_name"] = "Generic"
                 materials = self._container_registry.findInstanceContainers(**search_criteria)
             if not materials:
@@ -274,6 +279,6 @@ class MachineSettingsAction(MachineAction):
                 # Just use empty material as a final fallback
                 materials = [self._empty_container]
 
-            Logger.log("i", "Selecting new material: %s" % materials[0].getId())
+            Logger.log("i", "Selecting new material: %s", materials[0].getId())
 
             extruder_stack.material = materials[0]

+ 1 - 1
plugins/MachineSettingsAction/MachineSettingsAction.qml

@@ -393,7 +393,7 @@ Cura.MachineAction
                             property string label: catalog.i18nc("@label", "Material diameter")
                             property string unit: catalog.i18nc("@label", "mm")
                             property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile.")
-                            property var afterOnEditingFinished:
+                            function afterOnEditingFinished()
                             {
                                 if (settingsTabs.currentIndex > 0)
                                 {

+ 55 - 0
resources/definitions/anycubic_i3_mega.def.json

@@ -0,0 +1,55 @@
+{
+	"version":2,
+    "name":"Anycubic i3 Mega",
+    "inherits":"fdmprinter",
+    "metadata":{
+        "visible":true,
+        "author":"TheTobby",
+        "manufacturer":"Anycubic",
+        "file_formats":"text/x-gcode",
+        "icon":"icon_ultimaker2",
+        "platform":"anycubic_i3_mega_platform.stl",
+		"has_materials": false,
+		"has_machine_quality": true,
+		"preferred_quality": "*normal*"
+    },
+	
+    "overrides":{
+        "machine_name":{
+            "default_value":"Anycubic i3 Mega"
+        },
+        "machine_heated_bed":{
+            "default_value":true
+        },
+        "machine_width":{
+            "default_value":210
+        },
+        "machine_height":{
+            "default_value":205
+        },
+        "machine_depth":{
+            "default_value":210
+        },
+        "machine_center_is_zero":{
+            "default_value":false
+        },
+        "machine_nozzle_size":{
+            "default_value":0.4
+        },
+        "material_diameter":{
+            "default_value":1.75
+        },
+        "gantry_height":{
+            "default_value":0	
+        },
+        "machine_gcode_flavor":{
+            "default_value":"RepRap (Marlin/Sprinter)"
+        },
+        "machine_start_gcode":{
+            "default_value":"G21 ;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\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\nG5"
+        },
+        "machine_end_gcode":{
+            "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;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\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000"
+        }
+    }
+}

+ 54 - 0
resources/definitions/tevo_blackwidow.def.json

@@ -0,0 +1,54 @@
+{
+    "version": 2,
+    "name": "Tevo Black Widow",
+    "inherits": "fdmprinter",
+    "metadata": {
+        "visible": true,
+        "author": "TheTobby",
+        "manufacturer": "Tevo",
+        "file_formats": "text/x-gcode",
+        "icon": "icon_ultimaker2",
+		"has_materials": false,
+        "has_machine_quality": true,
+        "platform": "prusai3_platform.stl",
+		"preferred_quality": "*normal*"
+    },
+    "overrides": {
+        "machine_name": {
+            "default_value": "Tevo Black Widow"
+        },
+        "machine_heated_bed": {
+            "default_value": true
+        },
+        "machine_width": {
+            "default_value": 350
+        },
+        "machine_height": {
+            "default_value": 250
+        },
+        "machine_depth": {
+            "default_value": 250
+        },
+        "machine_center_is_zero": {
+            "default_value": false
+        },
+        "machine_nozzle_size": {
+            "default_value": 0.4
+        },
+        "material_diameter": {
+            "default_value": 1.75			
+        },
+        "gantry_height": {
+            "default_value": 0
+        },
+        "machine_gcode_flavor": {
+            "default_value": "RepRap (Marlin/Sprinter)"
+        },
+        "machine_start_gcode": {
+            "default_value": "M280 P0 S160 ; release BLTouch alarm (OK to send for Non BLTouch)\nM420 Z2 ; set fade leveling at 2mm for BLTouch (OK to send for Non BLTouch)\nG28 ; home all\nG29 ; probe bed\nG92 E0 ;zero the extruded length\nG1 X0.0 Y50.0 Z10.0 F3600\n; perform wipe and prime\nG1 Z0.0 F1000\nG1 Z0.2 Y70.0 E9.0 F1000.0 ; prime\nG1 Y100.0 E12.5 F1000.0 ; prime\nG92 E0 ; zero extruder again\nM117 Printing..."
+        },
+        "machine_end_gcode": {
+            "default_value": "G92 E0 ; zero the extruded length again\nG1 E-1.5 F500 ; retract the filament to release some of the pressure\nM104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nG28 X0 ; home X axis\nG1 Y245 ; move Y axis to end position\nM84 ; disable motors\nM107 ; turn off fan"
+        }
+    }
+}

+ 1 - 1
resources/definitions/tevo_tarantula.def.json

@@ -66,7 +66,7 @@
             "default_value": "G21 ;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\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
         },
         "machine_end_gcode": {
-            "default_value": "M104 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+0.5 E-5 X-20 Y-20 F9000 ;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\nM84 ;steppers off\nG90 ;absolute positioning\nG1 Y200 F3600 ;move baseplate to front for easier access to printed object"
+            "default_value": "M104 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+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG90 ;absolute positioning\nG1 X0 Y200 F3600 ;move extruder out of the way by moving the baseplate to the front for easier access to printed object\nM84 ;steppers off"
         }
     }
 }

BIN
resources/meshes/anycubic_i3_mega_platform.stl


BIN
resources/meshes/tevo_blackwidow.stl


+ 37 - 4
resources/qml/Actions.qml

@@ -17,7 +17,12 @@ Item
     property alias undo: undoAction;
     property alias redo: redoAction;
 
-    property alias homeCamera: homeCameraAction;
+    property alias view3DCamera: view3DCameraAction;
+    property alias viewFrontCamera: viewFrontCameraAction;
+    property alias viewTopCamera: viewTopCameraAction;
+    property alias viewLeftSideCamera: viewLeftSideCameraAction;
+    property alias viewRightSideCamera: viewRightSideCameraAction;
+
     property alias expandSidebar: expandSidebarAction;
 
     property alias deleteSelection: deleteSelectionAction;
@@ -105,9 +110,37 @@ Item
 
     Action
     {
-        id: homeCameraAction;
-        text: catalog.i18nc("@action:inmenu menubar:view","&Reset camera position");
-        onTriggered: CuraActions.homeCamera();
+        id: view3DCameraAction;
+        text: catalog.i18nc("@action:inmenu menubar:view","&3D View");
+        onTriggered: UM.Controller.rotateView("3d", 0);
+    }
+
+    Action
+    {
+        id: viewFrontCameraAction;
+        text: catalog.i18nc("@action:inmenu menubar:view","&Front View");
+        onTriggered: UM.Controller.rotateView("home", 0);
+    }
+
+    Action
+    {
+        id: viewTopCameraAction;
+        text: catalog.i18nc("@action:inmenu menubar:view","&Top View");
+        onTriggered: UM.Controller.rotateView("y", 90);
+    }
+
+    Action
+    {
+        id: viewLeftSideCameraAction;
+        text: catalog.i18nc("@action:inmenu menubar:view","&Left Side View");
+        onTriggered: UM.Controller.rotateView("x", 90);
+    }
+
+    Action
+    {
+        id: viewRightSideCameraAction;
+        text: catalog.i18nc("@action:inmenu menubar:view","&Right Side View");
+        onTriggered: UM.Controller.rotateView("x", -90);
     }
 
     Action

Some files were not shown because too many files changed in this diff