Browse Source

Merge pull request #7164 from Ultimaker/Hrybmo-master

Update to ColorMix.py script
konskarm 5 years ago
parent
commit
ba0eb114f6
1 changed files with 82 additions and 64 deletions
  1. 82 64
      plugins/PostProcessingPlugin/scripts/ColorMix.py

+ 82 - 64
plugins/PostProcessingPlugin/scripts/ColorMix.py

@@ -6,14 +6,22 @@
 #Authors of the 2-1 ColorMix plug-in / script:
 # Written by John Hryb - john.hryb.4@gmail.com
 
-##history / change-log:
-##V1.0.0
-
-## Uses -
-## M163 - Set Mix Factor 
-## M164 - Save Mix - saves to T3 as a unique mix
-
-import re #To perform the search and replace. 
+#history / change-log:
+#V1.0.0 - Initial
+#V1.1.0 - 
+    # additions:
+        #Object number - To select individual models or all when using "one at a time" print sequence
+#V1.2.0
+    # fixed layer heights Cura starts at 1 while G-code starts at 0
+    # removed notes
+    # changed Units of measurement to Units
+#V1.2.1
+    # Fixed mm bug when not in multiples of layer height
+# Uses -
+# M163 - Set Mix Factor 
+# M164 - Save Mix - saves to T2 as a unique mix
+    
+import re #To perform the search and replace.
 from ..Script import Script
 
 class ColorMix(Script):
@@ -22,20 +30,28 @@ class ColorMix(Script):
 
     def getSettingDataString(self):
         return """{
-            "name":"ColorMix 2-1",
+            "name":"ColorMix 2-1 V1.2.1",
             "key":"ColorMix 2-1",
             "metadata": {},
             "version": 2,
             "settings":
             {
-                "measurement_units":
+                "units_of_measurement":
                 {
-                    "label": "Units of measurement",
+                    "label": "Units",
                     "description": "Input value as mm or layer number.",
                     "type": "enum",
                     "options": {"mm":"mm","layer":"Layer"},
                     "default_value": "layer"
                 },
+                "object_number":
+                {
+                    "label": "Object Number",
+                    "description": "Select model to apply to for print one at a time print sequence. 0 = everything",
+                    "type": "int",
+                    "default_value": 0,
+                    "minimum_value": "0"
+                },
                 "start_height":
                 {
                     "label": "Start Height",
@@ -59,10 +75,10 @@ class ColorMix(Script):
                     "type": "float",
                     "default_value": 0,
                     "minimum_value": "0",
-                    "minimum_value_warning": "0.1",
-                    "enabled": "c_behavior == 'blend_value'" 
+                    "minimum_value_warning": "start_height",
+                    "enabled": "behavior == 'blend_value'" 
                 },
-                "mix_start_ratio":
+                "mix_start":
                 {
                     "label": "Start mix ratio",
                     "description": "First extruder percentage 0-100",
@@ -72,7 +88,7 @@ class ColorMix(Script):
                     "minimum_value_warning": "0",
                     "maximum_value_warning": "100"
                 },
-                "mix_finish_ratio":
+                "mix_finish":
                 {
                     "label": "End mix ratio",
                     "description": "First extruder percentage 0-100 to finish blend",
@@ -81,14 +97,7 @@ class ColorMix(Script):
                     "minimum_value": "0",
                     "minimum_value_warning": "0",
                     "maximum_value_warning": "100",
-                    "enabled": "c_behavior == 'blend_value'"
-                },
-                "notes":
-                {
-                    "label": "Notes",
-                    "description": "A spot to put a note",
-                    "type": "str",
-                    "default_value": ""
+                    "enabled": "behavior == 'blend_value'"
                 }
             }
         }"""
@@ -112,52 +121,53 @@ class ColorMix(Script):
             return default
 
     def execute(self, data):
-        #get user variables
-        firstHeight = 0.0
-        secondHeight = 0.0
-        firstMix = 0.0
-        SecondMix = 0.0
 
         firstHeight = self.getSettingValueByKey("start_height")
         secondHeight = self.getSettingValueByKey("finish_height")
-        firstMix = self.getSettingValueByKey("mix_start_ratio")
-        SecondMix = self.getSettingValueByKey("mix_finish_ratio")
-
-        #locals
-        layer = 0
-
+        firstMix = self.getSettingValueByKey("mix_start")
+        secondMix = self.getSettingValueByKey("mix_finish")
+        modelOfInterest = self.getSettingValueByKey("object_number")
+        
         #get layer height
-        layerHeight = .2
+        layerHeight = 0
         for active_layer in data:
             lines = active_layer.split("\n")
             for line in lines:
                 if ";Layer height: " in line:
                     layerHeight = self.getValue(line, ";Layer height: ", layerHeight)
                     break
+            if layerHeight != 0:
+                break
+        
+        #default layerHeight if not found
+        if layerHeight == 0:
+            layerHeight = .2
+            
         #get layers to use
         startLayer = 0
         endLayer = 0
-        if self.getSettingValueByKey("measurement_units") == "mm":
-            if firstHeight == 0:
-                startLayer = 0
-            else:
-                startLayer = firstHeight / layerHeight
-            if secondHeight == 0:
-                endLayer = 0
-            else:
-                endLayer = secondHeight / layerHeight
-        else:  #layer height
-            startLayer = firstHeight
-            endLayer = secondHeight
+        if self.getSettingValueByKey("units_of_measurement") == "mm":
+            startLayer = round(firstHeight / layerHeight)
+            endLayer = round(secondHeight / layerHeight)
+        else:  #layer height shifts down by one for g-code
+            if firstHeight <= 0:
+                firstHeight = 1
+            if secondHeight <= 0:
+                secondHeight = 1   
+            startLayer = firstHeight - 1
+            endLayer = secondHeight - 1
         #see if one-shot
         if self.getSettingValueByKey("behavior") == "fixed_value":
             endLayer = startLayer
             firstExtruderIncrements = 0
         else:  #blend
-            firstExtruderIncrements = (SecondMix - firstMix) / (endLayer - startLayer)
+            firstExtruderIncrements = (secondMix - firstMix) / (endLayer - startLayer)
         firstExtruderValue = 0
         index = 0
+
         #start scanning
+        layer = -1
+        modelNumber = 0
         for active_layer in data:
             modified_gcode = ""
             lineIndex = 0;
@@ -169,22 +179,30 @@ class ColorMix(Script):
                 # find current layer
                 if ";LAYER:" in line:
                     layer = self.getValue(line, ";LAYER:", layer)
-                    if (layer >= startLayer) and (layer <= endLayer):  #find layers of interest
-                        if lines[lineIndex + 4] == "T2":  #check if needing to delete old data
-                            del lines[(lineIndex + 1):(lineIndex + 5)] 
-                        firstExtruderValue = int(((layer - startLayer) * firstExtruderIncrements) + firstMix)
-                        if firstExtruderValue == 100:
-                            modified_gcode += "M163 S0 P1\n"
-                            modified_gcode += "M163 S1 P0\n"
-                        elif firstExtruderValue == 0:
-                            modified_gcode += "M163 S0 P0\n"
-                            modified_gcode += "M163 S1 P1\n"
-                        else:
-                            modified_gcode += "M163 S0 P0.{:02d}\n".format(firstExtruderValue)
-                            modified_gcode += "M163 S1 P0.{:02d}\n".format(100 - firstExtruderValue)
-                        modified_gcode += "M164 S2\n"
-                        modified_gcode += "T2\n"
+                    #get model number by layer 0 repeats
+                    if layer == 0:
+                        modelNumber = modelNumber + 1
+                    #search for layers to manipulate
+                    if (layer >= startLayer) and (layer <= endLayer):
+                        #make sure correct model is selected
+                        if (modelOfInterest == 0) or (modelOfInterest == modelNumber):
+                            #Delete old data if required
+                            if lines[lineIndex + 4] == "T2":  
+                                del lines[(lineIndex + 1):(lineIndex + 5)]
+                            #add mixing commands
+                            firstExtruderValue = int(((layer - startLayer) * firstExtruderIncrements) + firstMix)
+                            if firstExtruderValue == 100:
+                                modified_gcode += "M163 S0 P1\n"
+                                modified_gcode += "M163 S1 P0\n"
+                            elif firstExtruderValue == 0:
+                                modified_gcode += "M163 S0 P0\n"
+                                modified_gcode += "M163 S1 P1\n"
+                            else:
+                                modified_gcode += "M163 S0 P0.{:02d}\n".format(firstExtruderValue)
+                                modified_gcode += "M163 S1 P0.{:02d}\n".format(100 - firstExtruderValue)
+                            modified_gcode += "M164 S2\n"
+                            modified_gcode += "T2\n"
                 lineIndex += 1  #for deleting index
             data[index] = modified_gcode
             index += 1
-        return data
+        return data