From 2715a209225b74fdbcb7993f04838ebc89994c86 Mon Sep 17 00:00:00 2001 From: Wayne Porter Date: Mon, 10 Sep 2018 12:25:01 -0700 Subject: [PATCH 01/48] Add insert gcode at layer change to PostProcessingPlugin --- .../InsertAtLayerChange.py | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 plugins/PostProcessingPlugin/InsertAtLayerChange.py diff --git a/plugins/PostProcessingPlugin/InsertAtLayerChange.py b/plugins/PostProcessingPlugin/InsertAtLayerChange.py new file mode 100644 index 0000000000..df045e1490 --- /dev/null +++ b/plugins/PostProcessingPlugin/InsertAtLayerChange.py @@ -0,0 +1,55 @@ +# Created by Wayne Porter + +from ..Script import Script + +class InsertAtLayerChange(Script): + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name": "Insert at layer change", + "key": "InsertAtLayerChange", + "metadata": {}, + "version": 2, + "settings": + { + "insert_loc": + { + "label": "When to insert", + "description": "Whether to insert code before or after layer change.", + "type": "enum", + "options": {"before": "Before", "after": "After"}, + "default_value": "before" + }, + "gcode_to_add": + { + "label": "GCODE to insert.", + "description": "GCODE to add before or after layer change.", + "type": "str", + "default_value": "" + } + } + }""" + + def execute(self, data): + in_layer = False + gcode_to_add = self.getSettingValueByKey("gcode_to_add") + "\n" + for layer in data: + # Check that a layer is being printed + lines = layer.split("\n") + if ";LAYER:" in lines[0]: + in_layer = True + else: + in_layer = False + + if in_layer: + index = data.index(layer) + if self.getSettingValueByKey("insert_loc") == "before": + layer = gcode_to_add + layer + else: + layer = layer + gcode_to_add + + data[index] = layer + + return data From 74a6d31c7466bbb1bbe0ac015f4be0a6c58102a4 Mon Sep 17 00:00:00 2001 From: Wayne Porter Date: Mon, 10 Sep 2018 15:30:52 -0700 Subject: [PATCH 02/48] Add time lapse post processing plugin --- plugins/PostProcessingPlugin/TimeLapse.py | 86 +++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 plugins/PostProcessingPlugin/TimeLapse.py diff --git a/plugins/PostProcessingPlugin/TimeLapse.py b/plugins/PostProcessingPlugin/TimeLapse.py new file mode 100644 index 0000000000..0a7c893fef --- /dev/null +++ b/plugins/PostProcessingPlugin/TimeLapse.py @@ -0,0 +1,86 @@ +# Created by Wayne Porter + +from ..Script import Script + +class TimeLapse(Script): + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name": "Time Lapse", + "key": "TimeLapse", + "metadata": {}, + "version": 2, + "settings": + { + "trigger_cmd": + { + "label": "Trigger camera command", + "description": "Gcode command used to trigger camera.", + "type": "str", + "default_value": "M240" + }, + "pause_length": + { + "label": "Pause length", + "description": "How long to wait (in ms) after camera was triggered.", + "type": "int", + "default_value": 700, + "minimum_value": 0, + "unit": "ms" + }, + "head_park_x": + { + "label": "Park Print Head X", + "description": "What X location does the head move to for photo.", + "unit": "mm", + "type": "float", + "default_value": 0 + }, + "head_park_y": + { + "label": "Park Print Head Y", + "description": "What Y location does the head move to for photo.", + "unit": "mm", + "type": "float", + "default_value": 190 + }, + "park_feed_rate": + { + "label": "Park Feed Rate", + "description": "How fast does the head move to the park coordinates.", + "unit": "mm/s", + "type": "float", + "default_value": 9000 + } + } + }""" + + def execute(self, data): + in_layer = False + feed_rate = self.getSettingValueByKey("park_feed_rate") + x_park = self.getSettingValueByKey("head_park_x") + y_park = self.getSettingValueByKey("head_park_y") + trigger_cmd = self.getSettingValueByKey("trigger_cmd") + pause_length = self.getSettingValueByKey("pause_length") + + gcode_to_append = self.putValue(G = 90) + ";Absolute positioning\n" + gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Move into position\n" + gcode_to_append += trigger_cmd + ";Snap Photo\n" + gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n" + for layer in data: + # Check that a layer is being printed + lines = layer.split("\n") + if ";LAYER:" in lines[0]: + in_layer = True + else: + in_layer = False + + if in_layer: + index = data.index(layer) + layer += gcode_to_append + + data[index] = layer + + return data From 256aef30c9c7e1e52878ca388595efcdeb1e118c Mon Sep 17 00:00:00 2001 From: Wayne Porter Date: Tue, 11 Sep 2018 08:03:26 -0700 Subject: [PATCH 03/48] Move post processing scripts to correct location --- .../{ => scripts}/InsertAtLayerChange.py | 110 +++++------ .../{ => scripts}/TimeLapse.py | 172 +++++++++--------- 2 files changed, 141 insertions(+), 141 deletions(-) rename plugins/PostProcessingPlugin/{ => scripts}/InsertAtLayerChange.py (96%) rename plugins/PostProcessingPlugin/{ => scripts}/TimeLapse.py (97%) diff --git a/plugins/PostProcessingPlugin/InsertAtLayerChange.py b/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py similarity index 96% rename from plugins/PostProcessingPlugin/InsertAtLayerChange.py rename to plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py index df045e1490..04c0a3badf 100644 --- a/plugins/PostProcessingPlugin/InsertAtLayerChange.py +++ b/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py @@ -1,55 +1,55 @@ -# Created by Wayne Porter - -from ..Script import Script - -class InsertAtLayerChange(Script): - def __init__(self): - super().__init__() - - def getSettingDataString(self): - return """{ - "name": "Insert at layer change", - "key": "InsertAtLayerChange", - "metadata": {}, - "version": 2, - "settings": - { - "insert_loc": - { - "label": "When to insert", - "description": "Whether to insert code before or after layer change.", - "type": "enum", - "options": {"before": "Before", "after": "After"}, - "default_value": "before" - }, - "gcode_to_add": - { - "label": "GCODE to insert.", - "description": "GCODE to add before or after layer change.", - "type": "str", - "default_value": "" - } - } - }""" - - def execute(self, data): - in_layer = False - gcode_to_add = self.getSettingValueByKey("gcode_to_add") + "\n" - for layer in data: - # Check that a layer is being printed - lines = layer.split("\n") - if ";LAYER:" in lines[0]: - in_layer = True - else: - in_layer = False - - if in_layer: - index = data.index(layer) - if self.getSettingValueByKey("insert_loc") == "before": - layer = gcode_to_add + layer - else: - layer = layer + gcode_to_add - - data[index] = layer - - return data +# Created by Wayne Porter + +from ..Script import Script + +class InsertAtLayerChange(Script): + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name": "Insert at layer change", + "key": "InsertAtLayerChange", + "metadata": {}, + "version": 2, + "settings": + { + "insert_loc": + { + "label": "When to insert", + "description": "Whether to insert code before or after layer change.", + "type": "enum", + "options": {"before": "Before", "after": "After"}, + "default_value": "before" + }, + "gcode_to_add": + { + "label": "GCODE to insert.", + "description": "GCODE to add before or after layer change.", + "type": "str", + "default_value": "" + } + } + }""" + + def execute(self, data): + in_layer = False + gcode_to_add = self.getSettingValueByKey("gcode_to_add") + "\n" + for layer in data: + # Check that a layer is being printed + lines = layer.split("\n") + if ";LAYER:" in lines[0]: + in_layer = True + else: + in_layer = False + + if in_layer: + index = data.index(layer) + if self.getSettingValueByKey("insert_loc") == "before": + layer = gcode_to_add + layer + else: + layer = layer + gcode_to_add + + data[index] = layer + + return data diff --git a/plugins/PostProcessingPlugin/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py similarity index 97% rename from plugins/PostProcessingPlugin/TimeLapse.py rename to plugins/PostProcessingPlugin/scripts/TimeLapse.py index 0a7c893fef..731983088a 100644 --- a/plugins/PostProcessingPlugin/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -1,86 +1,86 @@ -# Created by Wayne Porter - -from ..Script import Script - -class TimeLapse(Script): - def __init__(self): - super().__init__() - - def getSettingDataString(self): - return """{ - "name": "Time Lapse", - "key": "TimeLapse", - "metadata": {}, - "version": 2, - "settings": - { - "trigger_cmd": - { - "label": "Trigger camera command", - "description": "Gcode command used to trigger camera.", - "type": "str", - "default_value": "M240" - }, - "pause_length": - { - "label": "Pause length", - "description": "How long to wait (in ms) after camera was triggered.", - "type": "int", - "default_value": 700, - "minimum_value": 0, - "unit": "ms" - }, - "head_park_x": - { - "label": "Park Print Head X", - "description": "What X location does the head move to for photo.", - "unit": "mm", - "type": "float", - "default_value": 0 - }, - "head_park_y": - { - "label": "Park Print Head Y", - "description": "What Y location does the head move to for photo.", - "unit": "mm", - "type": "float", - "default_value": 190 - }, - "park_feed_rate": - { - "label": "Park Feed Rate", - "description": "How fast does the head move to the park coordinates.", - "unit": "mm/s", - "type": "float", - "default_value": 9000 - } - } - }""" - - def execute(self, data): - in_layer = False - feed_rate = self.getSettingValueByKey("park_feed_rate") - x_park = self.getSettingValueByKey("head_park_x") - y_park = self.getSettingValueByKey("head_park_y") - trigger_cmd = self.getSettingValueByKey("trigger_cmd") - pause_length = self.getSettingValueByKey("pause_length") - - gcode_to_append = self.putValue(G = 90) + ";Absolute positioning\n" - gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Move into position\n" - gcode_to_append += trigger_cmd + ";Snap Photo\n" - gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n" - for layer in data: - # Check that a layer is being printed - lines = layer.split("\n") - if ";LAYER:" in lines[0]: - in_layer = True - else: - in_layer = False - - if in_layer: - index = data.index(layer) - layer += gcode_to_append - - data[index] = layer - - return data +# Created by Wayne Porter + +from ..Script import Script + +class TimeLapse(Script): + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name": "Time Lapse", + "key": "TimeLapse", + "metadata": {}, + "version": 2, + "settings": + { + "trigger_cmd": + { + "label": "Trigger camera command", + "description": "Gcode command used to trigger camera.", + "type": "str", + "default_value": "M240" + }, + "pause_length": + { + "label": "Pause length", + "description": "How long to wait (in ms) after camera was triggered.", + "type": "int", + "default_value": 700, + "minimum_value": 0, + "unit": "ms" + }, + "head_park_x": + { + "label": "Park Print Head X", + "description": "What X location does the head move to for photo.", + "unit": "mm", + "type": "float", + "default_value": 0 + }, + "head_park_y": + { + "label": "Park Print Head Y", + "description": "What Y location does the head move to for photo.", + "unit": "mm", + "type": "float", + "default_value": 190 + }, + "park_feed_rate": + { + "label": "Park Feed Rate", + "description": "How fast does the head move to the park coordinates.", + "unit": "mm/s", + "type": "float", + "default_value": 9000 + } + } + }""" + + def execute(self, data): + in_layer = False + feed_rate = self.getSettingValueByKey("park_feed_rate") + x_park = self.getSettingValueByKey("head_park_x") + y_park = self.getSettingValueByKey("head_park_y") + trigger_cmd = self.getSettingValueByKey("trigger_cmd") + pause_length = self.getSettingValueByKey("pause_length") + + gcode_to_append = self.putValue(G = 90) + ";Absolute positioning\n" + gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Move into position\n" + gcode_to_append += trigger_cmd + ";Snap Photo\n" + gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n" + for layer in data: + # Check that a layer is being printed + lines = layer.split("\n") + if ";LAYER:" in lines[0]: + in_layer = True + else: + in_layer = False + + if in_layer: + index = data.index(layer) + layer += gcode_to_append + + data[index] = layer + + return data From eb3670dd935818daf46a23aa5a7906139b4d5776 Mon Sep 17 00:00:00 2001 From: Wayne Porter Date: Tue, 11 Sep 2018 08:28:55 -0700 Subject: [PATCH 04/48] Make timelapse head parking optional --- .../PostProcessingPlugin/scripts/TimeLapse.py | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index 731983088a..ee58b89fe2 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -30,13 +30,21 @@ class TimeLapse(Script): "minimum_value": 0, "unit": "ms" }, + "park_print_head": + { + "label": "Park Print Head", + "description": "Park the print head out of the way", + "type": "bool", + "default_value": true + }, "head_park_x": { "label": "Park Print Head X", "description": "What X location does the head move to for photo.", "unit": "mm", "type": "float", - "default_value": 0 + "default_value": 0, + "enabled": "park_print_head" }, "head_park_y": { @@ -44,7 +52,8 @@ class TimeLapse(Script): "description": "What Y location does the head move to for photo.", "unit": "mm", "type": "float", - "default_value": 190 + "default_value": 190, + "enabled": "park_print_head" }, "park_feed_rate": { @@ -52,7 +61,8 @@ class TimeLapse(Script): "description": "How fast does the head move to the park coordinates.", "unit": "mm/s", "type": "float", - "default_value": 9000 + "default_value": 9000, + "enabled": "park_print_head" } } }""" @@ -60,13 +70,15 @@ class TimeLapse(Script): def execute(self, data): in_layer = False feed_rate = self.getSettingValueByKey("park_feed_rate") + park_print_head = self.getSettingValueByKey("park_print_head") x_park = self.getSettingValueByKey("head_park_x") y_park = self.getSettingValueByKey("head_park_y") trigger_cmd = self.getSettingValueByKey("trigger_cmd") pause_length = self.getSettingValueByKey("pause_length") - gcode_to_append = self.putValue(G = 90) + ";Absolute positioning\n" - gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Move into position\n" + if park_print_head: + gcode_to_append = self.putValue(G = 90) + ";Absolute positioning\n" + gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Park print head\n" gcode_to_append += trigger_cmd + ";Snap Photo\n" gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n" for layer in data: From 2e77293204a2ed286beb2447f0b467587cbeedeb Mon Sep 17 00:00:00 2001 From: Wayne Porter Date: Tue, 11 Sep 2018 13:19:40 -0700 Subject: [PATCH 05/48] Add wait for moves to finish to timelapse script --- plugins/PostProcessingPlugin/scripts/TimeLapse.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index ee58b89fe2..7420e0895f 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -76,6 +76,7 @@ class TimeLapse(Script): trigger_cmd = self.getSettingValueByKey("trigger_cmd") pause_length = self.getSettingValueByKey("pause_length") + gcode_to_append = self.putValue(M = 400) + ";Wait for moves to finish\n" if park_print_head: gcode_to_append = self.putValue(G = 90) + ";Absolute positioning\n" gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Park print head\n" From 2502d474139c6907eb3c90cc62ad63c60f339840 Mon Sep 17 00:00:00 2001 From: Wayne Porter Date: Wed, 26 Sep 2018 11:24:26 -0700 Subject: [PATCH 06/48] Fix tab/space mixing Signed-off-by: Wayne Porter --- plugins/PostProcessingPlugin/scripts/TimeLapse.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index 7420e0895f..0402d3eaf8 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -32,10 +32,10 @@ class TimeLapse(Script): }, "park_print_head": { - "label": "Park Print Head", - "description": "Park the print head out of the way", - "type": "bool", - "default_value": true + "label": "Park Print Head", + "description": "Park the print head out of the way", + "type": "bool", + "default_value": true }, "head_park_x": { @@ -78,8 +78,8 @@ class TimeLapse(Script): gcode_to_append = self.putValue(M = 400) + ";Wait for moves to finish\n" if park_print_head: - gcode_to_append = self.putValue(G = 90) + ";Absolute positioning\n" - gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Park print head\n" + gcode_to_append = self.putValue(G = 90) + ";Absolute positioning\n" + gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Park print head\n" gcode_to_append += trigger_cmd + ";Snap Photo\n" gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n" for layer in data: From 26bbf3ef0ebf9d53192ec39de5d9e1faab95c3a3 Mon Sep 17 00:00:00 2001 From: Wayne Porter Date: Wed, 26 Sep 2018 13:33:28 -0700 Subject: [PATCH 07/48] Fix bug when parking nozzle Signed-off-by: Wayne Porter --- plugins/PostProcessingPlugin/scripts/TimeLapse.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index 0402d3eaf8..ccfca9c2a8 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -75,11 +75,12 @@ class TimeLapse(Script): y_park = self.getSettingValueByKey("head_park_y") trigger_cmd = self.getSettingValueByKey("trigger_cmd") pause_length = self.getSettingValueByKey("pause_length") + gcode_to_append = "" - gcode_to_append = self.putValue(M = 400) + ";Wait for moves to finish\n" if park_print_head: - gcode_to_append = self.putValue(G = 90) + ";Absolute positioning\n" + gcode_to_append += self.putValue(G = 90) + ";Absolute positioning\n" gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Park print head\n" + gcode_to_append += self.putValue(M = 400) + ";Wait for moves to finish\n" gcode_to_append += trigger_cmd + ";Snap Photo\n" gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n" for layer in data: From 03c0faaeca78280b29ba44af2ad17f1735f8aa56 Mon Sep 17 00:00:00 2001 From: Wayne Porter Date: Wed, 26 Sep 2018 13:39:55 -0700 Subject: [PATCH 08/48] Add beginning and end gcode comments Signed-off-by: Wayne Porter --- plugins/PostProcessingPlugin/scripts/TimeLapse.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index ccfca9c2a8..4160e3e2fc 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -75,7 +75,7 @@ class TimeLapse(Script): y_park = self.getSettingValueByKey("head_park_y") trigger_cmd = self.getSettingValueByKey("trigger_cmd") pause_length = self.getSettingValueByKey("pause_length") - gcode_to_append = "" + gcode_to_append = ";TimeLapse Begin" if park_print_head: gcode_to_append += self.putValue(G = 90) + ";Absolute positioning\n" @@ -83,6 +83,7 @@ class TimeLapse(Script): gcode_to_append += self.putValue(M = 400) + ";Wait for moves to finish\n" gcode_to_append += trigger_cmd + ";Snap Photo\n" gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n" + gcode_to_append += ";TimeLapse End" for layer in data: # Check that a layer is being printed lines = layer.split("\n") From f3ad17af85d8f989487cc65cc5961b7e04ab3710 Mon Sep 17 00:00:00 2001 From: Wayne Porter Date: Wed, 26 Sep 2018 13:54:09 -0700 Subject: [PATCH 09/48] Remove G90 and assume absolute positioning Signed-off-by: Wayne Porter --- plugins/PostProcessingPlugin/scripts/TimeLapse.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index 4160e3e2fc..00f22786ec 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -33,7 +33,7 @@ class TimeLapse(Script): "park_print_head": { "label": "Park Print Head", - "description": "Park the print head out of the way", + "description": "Park the print head out of the way. Assumes absolute positioning.", "type": "bool", "default_value": true }, @@ -78,7 +78,6 @@ class TimeLapse(Script): gcode_to_append = ";TimeLapse Begin" if park_print_head: - gcode_to_append += self.putValue(G = 90) + ";Absolute positioning\n" gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Park print head\n" gcode_to_append += self.putValue(M = 400) + ";Wait for moves to finish\n" gcode_to_append += trigger_cmd + ";Snap Photo\n" From 821a4dea67a4f60a398dd275912a07c9690821c6 Mon Sep 17 00:00:00 2001 From: Wayne Porter Date: Wed, 26 Sep 2018 14:00:36 -0700 Subject: [PATCH 10/48] Fix begin and end comments Signed-off-by: Wayne Porter --- plugins/PostProcessingPlugin/scripts/TimeLapse.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index 00f22786ec..a4b0996075 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -75,14 +75,14 @@ class TimeLapse(Script): y_park = self.getSettingValueByKey("head_park_y") trigger_cmd = self.getSettingValueByKey("trigger_cmd") pause_length = self.getSettingValueByKey("pause_length") - gcode_to_append = ";TimeLapse Begin" + gcode_to_append = ";TimeLapse Begin\n" if park_print_head: gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Park print head\n" gcode_to_append += self.putValue(M = 400) + ";Wait for moves to finish\n" gcode_to_append += trigger_cmd + ";Snap Photo\n" gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n" - gcode_to_append += ";TimeLapse End" + gcode_to_append += ";TimeLapse End\n" for layer in data: # Check that a layer is being printed lines = layer.split("\n") From 1b7e55ddcb5ac52fd64a9f3b7a95ac036db49ebb Mon Sep 17 00:00:00 2001 From: BluefireXD Date: Mon, 7 Jan 2019 02:47:39 +0100 Subject: [PATCH 11/48] Added Anycubic Chiron definition file --- .../definitions/anycubic_chiron.def.json | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 resources/definitions/anycubic_chiron.def.json diff --git a/resources/definitions/anycubic_chiron.def.json b/resources/definitions/anycubic_chiron.def.json new file mode 100644 index 0000000000..7035974b66 --- /dev/null +++ b/resources/definitions/anycubic_chiron.def.json @@ -0,0 +1,80 @@ +{ + "version": 2, + "name": "Anycubic Chiron", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "Patrick Glatt", + "manufacturer": "Anycubic", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2", + "platform": "anycubic_chiron_platform.obj", + "platform_texture": "anycubic-chiron.png", + "has_materials": true, + "preferred_material": "generic_pla", + "has_machine_quality": true, + "quality_definition": "anycubic_chiron", + "preferred_quality_type": "normal", + "machine_extruder_trains": + { + "0": "anycubic_chiron_extruder_0" + }, + "firmware_file": "CHIRON.hex" + }, + + "overrides": + { + "machine_name": + { + "default_value": "Anycubic Chiron" + }, + "machine_heated_bed": + { + "default_value": true + }, + "machine_width": + { + "default_value": 400 + }, + "machine_height": + { + "default_value": 450 + }, + "machine_depth": + { + "default_value": 400 + }, + "machine_center_is_zero": + { + "default_value": false + }, + "gantry_height": + { + "default_value": 35 + }, + "machine_head_with_fans_polygon": + { + "default_value": + [ + [-45, 50], + [-45, -45], + [45, 50], + [45, -45] + ] + }, + "machine_gcode_flavor": + { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": + { + "default_value": "M107 ;Start with the fan off\nG21 ;Set units to millimeters\nG91 ;Change to relative positioning mode for retract filament and nozzle lifting\nG1 F200 E-3 ;Retract 3mm filament for a clean start\nG92 E0 ;Zero the extruded length\nG1 F1000 Z5 ;Lift the nozzle 5mm before homing axes\nG90 ;Absolute positioning\nM82 ;Set extruder to absolute mode too\nG28 X0 Y0 ;First move X/Y to min endstops\nG28 Z0 ;Then move Z to min endstops\nG1 F1000 Z15 ;After homing lift the nozzle 15mm before start printing\n" + }, + "machine_end_gcode": + { + "default_value": "G91 ;Change to relative positioning mode for filament retraction and nozzle lifting\nG1 F200 E-4;Retract the filament a bit before lifting the nozzle\nG1 F1000 Z5;Lift nozzle 5mm\nG90 ;Change to absolute positioning mode to prepare for part rermoval\nG1 X0 Y400 ;Move the print to max y pos for part rermoval\nM104 S0 ; Turn off hotend\nM106 S0 ; Turn off cooling fan\nM140 S0 ; Turn off bed\nM84 ; Disable motors\n" + } + } +} From 75460728e2d7ce465a85af2b57017ae745d0ca81 Mon Sep 17 00:00:00 2001 From: BluefireXD Date: Mon, 7 Jan 2019 02:48:22 +0100 Subject: [PATCH 12/48] Added Anycubic Chiron extruder definition file --- resources/extruders/anycubic_chiron.def.json | 80 ++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 resources/extruders/anycubic_chiron.def.json diff --git a/resources/extruders/anycubic_chiron.def.json b/resources/extruders/anycubic_chiron.def.json new file mode 100644 index 0000000000..7035974b66 --- /dev/null +++ b/resources/extruders/anycubic_chiron.def.json @@ -0,0 +1,80 @@ +{ + "version": 2, + "name": "Anycubic Chiron", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "Patrick Glatt", + "manufacturer": "Anycubic", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2", + "platform": "anycubic_chiron_platform.obj", + "platform_texture": "anycubic-chiron.png", + "has_materials": true, + "preferred_material": "generic_pla", + "has_machine_quality": true, + "quality_definition": "anycubic_chiron", + "preferred_quality_type": "normal", + "machine_extruder_trains": + { + "0": "anycubic_chiron_extruder_0" + }, + "firmware_file": "CHIRON.hex" + }, + + "overrides": + { + "machine_name": + { + "default_value": "Anycubic Chiron" + }, + "machine_heated_bed": + { + "default_value": true + }, + "machine_width": + { + "default_value": 400 + }, + "machine_height": + { + "default_value": 450 + }, + "machine_depth": + { + "default_value": 400 + }, + "machine_center_is_zero": + { + "default_value": false + }, + "gantry_height": + { + "default_value": 35 + }, + "machine_head_with_fans_polygon": + { + "default_value": + [ + [-45, 50], + [-45, -45], + [45, 50], + [45, -45] + ] + }, + "machine_gcode_flavor": + { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": + { + "default_value": "M107 ;Start with the fan off\nG21 ;Set units to millimeters\nG91 ;Change to relative positioning mode for retract filament and nozzle lifting\nG1 F200 E-3 ;Retract 3mm filament for a clean start\nG92 E0 ;Zero the extruded length\nG1 F1000 Z5 ;Lift the nozzle 5mm before homing axes\nG90 ;Absolute positioning\nM82 ;Set extruder to absolute mode too\nG28 X0 Y0 ;First move X/Y to min endstops\nG28 Z0 ;Then move Z to min endstops\nG1 F1000 Z15 ;After homing lift the nozzle 15mm before start printing\n" + }, + "machine_end_gcode": + { + "default_value": "G91 ;Change to relative positioning mode for filament retraction and nozzle lifting\nG1 F200 E-4;Retract the filament a bit before lifting the nozzle\nG1 F1000 Z5;Lift nozzle 5mm\nG90 ;Change to absolute positioning mode to prepare for part rermoval\nG1 X0 Y400 ;Move the print to max y pos for part rermoval\nM104 S0 ; Turn off hotend\nM106 S0 ; Turn off cooling fan\nM140 S0 ; Turn off bed\nM84 ; Disable motors\n" + } + } +} From b6b6382199711c829f764f5ca022f0ecd8b8a494 Mon Sep 17 00:00:00 2001 From: BluefireXD Date: Mon, 7 Jan 2019 02:50:16 +0100 Subject: [PATCH 13/48] Added Anycubic Chiron platform picture --- resources/images/anycubic-chiron.png | Bin 0 -> 94131 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/images/anycubic-chiron.png diff --git a/resources/images/anycubic-chiron.png b/resources/images/anycubic-chiron.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe07b42a68c23c7032b4b1afbba87cd698ee892 GIT binary patch literal 94131 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 Ps5@7ZSASY0XBzlFJJvW< literal 0 HcmV?d00001 From 2687836bebf5b77fdb1d7d71058d0deb82fb45bd Mon Sep 17 00:00:00 2001 From: BluefireXD Date: Mon, 7 Jan 2019 02:51:06 +0100 Subject: [PATCH 14/48] Added Anycubic Chiron platform obj file --- resources/meshes/anycubic_chiron_platform.obj | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 resources/meshes/anycubic_chiron_platform.obj diff --git a/resources/meshes/anycubic_chiron_platform.obj b/resources/meshes/anycubic_chiron_platform.obj new file mode 100644 index 0000000000..7a9c8642fc --- /dev/null +++ b/resources/meshes/anycubic_chiron_platform.obj @@ -0,0 +1,150 @@ +# WaveFront *.obj file (generated by Autodesk ATF) +#Author: Patrick Glatt +mtllib ae48cbb4-79ca-43fd-95a7-5e2258fec6c5.mtl + +o Anycubic Chiron Platform +#vertex 1 +v 200.000000 200.000000 0.000000 +#vertex 2 +v 200.000000 -200.000000 0.000000 +#vertex 3 +v 200.000000 -200.000000 -4.000000 +#vertex 4 +v 200.000000 200.000000 -4.000000 +#vertex 5 +v -200.000000 200.000000 0.000000 +#vertex 6 +v -200.000000 200.000000 -4.000000 +#vertex 7 +v -200.000000 -200.000000 0.000000 +#vertex 8 +v -200.000000 -200.000000 -4.000000 + +#vt right +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +#vt front +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +#vt left +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +#vt back +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +#vt top (only the color of the (0.000000 1.000000 0.000000) corner in logo) +#vt 0.000000 1.000000 0.000000 +#vt 0.000000 1.000000 0.000000 +#vt 0.000000 1.000000 0.000000 +#vt 0.000000 1.000000 0.000000 +#vt top (full logo) +vt 0.00000 0.000000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 1.000000 1.000000 0.000000 +#vt bottom +vt 0.000000 0.000000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 1.000000 1.000000 0.000000 + +#vn right +vn 0.000000 0.000000 0.000000 +vn 0.100000 0.000000 0.000000 +vn 0.100000 0.000000 0.000000 +vn 0.100000 0.000000 0.000000 +#vn front +vn 0.000000 0.100000 0.000000 +vn 0.000000 0.100000 0.000000 +vn 0.000000 0.100000 0.000000 +vn 0.000000 0.100000 0.000000 +#vn left +vn -0.100000 0.000000 0.000000 +vn -0.100000 0.000000 0.000000 +vn -0.100000 0.000000 0.000000 +vn -0.100000 0.000000 0.000000 +#vn back +vn 0.000000 -0.100000 0.000000 +vn 0.000000 -0.100000 0.000000 +vn 0.000000 -0.100000 0.000000 +vn 0.000000 -0.100000 0.000000 +#vn top +vn 0.000000 -0.000000 0.100000 +vn 0.000000 -0.000000 0.100000 +vn 0.000000 -0.000000 0.100000 +vn 0.000000 -0.000000 0.100000 +#vn bottom +vn 0.000000 0.000000 0.100000 +vn 0.000000 0.000000 0.100000 +vn 0.000000 0.000000 0.100000 +vn 0.000000 0.000000 0.100000 + +#faces f v{index}/vt{index}/vn{index}.. +#face right +f 1/1/1 2/2/1 4/3/1 +f 4/3/1 2/2/1 3/4/1 +#face front +f 5/5/5 1/6/5 6/7/5 +f 6/7/5 1/6/5 4/8/5 +#face left +f 7/9/9 5/10/9 8/11/9 +f 8/11/9 5/10/9 6/12/9 +#face back +f 2/13/13 7/14/13 3/15/13 +f 3/15/13 7/14/13 8/16/13 +#face top (uncomment this code if you want to see the logo on top too) +#f 7/17/17 2/18/17 1/20/17 5/19/17 +#face bottom +f 6/21/23 4/22/23 3/24/23 8/23/23 + + +o Small Logo Platform +#9 front left +v -50.000000 270.700000 70.700000 +#10 front right +v 50.000000 270.700000 70.700000 +#11 back right +v 50.000000 200.000000 0.000000 +#12 back left +v -50.000000 200.000000 0.000000 +#13 front left 2 +v -50.000000 270.700000 66.700000 +#14 front right2 +v 50.000000 270.700000 66.700000 +#15 back right 3 +v 50.000000 200.000000 -4.000000 +#16 back left2 +v -50.000000 200.000000 -4.000000 + +#vt's +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 + +#vn's +vn 0.000000 0.000000 1.000000 + +#faces f v{index}/vt{index}/vn{index}... +#right +f 10/1/1 11/2/1 15/3/1 14/4/1 +#front +f 9/4/5 10/8/5 14/7/5 13/8/5 +#left +f 12/9/9 9/10/9 13/11/9 16/12/9 +#back +f 11/13/13 12/14/13 16/15/13 15/16/13 +#top +f 12/26/25 11/27/25 10/28/25 9/25/25 +#bottom +f 13/13/23 14/14/23 15/15/23 16/16/23 + From 2fd2e01d825c3bc84d4b0da50f44a87d9828dd84 Mon Sep 17 00:00:00 2001 From: BluefireXD Date: Mon, 7 Jan 2019 02:53:15 +0100 Subject: [PATCH 15/48] Added Anycubic Chiron draft quality cfg --- .../anycubic_chiron_draft.inst.cfg | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 resources/quality/anycubic_chiron/anycubic_chiron_draft.inst.cfg diff --git a/resources/quality/anycubic_chiron/anycubic_chiron_draft.inst.cfg b/resources/quality/anycubic_chiron/anycubic_chiron_draft.inst.cfg new file mode 100644 index 0000000000..881abc1152 --- /dev/null +++ b/resources/quality/anycubic_chiron/anycubic_chiron_draft.inst.cfg @@ -0,0 +1,60 @@ +[general] +version = 4 +name = Draft +definition = anycubic_chiron + +[metadata] +setting_version = 5 +type = quality +quality_type = draft +weight = 0 + +[values] +acceleration_enabled = True +acceleration_print = 1800 +acceleration_travel = 3000 +adhesion_type = skirt +brim_width = 4.0 +cool_fan_full_at_height = 0.5 +cool_fan_speed = 100 +cool_fan_speed_0 = 100 +infill_overlap = 15 +infill_pattern = zigzag +infill_sparse_density = 25 +initial_layer_line_width_factor = 140 +jerk_enabled = True +jerk_print = 8 +jerk_travel = 10 +layer_height = 0.3 +layer_height_0 = 0.3 +material_bed_temperature = 60 +material_diameter = 1.75 +material_print_temperature = 200 +material_print_temperature_layer_0 = 0 +retract_at_layer_change = False +retraction_amount = 6 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 40 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = =speed_print +speed_print = 60 +speed_support = 60 +speed_topbottom = =math.ceil(speed_print * 30 / 60) +speed_travel = 100 +speed_wall = =speed_print +speed_wall_x = =speed_print +support_angle = 60 +support_enable = True +support_interface_enable = True +support_pattern = triangles +support_roof_enable = True +support_type = everywhere +support_use_towers = False +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 From 98e1f66a1e9a9630ac97d111268a0f3c261ebfa5 Mon Sep 17 00:00:00 2001 From: BluefireXD Date: Mon, 7 Jan 2019 02:53:41 +0100 Subject: [PATCH 16/48] Added Anycubic Chiron high quality cfg --- .../anycubic_chiron_high.inst.cfg | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 resources/quality/anycubic_chiron/anycubic_chiron_high.inst.cfg diff --git a/resources/quality/anycubic_chiron/anycubic_chiron_high.inst.cfg b/resources/quality/anycubic_chiron/anycubic_chiron_high.inst.cfg new file mode 100644 index 0000000000..1fa6cc413c --- /dev/null +++ b/resources/quality/anycubic_chiron/anycubic_chiron_high.inst.cfg @@ -0,0 +1,60 @@ +[general] +version = 4 +name = High +definition = anycubic_chiron + +[metadata] +setting_version = 5 +type = quality +quality_type = high +weight = 2 + +[values] +acceleration_enabled = True +acceleration_print = 1800 +acceleration_travel = 3000 +adhesion_type = skirt +brim_width = 4.0 +cool_fan_full_at_height = 0.5 +cool_fan_speed = 100 +cool_fan_speed_0 = 100 +infill_overlap = 15 +infill_pattern = zigzag +infill_sparse_density = 25 +initial_layer_line_width_factor = 140 +jerk_enabled = True +jerk_print = 8 +jerk_travel = 10 +layer_height = 0.1 +layer_height_0 = 0.1 +material_bed_temperature = 60 +material_diameter = 1.75 +material_print_temperature = 200 +material_print_temperature_layer_0 = 0 +retract_at_layer_change = False +retraction_amount = 6 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 40 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = =speed_print +speed_print = 50 +speed_support = 30 +speed_topbottom = =math.ceil(speed_print * 20 / 50) +speed_travel = 50 +speed_wall = =speed_print +speed_wall_x = =speed_print +support_angle = 60 +support_enable = True +support_interface_enable = True +support_pattern = triangles +support_roof_enable = True +support_type = everywhere +support_use_towers = False +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 From efc3e7e8a12c50d2d32d783b23b13adf05fe2691 Mon Sep 17 00:00:00 2001 From: BluefireXD Date: Mon, 7 Jan 2019 02:53:58 +0100 Subject: [PATCH 17/48] Added Anycubic Chiron normal quality cfg --- anycubic_chiron_normal.inst.cfg | 60 +++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 anycubic_chiron_normal.inst.cfg diff --git a/anycubic_chiron_normal.inst.cfg b/anycubic_chiron_normal.inst.cfg new file mode 100644 index 0000000000..e0c583f25c --- /dev/null +++ b/anycubic_chiron_normal.inst.cfg @@ -0,0 +1,60 @@ +[general] +version = 4 +name = Normal +definition = anycubic_chiron + +[metadata] +setting_version = 5 +type = quality +quality_type = normal +weight = 1 + +[values] +acceleration_enabled = True +acceleration_print = 1800 +acceleration_travel = 3000 +adhesion_type = skirt +brim_width = 4.0 +cool_fan_full_at_height = 0.5 +cool_fan_speed = 100 +cool_fan_speed_0 = 100 +infill_overlap = 15 +infill_pattern = zigzag +infill_sparse_density = 25 +initial_layer_line_width_factor = 140 +jerk_enabled = True +jerk_print = 8 +jerk_travel = 10 +layer_height = 0.2 +layer_height_0 = 0.2 +material_bed_temperature = 60 +material_diameter = 1.75 +material_print_temperature = 200 +material_print_temperature_layer_0 = 0 +retract_at_layer_change = False +retraction_amount = 6 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 40 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = =speed_print +speed_print = 50 +speed_support = 30 +speed_topbottom = =math.ceil(speed_print * 20 / 50) +speed_travel = 100 +speed_wall = =speed_print +speed_wall_x = =speed_print +support_angle = 60 +support_enable = True +support_interface_enable = True +support_pattern = triangles +support_roof_enable = True +support_type = everywhere +support_use_towers = False +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 From 6895a7c0f5ea96d36b083fded788a7d50eeca4e4 Mon Sep 17 00:00:00 2001 From: BluefireXD Date: Mon, 7 Jan 2019 02:55:13 +0100 Subject: [PATCH 18/48] Wrong place --- anycubic_chiron_normal.inst.cfg | 60 --------------------------------- 1 file changed, 60 deletions(-) delete mode 100644 anycubic_chiron_normal.inst.cfg diff --git a/anycubic_chiron_normal.inst.cfg b/anycubic_chiron_normal.inst.cfg deleted file mode 100644 index e0c583f25c..0000000000 --- a/anycubic_chiron_normal.inst.cfg +++ /dev/null @@ -1,60 +0,0 @@ -[general] -version = 4 -name = Normal -definition = anycubic_chiron - -[metadata] -setting_version = 5 -type = quality -quality_type = normal -weight = 1 - -[values] -acceleration_enabled = True -acceleration_print = 1800 -acceleration_travel = 3000 -adhesion_type = skirt -brim_width = 4.0 -cool_fan_full_at_height = 0.5 -cool_fan_speed = 100 -cool_fan_speed_0 = 100 -infill_overlap = 15 -infill_pattern = zigzag -infill_sparse_density = 25 -initial_layer_line_width_factor = 140 -jerk_enabled = True -jerk_print = 8 -jerk_travel = 10 -layer_height = 0.2 -layer_height_0 = 0.2 -material_bed_temperature = 60 -material_diameter = 1.75 -material_print_temperature = 200 -material_print_temperature_layer_0 = 0 -retract_at_layer_change = False -retraction_amount = 6 -retraction_hop = 0.075 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True -retraction_min_travel = 1.5 -retraction_speed = 40 -skirt_brim_speed = 40 -skirt_gap = 5 -skirt_line_count = 3 -speed_infill = =speed_print -speed_print = 50 -speed_support = 30 -speed_topbottom = =math.ceil(speed_print * 20 / 50) -speed_travel = 100 -speed_wall = =speed_print -speed_wall_x = =speed_print -support_angle = 60 -support_enable = True -support_interface_enable = True -support_pattern = triangles -support_roof_enable = True -support_type = everywhere -support_use_towers = False -support_xy_distance = 0.7 -top_bottom_thickness = 1.2 -wall_thickness = 1.2 From 1d2e34ca350dc38c835d638900ba70a267c01c70 Mon Sep 17 00:00:00 2001 From: BluefireXD Date: Mon, 7 Jan 2019 02:55:42 +0100 Subject: [PATCH 19/48] Added Anycubic Chiron normal quality cfg --- .../anycubic_chiron_normal.inst.cfg | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 resources/quality/anycubic_chiron/anycubic_chiron_normal.inst.cfg diff --git a/resources/quality/anycubic_chiron/anycubic_chiron_normal.inst.cfg b/resources/quality/anycubic_chiron/anycubic_chiron_normal.inst.cfg new file mode 100644 index 0000000000..e0c583f25c --- /dev/null +++ b/resources/quality/anycubic_chiron/anycubic_chiron_normal.inst.cfg @@ -0,0 +1,60 @@ +[general] +version = 4 +name = Normal +definition = anycubic_chiron + +[metadata] +setting_version = 5 +type = quality +quality_type = normal +weight = 1 + +[values] +acceleration_enabled = True +acceleration_print = 1800 +acceleration_travel = 3000 +adhesion_type = skirt +brim_width = 4.0 +cool_fan_full_at_height = 0.5 +cool_fan_speed = 100 +cool_fan_speed_0 = 100 +infill_overlap = 15 +infill_pattern = zigzag +infill_sparse_density = 25 +initial_layer_line_width_factor = 140 +jerk_enabled = True +jerk_print = 8 +jerk_travel = 10 +layer_height = 0.2 +layer_height_0 = 0.2 +material_bed_temperature = 60 +material_diameter = 1.75 +material_print_temperature = 200 +material_print_temperature_layer_0 = 0 +retract_at_layer_change = False +retraction_amount = 6 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 40 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = =speed_print +speed_print = 50 +speed_support = 30 +speed_topbottom = =math.ceil(speed_print * 20 / 50) +speed_travel = 100 +speed_wall = =speed_print +speed_wall_x = =speed_print +support_angle = 60 +support_enable = True +support_interface_enable = True +support_pattern = triangles +support_roof_enable = True +support_type = everywhere +support_use_towers = False +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 From 3e925a5cc89939fd0fedb3e717f4641e268ff78c Mon Sep 17 00:00:00 2001 From: Patrick G Date: Wed, 9 Jan 2019 22:32:32 +0100 Subject: [PATCH 20/48] Was wrong file. Changed to extruder def --- resources/extruders/anycubic_chiron.def.json | 80 ------------------- .../anycubic_chiron_extruder_0.def.json | 16 ++++ 2 files changed, 16 insertions(+), 80 deletions(-) delete mode 100644 resources/extruders/anycubic_chiron.def.json create mode 100644 resources/extruders/anycubic_chiron_extruder_0.def.json diff --git a/resources/extruders/anycubic_chiron.def.json b/resources/extruders/anycubic_chiron.def.json deleted file mode 100644 index 7035974b66..0000000000 --- a/resources/extruders/anycubic_chiron.def.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "version": 2, - "name": "Anycubic Chiron", - "inherits": "fdmprinter", - "metadata": - { - "visible": true, - "author": "Patrick Glatt", - "manufacturer": "Anycubic", - "category": "Other", - "file_formats": "text/x-gcode", - "icon": "icon_ultimaker2", - "platform": "anycubic_chiron_platform.obj", - "platform_texture": "anycubic-chiron.png", - "has_materials": true, - "preferred_material": "generic_pla", - "has_machine_quality": true, - "quality_definition": "anycubic_chiron", - "preferred_quality_type": "normal", - "machine_extruder_trains": - { - "0": "anycubic_chiron_extruder_0" - }, - "firmware_file": "CHIRON.hex" - }, - - "overrides": - { - "machine_name": - { - "default_value": "Anycubic Chiron" - }, - "machine_heated_bed": - { - "default_value": true - }, - "machine_width": - { - "default_value": 400 - }, - "machine_height": - { - "default_value": 450 - }, - "machine_depth": - { - "default_value": 400 - }, - "machine_center_is_zero": - { - "default_value": false - }, - "gantry_height": - { - "default_value": 35 - }, - "machine_head_with_fans_polygon": - { - "default_value": - [ - [-45, 50], - [-45, -45], - [45, 50], - [45, -45] - ] - }, - "machine_gcode_flavor": - { - "default_value": "RepRap (Marlin/Sprinter)" - }, - "machine_start_gcode": - { - "default_value": "M107 ;Start with the fan off\nG21 ;Set units to millimeters\nG91 ;Change to relative positioning mode for retract filament and nozzle lifting\nG1 F200 E-3 ;Retract 3mm filament for a clean start\nG92 E0 ;Zero the extruded length\nG1 F1000 Z5 ;Lift the nozzle 5mm before homing axes\nG90 ;Absolute positioning\nM82 ;Set extruder to absolute mode too\nG28 X0 Y0 ;First move X/Y to min endstops\nG28 Z0 ;Then move Z to min endstops\nG1 F1000 Z15 ;After homing lift the nozzle 15mm before start printing\n" - }, - "machine_end_gcode": - { - "default_value": "G91 ;Change to relative positioning mode for filament retraction and nozzle lifting\nG1 F200 E-4;Retract the filament a bit before lifting the nozzle\nG1 F1000 Z5;Lift nozzle 5mm\nG90 ;Change to absolute positioning mode to prepare for part rermoval\nG1 X0 Y400 ;Move the print to max y pos for part rermoval\nM104 S0 ; Turn off hotend\nM106 S0 ; Turn off cooling fan\nM140 S0 ; Turn off bed\nM84 ; Disable motors\n" - } - } -} diff --git a/resources/extruders/anycubic_chiron_extruder_0.def.json b/resources/extruders/anycubic_chiron_extruder_0.def.json new file mode 100644 index 0000000000..cc48df08bb --- /dev/null +++ b/resources/extruders/anycubic_chiron_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "id": "anycubic_chiron_extruder_0", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "anycubic_chiron", + "position": "0" + }, + + "overrides": { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} From 592dbfd52c0368c6985ca9474a5e3224304162a0 Mon Sep 17 00:00:00 2001 From: Patrick G Date: Fri, 18 Jan 2019 12:24:24 +0100 Subject: [PATCH 21/48] Removed firmware definition + code refactoring - removed firmware definition because it only exists in my local cura - refactored code --- .../definitions/anycubic_chiron.def.json | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/resources/definitions/anycubic_chiron.def.json b/resources/definitions/anycubic_chiron.def.json index 7035974b66..aa3240a9f8 100644 --- a/resources/definitions/anycubic_chiron.def.json +++ b/resources/definitions/anycubic_chiron.def.json @@ -7,21 +7,20 @@ "visible": true, "author": "Patrick Glatt", "manufacturer": "Anycubic", - "category": "Other", + "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "platform": "anycubic_chiron_platform.obj", - "platform_texture": "anycubic-chiron.png", + "platform_texture": "anycubic-chiron.png", "has_materials": true, - "preferred_material": "generic_pla", + "preferred_material": "generic_pla", "has_machine_quality": true, - "quality_definition": "anycubic_chiron", - "preferred_quality_type": "normal", + "quality_definition": "anycubic_chiron", + "preferred_quality_type": "normal", "machine_extruder_trains": { "0": "anycubic_chiron_extruder_0" - }, - "firmware_file": "CHIRON.hex" + }, }, "overrides": @@ -54,16 +53,16 @@ { "default_value": 35 }, - "machine_head_with_fans_polygon": - { - "default_value": - [ - [-45, 50], - [-45, -45], - [45, 50], - [45, -45] - ] - }, + "machine_head_with_fans_polygon": + { + "default_value": + [ + [-45, 50], + [-45, -45], + [45, 50], + [45, -45] + ] + }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" @@ -75,6 +74,6 @@ "machine_end_gcode": { "default_value": "G91 ;Change to relative positioning mode for filament retraction and nozzle lifting\nG1 F200 E-4;Retract the filament a bit before lifting the nozzle\nG1 F1000 Z5;Lift nozzle 5mm\nG90 ;Change to absolute positioning mode to prepare for part rermoval\nG1 X0 Y400 ;Move the print to max y pos for part rermoval\nM104 S0 ; Turn off hotend\nM106 S0 ; Turn off cooling fan\nM140 S0 ; Turn off bed\nM84 ; Disable motors\n" - } + } } } From 2de93fe79b203c88fa93b073f260c816edbc2464 Mon Sep 17 00:00:00 2001 From: Patrick G Date: Fri, 18 Jan 2019 13:29:14 +0100 Subject: [PATCH 22/48] Added new firmeware definition Added latest anycubic chiron firmeware and created a pull request on https://github.com/Ultimaker/cura-binary-data/pulls FileName: MarlinChiron.hex --- resources/definitions/anycubic_chiron.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/anycubic_chiron.def.json b/resources/definitions/anycubic_chiron.def.json index aa3240a9f8..78191d6cca 100644 --- a/resources/definitions/anycubic_chiron.def.json +++ b/resources/definitions/anycubic_chiron.def.json @@ -21,6 +21,7 @@ { "0": "anycubic_chiron_extruder_0" }, + "firmware_file": "MarlinChiron.hex" }, "overrides": From 80c102f9dead46d5d5cab8ff33fc2817485179df Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 1 Feb 2019 10:45:32 +0100 Subject: [PATCH 23/48] Add {travel_speed} as an alias to {speed_travel}... ...for all those people who still copy paste legacy start&end gcode snippets into Cura. --- plugins/CuraEngineBackend/StartSliceJob.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index d3882a1209..ef97364118 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -323,9 +323,10 @@ class StartSliceJob(Job): value = stack.getProperty(key, "value") result[key] = value Job.yieldThread() - + result["print_bed_temperature"] = result["material_bed_temperature"] # Renamed settings. result["print_temperature"] = result["material_print_temperature"] + result["travel_speed"] = result["speed_travel"] result["time"] = time.strftime("%H:%M:%S") #Some extra settings. result["date"] = time.strftime("%d-%m-%Y") result["day"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][int(time.strftime("%w"))] From 1a01fa0fe9bd1571cdc048b90bd167936dd7637a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 1 Feb 2019 11:00:53 +0100 Subject: [PATCH 24/48] Correct some reference to non-existing travel_speed setting --- resources/definitions/wanhao_d9.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/wanhao_d9.def.json b/resources/definitions/wanhao_d9.def.json index 4e368f970f..39ad139ff8 100644 --- a/resources/definitions/wanhao_d9.def.json +++ b/resources/definitions/wanhao_d9.def.json @@ -23,10 +23,10 @@ "machine_heated_bed": { "default_value": true }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": "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 min endstops\n G28 Z0 ;move Z to min endstops\n G1 Z15.0 F{travel_speed} ;move the platform down 15mm\n G92 E0 ;zero the extruded length\n G1 F200 E6 ;extrude 6 mm of feed stock\n G92 E0 ;zero the extruded length again\n G1 F{travel_speed} \n ;Put printing message on LCD screen\n M117 Printing..." + "default_value": "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 min endstops\n G28 Z0 ;move Z to min endstops\n G1 Z15.0 F{speed_travel} ;move the platform down 15mm\n G92 E0 ;zero the extruded length\n G1 F200 E6 ;extrude 6 mm 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..." }, "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off \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{travel_speed} ;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" + "default_value": "M104 S0 ;extruder heater off \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" }, "support_angle": { "default_value": 60 }, "support_enable": { "default_value": true }, From 7291026bec6bc516e36c5ebbde3591079871ed24 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 22 Feb 2019 15:13:50 +0100 Subject: [PATCH 25/48] Fix material container removal CURA-6237 --- cura/Machines/MaterialManager.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py index 160508e7a6..aa5af9f01d 100644 --- a/cura/Machines/MaterialManager.py +++ b/cura/Machines/MaterialManager.py @@ -537,6 +537,24 @@ class MaterialManager(QObject): return nodes_to_remove = [material_group.root_material_node] + material_group.derived_material_node_list + # FIXME: CURA-6237 + # Sort all nodes with respect to the container ID lengths in the ascending order so the base material container + # will be the last one to remove. Adding this is because in ContainerRegistry.removeContainer(), the container + # will be loaded if it has not been loaded before. If the base material has been removed before this happens, + # it will not be able to find and load the material container, resulting in a crash. + # We may need to consider changing how the signal ContainerRegistry.containerRemoved works: Now it requires + # the container that's being removed, meaning that in order to remove a container, it must be loaded first. + # But it can also be that for ContainerRegistry.containerRemoved, we just need to notify the id, name, and/or + # type of the container that's being removed, thus removing removeContainer()'s dependency on a container being + # loaded first. + nodes_to_remove = sorted(nodes_to_remove, key = lambda x: len(x.getMetaDataEntry("id", "")), reverse = True) + # Try to load all containers first. If there is any faulty ones, they will be put into the faulty container + # list, so removeContainer() can ignore those ones. + for node in nodes_to_remove: + container_id = node.getMetaDataEntry("id", "") + results = self._container_registry.findContainers(id = container_id) + if not results: + self._container_registry.addWrongContainerId(container_id) for node in nodes_to_remove: self._container_registry.removeContainer(node.getMetaDataEntry("id", "")) From 05e889621ecaba1eec47216fb5393fd7cfb65ed0 Mon Sep 17 00:00:00 2001 From: Andrew Finkle Date: Wed, 27 Feb 2019 10:29:28 -0500 Subject: [PATCH 26/48] Create structur3d_discov3ry1_complete_um2plus.json --- ...tructur3d_discov3ry1_complete_um2plus.json | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 resources/definitions/structur3d_discov3ry1_complete_um2plus.json diff --git a/resources/definitions/structur3d_discov3ry1_complete_um2plus.json b/resources/definitions/structur3d_discov3ry1_complete_um2plus.json new file mode 100644 index 0000000000..28fd2b71f9 --- /dev/null +++ b/resources/definitions/structur3d_discov3ry1_complete_um2plus.json @@ -0,0 +1,82 @@ +{ + "version": 2, + "name": "Ultimaker 2+", + "inherits": "ultimaker2", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker B.V.", + "weight": 1, + "file_formats": "text/x-gcode", + "platform": "ultimaker2_platform.obj", + "platform_texture": "Ultimaker2Plusbackplate.png", + "preferred_variant_name": "0.4 mm", + "has_variants": true, + "has_materials": true, + "has_machine_materials": true, + "has_machine_quality": true, + "first_start_actions": [], + "supported_actions": [], + "machine_extruder_trains": + { + "0": "ultimaker2_plus_extruder_0" + }, + "firmware_file": "MarlinUltimaker2plus.hex" + }, + + "overrides": { + "machine_name": { "default_value": "Ultimaker 2+" }, + "speed_infill": { + "value": "speed_print" + }, + "speed_wall_x": { + "value": "speed_wall" + }, + "layer_height_0": { + "value": "round(machine_nozzle_size / 1.5, 2)" + }, + "line_width": { + "value": "round(machine_nozzle_size * 0.875, 2)" + }, + "speed_layer_0": { + "default_value": 20 + }, + "speed_support": { + "value": "speed_wall_0" + }, + "machine_height": { + "default_value": 205 + }, + "machine_show_variants": { + "default_value": true + }, + "gantry_height": { + "default_value": 52 + }, + "machine_nozzle_head_distance": { + "default_value": 5 + }, + "machine_nozzle_expansion_angle": { + "default_value": 45 + }, + "machine_heat_zone_length": { + "default_value": 20 + }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [ -44, 14 ], + [ -44, -34 ], + [ 64, 14 ], + [ 64, -34 ] + ] + }, + "machine_disallowed_areas": { + "default_value": [ + [[-115, 112.5], [ -78, 112.5], [ -80, 102.5], [-115, 102.5]], + [[ 115, 112.5], [ 115, 102.5], [ 105, 102.5], [ 103, 112.5]], + [[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]], + [[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]] + ] + } + } +} From 3f765a9ca27ab3b6f9dc2ab38e55ecf54a814838 Mon Sep 17 00:00:00 2001 From: Andrew Finkle Date: Wed, 27 Feb 2019 10:29:58 -0500 Subject: [PATCH 27/48] Revert "Create structur3d_discov3ry1_complete_um2plus.json" This reverts commit 05e889621ecaba1eec47216fb5393fd7cfb65ed0. --- ...tructur3d_discov3ry1_complete_um2plus.json | 82 ------------------- 1 file changed, 82 deletions(-) delete mode 100644 resources/definitions/structur3d_discov3ry1_complete_um2plus.json diff --git a/resources/definitions/structur3d_discov3ry1_complete_um2plus.json b/resources/definitions/structur3d_discov3ry1_complete_um2plus.json deleted file mode 100644 index 28fd2b71f9..0000000000 --- a/resources/definitions/structur3d_discov3ry1_complete_um2plus.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "version": 2, - "name": "Ultimaker 2+", - "inherits": "ultimaker2", - "metadata": { - "author": "Ultimaker", - "manufacturer": "Ultimaker B.V.", - "weight": 1, - "file_formats": "text/x-gcode", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "preferred_variant_name": "0.4 mm", - "has_variants": true, - "has_materials": true, - "has_machine_materials": true, - "has_machine_quality": true, - "first_start_actions": [], - "supported_actions": [], - "machine_extruder_trains": - { - "0": "ultimaker2_plus_extruder_0" - }, - "firmware_file": "MarlinUltimaker2plus.hex" - }, - - "overrides": { - "machine_name": { "default_value": "Ultimaker 2+" }, - "speed_infill": { - "value": "speed_print" - }, - "speed_wall_x": { - "value": "speed_wall" - }, - "layer_height_0": { - "value": "round(machine_nozzle_size / 1.5, 2)" - }, - "line_width": { - "value": "round(machine_nozzle_size * 0.875, 2)" - }, - "speed_layer_0": { - "default_value": 20 - }, - "speed_support": { - "value": "speed_wall_0" - }, - "machine_height": { - "default_value": 205 - }, - "machine_show_variants": { - "default_value": true - }, - "gantry_height": { - "default_value": 52 - }, - "machine_nozzle_head_distance": { - "default_value": 5 - }, - "machine_nozzle_expansion_angle": { - "default_value": 45 - }, - "machine_heat_zone_length": { - "default_value": 20 - }, - "machine_head_with_fans_polygon": - { - "default_value": [ - [ -44, 14 ], - [ -44, -34 ], - [ 64, 14 ], - [ 64, -34 ] - ] - }, - "machine_disallowed_areas": { - "default_value": [ - [[-115, 112.5], [ -78, 112.5], [ -80, 102.5], [-115, 102.5]], - [[ 115, 112.5], [ 115, 102.5], [ 105, 102.5], [ 103, 112.5]], - [[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]], - [[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]] - ] - } - } -} From 5581cd5c2c09b2bd91f262a135b1197726738dfa Mon Sep 17 00:00:00 2001 From: Andrew Finkle Date: Wed, 27 Feb 2019 11:55:25 -0500 Subject: [PATCH 28/48] Added definition, extruder, material, and variants for Discov3ry Complete --- ...tur3d_discov3ry1_complete_um2plus.def.json | 142 ++++++++++++++++++ ...v3ry1_complete_um2plus_extruder_0.def.json | 16 ++ ..._discov3ry1_complete_um2plus_0.20.inst.cfg | 14 ++ ..._discov3ry1_complete_um2plus_0.25.inst.cfg | 14 ++ ..._discov3ry1_complete_um2plus_0.41.inst.cfg | 14 ++ ..._discov3ry1_complete_um2plus_0.58.inst.cfg | 14 ++ ..._discov3ry1_complete_um2plus_0.84.inst.cfg | 14 ++ ..._discov3ry1_complete_um2plus_1.19.inst.cfg | 14 ++ ..._discov3ry1_complete_um2plus_1.60.inst.cfg | 14 ++ 9 files changed, 256 insertions(+) create mode 100644 resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json create mode 100644 resources/extruders/structur3d_discov3ry1_complete_um2plus_extruder_0.def.json create mode 100644 resources/variants/structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg create mode 100644 resources/variants/structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg create mode 100644 resources/variants/structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg create mode 100644 resources/variants/structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg create mode 100644 resources/variants/structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg create mode 100644 resources/variants/structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg create mode 100644 resources/variants/structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg diff --git a/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json b/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json new file mode 100644 index 0000000000..8e1f2ea03b --- /dev/null +++ b/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json @@ -0,0 +1,142 @@ +{ + "version": 2, + + "name": "Discov3ry Complete (Ultimaker 2+)", + + "inherits": "fdmprinter", + + "metadata": { + "author": "Andrew Finkle, CTO", + + "manufacturer": "Structur3d.io", + + "visible": true, + + "weight": 1, + + "file_formats": "text/x-gcode", + + "platform": "ultimaker2_platform.obj", + + "platform_texture": "Ultimaker2Plusbackplate.png", + + "platform_offset": [0, 0, 0], + + "has_materials": true, + + "has_variants": true, + + "variants_name": "Print core", + + "preferred_variant_name": "0.84mm (Green)", + + "has_machine_materials": true, + + "preferred_material": "structur3d_dap100silicone", + + "has_variant_materials": false, + + "has_machine_quality": false, + + "preferred_quality_type": "extra_fast", + + "first_start_actions": [], + + "supported_actions": [], + + "machine_extruder_trains": + { + "0": "structur3d_discov3ry1_complete_um2plus_extruder_0" + }, + "firmware_file": "MarlinUltimaker2plus.hex" + + }, + + "overrides": { + "machine_name": { "default_value": "Discov3ry Complete (Ultimaker 2+)" }, + "speed_infill": { + "value": "speed_print" + }, + "infill_sparse_density": { + "value": 100 + }, + "retraction_hop_enabled": { + "value": true + }, + "adhesion_type": { + "default_value": "skirt" + }, + "skirt_brim_minimal_length": { + "value": 1500 + }, + "speed_print": { + "value": 15 + }, + "speed_wall_x": { + "value": "speed_wall" + }, + "layer_height_0": { + "value": "round(machine_nozzle_size / 1.5, 2)" + }, + "line_width": { + "value": "round(machine_nozzle_size * 0.875, 2)" + }, + "speed_layer_0": { + "default_value": 10 + }, + "speed_support": { + "value": "speed_wall_0" + }, + "machine_height": { + "default_value": 205 + }, + "machine_width": { + "default_value": 205 + }, + "machine_depth": { + "default_value": 205 + }, + "machine_show_variants": { + "default_value": true + }, + "gantry_height": { + "default_value": 52 + }, + "machine_nozzle_head_distance": { + "default_value": 5 + }, + "machine_nozzle_expansion_angle": { + "default_value": 45 + }, + "machine_heat_zone_length": { + "default_value": 20 + }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [ -44, 14 ], + [ -44, -34 ], + [ 64, 14 ], + [ 64, -34 ] + ] + }, + "machine_disallowed_areas": { + "default_value": [ + [[-115, 112.5], [ -78, 112.5], [ -80, 102.5], [-115, 102.5]], + [[ 115, 112.5], [ 115, 102.5], [ 105, 102.5], [ 103, 112.5]], + [[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]], + [[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]] + ] + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "\n;Updated Firmware (.hex and Marlin .ino) for \n;Ultimaker 2+ with Discov3ry Extruder available at: \n;https://github.com/Structur3d/UM2.1Discov3ry-Firmware-beta \n;**Learn more at https://www.structur3d.io** \n \nM104 S{material_print_temperature} ;Start heating extruder \nM140 S{material_bed_temperature} ;Start heating bed \nG21 ;metric values \nG90 ;absolute positioning \nM82 ;set extruder to absolute mode \nM107 ;start with the fan off \nM302 ;allow cold extrusion \nM92 E2589 ;set extruder EEPROM steps/mm for paste \nG28 Z0 ;move Z to bottom endstops \nG28 X0 Y0 ;move X/Y to endstops \nG1 X15 Y0 F4000 ;move X/Y to front of printer \nG1 Z15.0 F9000 ;move the platform to 15mm \nG92 E0 ;zero the extruded length \nG1 F200 E10 ;extrude 10 mm 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) \nM92 E282 ;reset extruder EEPROM steps/mm for plastic filament \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" + } + + } +} diff --git a/resources/extruders/structur3d_discov3ry1_complete_um2plus_extruder_0.def.json b/resources/extruders/structur3d_discov3ry1_complete_um2plus_extruder_0.def.json new file mode 100644 index 0000000000..8436dc0a94 --- /dev/null +++ b/resources/extruders/structur3d_discov3ry1_complete_um2plus_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "id": "structur3d_discov3ry1_complete_um2plus_extruder_0", + "version": 2, + "name": "Discov3ry Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "structur3d_discov3ry1_complete_um2plus", + "position": "0" + }, + + "overrides": { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.84 }, + "material_diameter": { "default_value": 3.175 } + } +} diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg new file mode 100644 index 0000000000..cbafbcbbc7 --- /dev/null +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg @@ -0,0 +1,14 @@ +[general] +name = 0.20mm (Clear) +version = 4 +definition = structur3d_discov3ry1_complete_um2plus + +[metadata] +setting_version = 5 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_id = 0.20mm (Clear) +machine_nozzle_size = 0.20 +machine_nozzle_tip_outer_diameter = 0.30 diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg new file mode 100644 index 0000000000..54ed35afff --- /dev/null +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg @@ -0,0 +1,14 @@ +[general] +name = 0.25mm (Red) +version = 4 +definition = structur3d_discov3ry1_complete_um2plus + +[metadata] +setting_version = 5 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_id = 0.25mm (Red) +machine_nozzle_size = 0.25 +machine_nozzle_tip_outer_diameter = 0.35 diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg new file mode 100644 index 0000000000..c5f071240e --- /dev/null +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg @@ -0,0 +1,14 @@ +[general] +name = 0.41mm (Blue) +version = 4 +definition = structur3d_discov3ry1_complete_um2plus + +[metadata] +setting_version = 5 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_id = 0.41mm (Blue) +machine_nozzle_size = 0.41 +machine_nozzle_tip_outer_diameter = 0.51 \ No newline at end of file diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg new file mode 100644 index 0000000000..0dcab9e9e9 --- /dev/null +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg @@ -0,0 +1,14 @@ +[general] +name = 0.58mm (Pink) +version = 4 +definition = structur3d_discov3ry1_complete_um2plus + +[metadata] +setting_version = 5 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_id = 0.58mm (Pink) +machine_nozzle_size = 0.58 +machine_nozzle_tip_outer_diameter = 0.68 \ No newline at end of file diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg new file mode 100644 index 0000000000..b011364fda --- /dev/null +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg @@ -0,0 +1,14 @@ +[general] +name = 0.84mm (Green) +version = 4 +definition = structur3d_discov3ry1_complete_um2plus + +[metadata] +setting_version = 5 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_id = 0.84mm (Green) +machine_nozzle_size = 0.84 +machine_nozzle_tip_outer_diameter = 0.94 \ No newline at end of file diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg new file mode 100644 index 0000000000..84453c9b0d --- /dev/null +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg @@ -0,0 +1,14 @@ +[general] +name = 1.19mm (Grey) +version = 4 +definition = structur3d_discov3ry1_complete_um2plus + +[metadata] +setting_version = 5 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_id = 1.19mm (Grey) +machine_nozzle_size = 1.19 +machine_nozzle_tip_outer_diameter = 1.29 \ No newline at end of file diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg new file mode 100644 index 0000000000..ef0fa455af --- /dev/null +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg @@ -0,0 +1,14 @@ +[general] +name = 1.60mm (Olive) +version = 4 +definition = structur3d_discov3ry1_complete_um2plus + +[metadata] +setting_version = 5 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_id = 1.60mm (Olive) +machine_nozzle_size = 1.60 +machine_nozzle_tip_outer_diameter = 1.70 \ No newline at end of file From 91cceea6e0fe5220854db469b3730c6d72f3c36b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 28 Feb 2019 16:17:34 +0100 Subject: [PATCH 29/48] Fix the situation where an upgraded single extrusion machine and loading project caused issues If the upgraded single extrusion machine was never activated, it would not have it's extruders set. CURA-6252 --- cura/Settings/ExtruderManager.py | 4 ++-- cura/Settings/MachineManager.py | 2 +- plugins/3MFReader/ThreeMFWorkspaceReader.py | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 8fa0172305..4f1a2c5a4e 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -341,7 +341,7 @@ class ExtruderManager(QObject): extruder_train.setNextStack(global_stack) extruders_changed = True - self._fixSingleExtrusionMachineExtruderDefinition(global_stack) + self.fixSingleExtrusionMachineExtruderDefinition(global_stack) if extruders_changed: self.extrudersChanged.emit(global_stack_id) self.setActiveExtruderIndex(0) @@ -349,7 +349,7 @@ class ExtruderManager(QObject): # After 3.4, all single-extrusion machines have their own extruder definition files instead of reusing # "fdmextruder". We need to check a machine here so its extruder definition is correct according to this. - def _fixSingleExtrusionMachineExtruderDefinition(self, global_stack: "GlobalStack") -> None: + def fixSingleExtrusionMachineExtruderDefinition(self, global_stack: "GlobalStack") -> None: container_registry = ContainerRegistry.getInstance() expected_extruder_definition_0_id = global_stack.getMetaDataEntry("machine_extruder_trains")["0"] extruder_stack_0 = global_stack.extruders.get("0") diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index bb0c0c00ed..bb83a5f25a 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -365,7 +365,7 @@ class MachineManager(QObject): # Make sure that the default machine actions for this machine have been added self._application.getMachineActionManager().addDefaultMachineActions(global_stack) - ExtruderManager.getInstance()._fixSingleExtrusionMachineExtruderDefinition(global_stack) + ExtruderManager.getInstance().fixSingleExtrusionMachineExtruderDefinition(global_stack) if not global_stack.isValid(): # Mark global stack as invalid ConfigurationErrorMessage.getInstance().addFaultyContainers(global_stack.getId()) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index bf190f7e39..38652361a5 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -26,6 +26,7 @@ from UM.Preferences import Preferences from cura.Machines.VariantType import VariantType from cura.Settings.CuraStackBuilder import CuraStackBuilder +from cura.Settings.ExtruderManager import ExtruderManager from cura.Settings.ExtruderStack import ExtruderStack from cura.Settings.GlobalStack import GlobalStack from cura.Settings.CuraContainerStack import _ContainerIndexes @@ -781,6 +782,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if not quality_changes_info.extruder_info_dict: container_info = ContainerInfo(None, None, None) quality_changes_info.extruder_info_dict["0"] = container_info + # If the global stack we're "targeting" has never been active, but was updated from Cura 3.4, + # it might not have it's extruders set properly. + if not global_stack.extruders: + ExtruderManager.getInstance().fixSingleExtrusionMachineExtruderDefinition(global_stack) extruder_stack = global_stack.extruders["0"] container = quality_manager._createQualityChanges(quality_changes_quality_type, quality_changes_name, From cf9a1c0248f071283fc4958acfcec5113ade9223 Mon Sep 17 00:00:00 2001 From: Ian Date: Fri, 1 Mar 2019 10:46:27 +0100 Subject: [PATCH 30/48] Sort UM imports alphabetically for easy scanning Contributes to CL-1274 --- .../UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py | 2 ++ plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py | 8 ++++---- plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py | 9 +++++---- plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py | 8 +++++--- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index 7b5add276a..86c7e1cab6 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -12,8 +12,10 @@ from UM.Backend.Backend import BackendState from UM.FileHandler.FileHandler import FileHandler from UM.Logger import Logger from UM.Message import Message +from UM.PluginRegistry import PluginRegistry from UM.Qt.Duration import Duration, DurationFormat from UM.Scene.SceneNode import SceneNode + from cura.CuraApplication import CuraApplication from cura.PrinterOutput.NetworkedPrinterOutputDevice import AuthState, NetworkedPrinterOutputDevice from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py index 4bbb7ddb5f..07c968c960 100644 --- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py @@ -10,13 +10,13 @@ import os from UM.FileHandler.FileHandler import FileHandler from UM.FileHandler.WriteFileJob import WriteFileJob # To call the file writer asynchronously. -from UM.Logger import Logger -from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog -from UM.Qt.Duration import Duration, DurationFormat - +from UM.Logger import Logger from UM.Message import Message +from UM.PluginRegistry import PluginRegistry +from UM.Qt.Duration import Duration, DurationFormat from UM.Scene.SceneNode import SceneNode # For typing. +from UM.Settings.ContainerRegistry import ContainerRegistry from cura.CuraApplication import CuraApplication from cura.PrinterOutput.ConfigurationModel import ConfigurationModel diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py index 3ce0460d6b..d6e71fd56f 100644 --- a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py @@ -1,7 +1,5 @@ from typing import List, Optional -from UM.FileHandler.FileHandler import FileHandler -from UM.Scene.SceneNode import SceneNode from cura.CuraApplication import CuraApplication from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice, AuthState from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel @@ -12,10 +10,13 @@ from cura.PrinterOutputDevice import ConnectionType from cura.Settings.ContainerManager import ContainerManager from cura.Settings.ExtruderManager import ExtruderManager -from UM.Logger import Logger -from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.FileHandler.FileHandler import FileHandler from UM.i18n import i18nCatalog +from UM.Logger import Logger from UM.Message import Message +from UM.PluginRegistry import PluginRegistry +from UM.Scene.SceneNode import SceneNode +from UM.Settings.ContainerRegistry import ContainerRegistry from PyQt5.QtNetwork import QNetworkRequest from PyQt5.QtCore import QTimer, QUrl diff --git a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py index 723bcf2b7c..aedd29d247 100644 --- a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py @@ -14,12 +14,14 @@ from PyQt5.QtGui import QDesktopServices from cura.CuraApplication import CuraApplication from cura.PrinterOutputDevice import ConnectionType from cura.Settings.GlobalStack import GlobalStack # typing -from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin + +from UM.i18n import i18nCatalog from UM.Logger import Logger +from UM.Message import Message +from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin +from UM.PluginRegistry import PluginRegistry from UM.Signal import Signal, signalemitter from UM.Version import Version -from UM.Message import Message -from UM.i18n import i18nCatalog from . import ClusterUM3OutputDevice, LegacyUM3OutputDevice from .Cloud.CloudOutputDeviceManager import CloudOutputDeviceManager From cac8c85489a5b941ce939523c6ccf6d6dfb53f11 Mon Sep 17 00:00:00 2001 From: Ian Date: Fri, 1 Mar 2019 10:46:41 +0100 Subject: [PATCH 31/48] Don't use __file__ Contributes to CL-1274 --- .../src/Cloud/CloudOutputDevice.py | 6 ++++-- .../UM3NetworkPrinting/src/ClusterUM3OutputDevice.py | 10 ++++++++-- .../UM3NetworkPrinting/src/LegacyUM3OutputDevice.py | 5 ++++- .../UM3NetworkPrinting/src/UM3OutputDevicePlugin.py | 12 ++++++++---- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index 86c7e1cab6..4d5673effe 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -84,8 +84,10 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): self._account = api_client.account # We use the Cura Connect monitor tab to get most functionality right away. - self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), - "../../resources/qml/MonitorStage.qml") + self._monitor_view_qml_path = os.path.join( + PluginRegistry.getPluginDirectory(), + "UM3NetworkPrinting", "resources", "qml", "MonitorStage.qml" + ) # Trigger the printersChanged signal when the private signal is triggered. self.printersChanged.connect(self._clusterPrintersChanged) diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py index 07c968c960..919788f10e 100644 --- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py @@ -65,7 +65,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._print_jobs = [] # type: List[UM3PrintJobOutputModel] self._received_print_jobs = False # type: bool - self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../resources/qml/MonitorStage.qml") + self._monitor_view_qml_path = os.path.join( + PluginRegistry.getPluginDirectory(), + "UM3NetworkPrinting", "resources", "qml", "MonitorStage.qml" + ) # Trigger the printersChanged signal when the private signal is triggered self.printersChanged.connect(self._clusterPrintersChanged) @@ -126,7 +129,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def _spawnPrinterSelectionDialog(self): if self._printer_selection_dialog is None: - path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../resources/qml/PrintWindow.qml") + path = os.path.join( + PluginRegistry.getPluginDirectory(), + "UM3NetworkPrinting", "resources", "qml", "PrintWindow.qml" + ) self._printer_selection_dialog = self._application.createQmlComponent(path, {"OutputDevice": self}) if self._printer_selection_dialog is not None: self._printer_selection_dialog.show() diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py index d6e71fd56f..68a4e7d42c 100644 --- a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py @@ -77,7 +77,10 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.setIconName("print") - self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../resources/qml/MonitorItem.qml") + self._monitor_view_qml_path = os.path.join( + PluginRegistry.getPluginDirectory(), + "UM3NetworkPrinting", "resources", "qml", "MonitorItem.qml" + ) self._output_controller = LegacyUM3PrinterOutputController(self) diff --git a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py index aedd29d247..10476d55b4 100644 --- a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py @@ -457,8 +457,10 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._start_cloud_flow_message = Message( text = i18n_catalog.i18nc("@info:status", "Send and monitor print jobs from anywhere using your Ultimaker account."), lifetime = 0, - image_source = QUrl.fromLocalFile(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", - "resources", "svg", "cloud-flow-start.svg")), + image_source = QUrl.fromLocalFile(os.path.join( + PluginRegistry.getPluginDirectory(), + "UM3NetworkPrinting", "resources", "svg", "cloud-flow-start.svg" + )), image_caption = i18n_catalog.i18nc("@info:status", "Connect to Ultimaker Cloud"), option_text = i18n_catalog.i18nc("@action", "Don't ask me again for this printer."), option_state = False @@ -479,8 +481,10 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._cloud_flow_complete_message = Message( text = i18n_catalog.i18nc("@info:status", "You can now send and monitor print jobs from anywhere using your Ultimaker account."), lifetime = 30, - image_source = QUrl.fromLocalFile(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", - "resources", "svg", "cloud-flow-completed.svg")), + image_source = QUrl.fromLocalFile(os.path.join( + PluginRegistry.getPluginDirectory(), + "UM3NetworkPrinting", "resources", "svg", "cloud-flow-completed.svg" + )), image_caption = i18n_catalog.i18nc("@info:status", "Connected!") ) # Don't show the review connection link if we're not on the local network From 2af3ae8efba15b6549e21c70f7026ab0eb894c94 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 1 Mar 2019 10:53:55 +0100 Subject: [PATCH 32/48] Ensure that the materials get removed in order If we remove the materials in order, it doesn't cause any issues. This is probably because loading the base profile causes the others to be properly instantiated (and subsequently deleted) CURA-6237 --- cura/Machines/MaterialManager.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py index aa5af9f01d..ae6dbbd9bd 100644 --- a/cura/Machines/MaterialManager.py +++ b/cura/Machines/MaterialManager.py @@ -537,17 +537,9 @@ class MaterialManager(QObject): return nodes_to_remove = [material_group.root_material_node] + material_group.derived_material_node_list - # FIXME: CURA-6237 # Sort all nodes with respect to the container ID lengths in the ascending order so the base material container - # will be the last one to remove. Adding this is because in ContainerRegistry.removeContainer(), the container - # will be loaded if it has not been loaded before. If the base material has been removed before this happens, - # it will not be able to find and load the material container, resulting in a crash. - # We may need to consider changing how the signal ContainerRegistry.containerRemoved works: Now it requires - # the container that's being removed, meaning that in order to remove a container, it must be loaded first. - # But it can also be that for ContainerRegistry.containerRemoved, we just need to notify the id, name, and/or - # type of the container that's being removed, thus removing removeContainer()'s dependency on a container being - # loaded first. - nodes_to_remove = sorted(nodes_to_remove, key = lambda x: len(x.getMetaDataEntry("id", "")), reverse = True) + # will be the first one to be removed. We need to do this to ensure that all containers get loaded & deleted. + nodes_to_remove = sorted(nodes_to_remove, key = lambda x: len(x.getMetaDataEntry("id", ""))) # Try to load all containers first. If there is any faulty ones, they will be put into the faulty container # list, so removeContainer() can ignore those ones. for node in nodes_to_remove: From 180156da78316f6e1ae5f4ad6ff031b05eb07407 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Mar 2019 11:45:08 +0100 Subject: [PATCH 33/48] Correct whitespace Change tabs to spaces according to our style standards. And remove a bunch of unnecessary white lines to make it easier to read. --- ...tur3d_discov3ry1_complete_um2plus.def.json | 51 +++++-------------- 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json b/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json index 8e1f2ea03b..2875b949be 100644 --- a/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json +++ b/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json @@ -1,55 +1,32 @@ { "version": 2, - "name": "Discov3ry Complete (Ultimaker 2+)", - - "inherits": "fdmprinter", - + "inherits": "fdmprinter", "metadata": { "author": "Andrew Finkle, CTO", - - "manufacturer": "Structur3d.io", - - "visible": true, - - "weight": 1, - + "manufacturer": "Structur3d.io", + "visible": true, + "weight": 1, "file_formats": "text/x-gcode", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "platform_offset": [0, 0, 0], - "has_materials": true, - - "has_variants": true, - + "has_variants": true, "variants_name": "Print core", - "preferred_variant_name": "0.84mm (Green)", - "has_machine_materials": true, - - "preferred_material": "structur3d_dap100silicone", - + "preferred_material": "structur3d_dap100silicone", "has_variant_materials": false, - "has_machine_quality": false, - - "preferred_quality_type": "extra_fast", - - "first_start_actions": [], - - "supported_actions": [], - - "machine_extruder_trains": + "preferred_quality_type": "extra_fast", + "first_start_actions": [], + "supported_actions": [], + "machine_extruder_trains": { "0": "structur3d_discov3ry1_complete_um2plus_extruder_0" }, - "firmware_file": "MarlinUltimaker2plus.hex" - + "firmware_file": "MarlinUltimaker2plus.hex" }, "overrides": { @@ -57,7 +34,7 @@ "speed_infill": { "value": "speed_print" }, - "infill_sparse_density": { + "infill_sparse_density": { "value": 100 }, "retraction_hop_enabled": { @@ -90,7 +67,7 @@ "machine_height": { "default_value": 205 }, - "machine_width": { + "machine_width": { "default_value": 205 }, "machine_depth": { @@ -128,7 +105,7 @@ [[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]] ] }, - "machine_gcode_flavor": { + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { From a1e0ddd9df3062dd03984c0892642cc6268bb66e Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 4 Mar 2019 10:19:33 +0100 Subject: [PATCH 34/48] Don't hardcode plugin directory Contributes to CL-1274 --- plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py | 5 +++-- plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py | 5 +++-- plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py | 5 +++-- plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py | 8 ++++---- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index 4d5673effe..6d19044dd7 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -23,6 +23,7 @@ from cura.PrinterOutputDevice import ConnectionType from .CloudOutputController import CloudOutputController from ..MeshFormatHandler import MeshFormatHandler +from ..UM3OutputDevicePlugin import UM3OutputDevicePlugin from ..UM3PrintJobOutputModel import UM3PrintJobOutputModel from .CloudProgressMessage import CloudProgressMessage from .CloudApiClient import CloudApiClient @@ -85,8 +86,8 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): # We use the Cura Connect monitor tab to get most functionality right away. self._monitor_view_qml_path = os.path.join( - PluginRegistry.getPluginDirectory(), - "UM3NetworkPrinting", "resources", "qml", "MonitorStage.qml" + PluginRegistry.getInstance().getPluginPath(UM3OutputDevicePlugin().getPluginId()), + "resources", "qml", "MonitorStage.qml" ) # Trigger the printersChanged signal when the private signal is triggered. diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py index 919788f10e..7ed81391a9 100644 --- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py @@ -32,6 +32,7 @@ from .ConfigurationChangeModel import ConfigurationChangeModel from .MeshFormatHandler import MeshFormatHandler from .SendMaterialJob import SendMaterialJob from .UM3PrintJobOutputModel import UM3PrintJobOutputModel +from .UM3OutputDevicePlugin import UM3OutputDevicePlugin from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from PyQt5.QtGui import QDesktopServices, QImage @@ -66,8 +67,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._received_print_jobs = False # type: bool self._monitor_view_qml_path = os.path.join( - PluginRegistry.getPluginDirectory(), - "UM3NetworkPrinting", "resources", "qml", "MonitorStage.qml" + PluginRegistry.getInstance().getPluginPath(UM3OutputDevicePlugin().getPluginId()), + "resources", "qml", "MonitorStage.qml" ) # Trigger the printersChanged signal when the private signal is triggered diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py index 68a4e7d42c..6bdfbbf8c8 100644 --- a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py @@ -23,6 +23,7 @@ from PyQt5.QtCore import QTimer, QUrl from PyQt5.QtWidgets import QMessageBox from .LegacyUM3PrinterOutputController import LegacyUM3PrinterOutputController +from .UM3OutputDevicePlugin import UM3OutputDevicePlugin from time import time @@ -78,8 +79,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.setIconName("print") self._monitor_view_qml_path = os.path.join( - PluginRegistry.getPluginDirectory(), - "UM3NetworkPrinting", "resources", "qml", "MonitorItem.qml" + PluginRegistry.getInstance().getPluginPath(UM3OutputDevicePlugin().getPluginId()), + "resources", "qml", "MonitorStage.qml" ) self._output_controller = LegacyUM3PrinterOutputController(self) diff --git a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py index 10476d55b4..6132c0bc42 100644 --- a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py @@ -458,8 +458,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): text = i18n_catalog.i18nc("@info:status", "Send and monitor print jobs from anywhere using your Ultimaker account."), lifetime = 0, image_source = QUrl.fromLocalFile(os.path.join( - PluginRegistry.getPluginDirectory(), - "UM3NetworkPrinting", "resources", "svg", "cloud-flow-start.svg" + PluginRegistry.getInstance().getPluginPath(self.getPluginId()), + "resources", "svg", "cloud-flow-start.svg" )), image_caption = i18n_catalog.i18nc("@info:status", "Connect to Ultimaker Cloud"), option_text = i18n_catalog.i18nc("@action", "Don't ask me again for this printer."), @@ -482,8 +482,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): text = i18n_catalog.i18nc("@info:status", "You can now send and monitor print jobs from anywhere using your Ultimaker account."), lifetime = 30, image_source = QUrl.fromLocalFile(os.path.join( - PluginRegistry.getPluginDirectory(), - "UM3NetworkPrinting", "resources", "svg", "cloud-flow-completed.svg" + PluginRegistry.getInstance().getPluginPath(self.getPluginId()), + "resources", "svg", "cloud-flow-completed.svg" )), image_caption = i18n_catalog.i18nc("@info:status", "Connected!") ) From c8580cf4177334d1849a563fa9dcd9bc32b8c096 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 4 Mar 2019 11:27:52 +0100 Subject: [PATCH 35/48] Prevent circular dependencies Contributes to CL-1274 --- plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py | 3 +-- plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py | 3 +-- plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index 6d19044dd7..395741391a 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -23,7 +23,6 @@ from cura.PrinterOutputDevice import ConnectionType from .CloudOutputController import CloudOutputController from ..MeshFormatHandler import MeshFormatHandler -from ..UM3OutputDevicePlugin import UM3OutputDevicePlugin from ..UM3PrintJobOutputModel import UM3PrintJobOutputModel from .CloudProgressMessage import CloudProgressMessage from .CloudApiClient import CloudApiClient @@ -86,7 +85,7 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): # We use the Cura Connect monitor tab to get most functionality right away. self._monitor_view_qml_path = os.path.join( - PluginRegistry.getInstance().getPluginPath(UM3OutputDevicePlugin().getPluginId()), + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), "resources", "qml", "MonitorStage.qml" ) diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py index 7ed81391a9..97987cee9d 100644 --- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py @@ -32,7 +32,6 @@ from .ConfigurationChangeModel import ConfigurationChangeModel from .MeshFormatHandler import MeshFormatHandler from .SendMaterialJob import SendMaterialJob from .UM3PrintJobOutputModel import UM3PrintJobOutputModel -from .UM3OutputDevicePlugin import UM3OutputDevicePlugin from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from PyQt5.QtGui import QDesktopServices, QImage @@ -67,7 +66,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._received_print_jobs = False # type: bool self._monitor_view_qml_path = os.path.join( - PluginRegistry.getInstance().getPluginPath(UM3OutputDevicePlugin().getPluginId()), + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), "resources", "qml", "MonitorStage.qml" ) diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py index 6bdfbbf8c8..dd100d7433 100644 --- a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py @@ -23,7 +23,6 @@ from PyQt5.QtCore import QTimer, QUrl from PyQt5.QtWidgets import QMessageBox from .LegacyUM3PrinterOutputController import LegacyUM3PrinterOutputController -from .UM3OutputDevicePlugin import UM3OutputDevicePlugin from time import time @@ -79,7 +78,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.setIconName("print") self._monitor_view_qml_path = os.path.join( - PluginRegistry.getInstance().getPluginPath(UM3OutputDevicePlugin().getPluginId()), + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), "resources", "qml", "MonitorStage.qml" ) From 38895706976f8de6e02bd577687faef2ab3f6435 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 4 Mar 2019 12:04:34 +0100 Subject: [PATCH 36/48] K.I.S.S. Contributes to CL-1274 --- plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py | 4 ++-- plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py | 4 ++-- plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py | 4 ++-- plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index 395741391a..4d5673effe 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -85,8 +85,8 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): # We use the Cura Connect monitor tab to get most functionality right away. self._monitor_view_qml_path = os.path.join( - PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), - "resources", "qml", "MonitorStage.qml" + PluginRegistry.getPluginDirectory(), + "UM3NetworkPrinting", "resources", "qml", "MonitorStage.qml" ) # Trigger the printersChanged signal when the private signal is triggered. diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py index 97987cee9d..919788f10e 100644 --- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py @@ -66,8 +66,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._received_print_jobs = False # type: bool self._monitor_view_qml_path = os.path.join( - PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), - "resources", "qml", "MonitorStage.qml" + PluginRegistry.getPluginDirectory(), + "UM3NetworkPrinting", "resources", "qml", "MonitorStage.qml" ) # Trigger the printersChanged signal when the private signal is triggered diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py index dd100d7433..ab4bcddaf4 100644 --- a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py @@ -78,8 +78,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.setIconName("print") self._monitor_view_qml_path = os.path.join( - PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), - "resources", "qml", "MonitorStage.qml" + PluginRegistry.getPluginDirectory(), + "UM3NetworkPrinting", "resources", "qml", "MonitorStage.qml" ) self._output_controller = LegacyUM3PrinterOutputController(self) diff --git a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py index 6132c0bc42..10476d55b4 100644 --- a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py @@ -458,8 +458,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): text = i18n_catalog.i18nc("@info:status", "Send and monitor print jobs from anywhere using your Ultimaker account."), lifetime = 0, image_source = QUrl.fromLocalFile(os.path.join( - PluginRegistry.getInstance().getPluginPath(self.getPluginId()), - "resources", "svg", "cloud-flow-start.svg" + PluginRegistry.getPluginDirectory(), + "UM3NetworkPrinting", "resources", "svg", "cloud-flow-start.svg" )), image_caption = i18n_catalog.i18nc("@info:status", "Connect to Ultimaker Cloud"), option_text = i18n_catalog.i18nc("@action", "Don't ask me again for this printer."), @@ -482,8 +482,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): text = i18n_catalog.i18nc("@info:status", "You can now send and monitor print jobs from anywhere using your Ultimaker account."), lifetime = 30, image_source = QUrl.fromLocalFile(os.path.join( - PluginRegistry.getInstance().getPluginPath(self.getPluginId()), - "resources", "svg", "cloud-flow-completed.svg" + PluginRegistry.getPluginDirectory(), + "UM3NetworkPrinting", "resources", "svg", "cloud-flow-completed.svg" )), image_caption = i18n_catalog.i18nc("@info:status", "Connected!") ) From a74717ca3c4d7a137a768e058d94d024679fae99 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 4 Mar 2019 12:42:48 +0100 Subject: [PATCH 37/48] Get plugin path like most other plugins do Contributes to CL-1274 --- plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py | 4 ++-- plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py | 8 ++++---- plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py | 4 ++-- plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index 4d5673effe..395741391a 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -85,8 +85,8 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): # We use the Cura Connect monitor tab to get most functionality right away. self._monitor_view_qml_path = os.path.join( - PluginRegistry.getPluginDirectory(), - "UM3NetworkPrinting", "resources", "qml", "MonitorStage.qml" + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), + "resources", "qml", "MonitorStage.qml" ) # Trigger the printersChanged signal when the private signal is triggered. diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py index 919788f10e..df668c2b20 100644 --- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py @@ -66,8 +66,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._received_print_jobs = False # type: bool self._monitor_view_qml_path = os.path.join( - PluginRegistry.getPluginDirectory(), - "UM3NetworkPrinting", "resources", "qml", "MonitorStage.qml" + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), + "resources", "qml", "MonitorStage.qml" ) # Trigger the printersChanged signal when the private signal is triggered @@ -130,8 +130,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def _spawnPrinterSelectionDialog(self): if self._printer_selection_dialog is None: path = os.path.join( - PluginRegistry.getPluginDirectory(), - "UM3NetworkPrinting", "resources", "qml", "PrintWindow.qml" + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), + "resources", "qml", "PrintWindow.qml" ) self._printer_selection_dialog = self._application.createQmlComponent(path, {"OutputDevice": self}) if self._printer_selection_dialog is not None: diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py index ab4bcddaf4..dd100d7433 100644 --- a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py @@ -78,8 +78,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.setIconName("print") self._monitor_view_qml_path = os.path.join( - PluginRegistry.getPluginDirectory(), - "UM3NetworkPrinting", "resources", "qml", "MonitorStage.qml" + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), + "resources", "qml", "MonitorStage.qml" ) self._output_controller = LegacyUM3PrinterOutputController(self) diff --git a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py index 10476d55b4..3fce903b1a 100644 --- a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py @@ -458,8 +458,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): text = i18n_catalog.i18nc("@info:status", "Send and monitor print jobs from anywhere using your Ultimaker account."), lifetime = 0, image_source = QUrl.fromLocalFile(os.path.join( - PluginRegistry.getPluginDirectory(), - "UM3NetworkPrinting", "resources", "svg", "cloud-flow-start.svg" + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), + "resources", "svg", "cloud-flow-start.svg" )), image_caption = i18n_catalog.i18nc("@info:status", "Connect to Ultimaker Cloud"), option_text = i18n_catalog.i18nc("@action", "Don't ask me again for this printer."), @@ -482,8 +482,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): text = i18n_catalog.i18nc("@info:status", "You can now send and monitor print jobs from anywhere using your Ultimaker account."), lifetime = 30, image_source = QUrl.fromLocalFile(os.path.join( - PluginRegistry.getPluginDirectory(), - "UM3NetworkPrinting", "resources", "svg", "cloud-flow-completed.svg" + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), + "resources", "svg", "cloud-flow-completed.svg" )), image_caption = i18n_catalog.i18nc("@info:status", "Connected!") ) From 88fc7d0fba841dd19f26db8839d39f5a756d919b Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 4 Mar 2019 14:27:35 +0100 Subject: [PATCH 38/48] Don't try to get the plugin path when there's no plugin registry i.e. in tests Contributes to CL-1274 --- .../src/Cloud/CloudOutputDevice.py | 9 +++++---- .../src/ClusterUM3OutputDevice.py | 20 ++++++++++--------- .../src/LegacyUM3OutputDevice.py | 9 +++++---- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index 395741391a..d052d925d2 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -84,10 +84,11 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): self._account = api_client.account # We use the Cura Connect monitor tab to get most functionality right away. - self._monitor_view_qml_path = os.path.join( - PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), - "resources", "qml", "MonitorStage.qml" - ) + if PluginRegistry.getInstance() is not None: + self._monitor_view_qml_path = os.path.join( + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), + "resources", "qml", "MonitorStage.qml" + ) # Trigger the printersChanged signal when the private signal is triggered. self.printersChanged.connect(self._clusterPrintersChanged) diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py index df668c2b20..6ca6b0cd10 100644 --- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py @@ -65,10 +65,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._print_jobs = [] # type: List[UM3PrintJobOutputModel] self._received_print_jobs = False # type: bool - self._monitor_view_qml_path = os.path.join( - PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), - "resources", "qml", "MonitorStage.qml" - ) + if PluginRegistry.getInstance() is not None: + self._monitor_view_qml_path = os.path.join( + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), + "resources", "qml", "MonitorStage.qml" + ) # Trigger the printersChanged signal when the private signal is triggered self.printersChanged.connect(self._clusterPrintersChanged) @@ -129,11 +130,12 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def _spawnPrinterSelectionDialog(self): if self._printer_selection_dialog is None: - path = os.path.join( - PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), - "resources", "qml", "PrintWindow.qml" - ) - self._printer_selection_dialog = self._application.createQmlComponent(path, {"OutputDevice": self}) + if PluginRegistry.getInstance() is not None: + path = os.path.join( + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), + "resources", "qml", "PrintWindow.qml" + ) + self._printer_selection_dialog = self._application.createQmlComponent(path, {"OutputDevice": self}) if self._printer_selection_dialog is not None: self._printer_selection_dialog.show() diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py index dd100d7433..2c7c33d382 100644 --- a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py @@ -77,10 +77,11 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.setIconName("print") - self._monitor_view_qml_path = os.path.join( - PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), - "resources", "qml", "MonitorStage.qml" - ) + if PluginRegistry.getInstance() is not None: + self._monitor_view_qml_path = os.path.join( + PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), + "resources", "qml", "MonitorStage.qml" + ) self._output_controller = LegacyUM3PrinterOutputController(self) From df8d060a00f4ddd3b9da794406708a071b4beb5c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 5 Mar 2019 14:37:45 +0100 Subject: [PATCH 39/48] Increment setting_version This must be up-to-date with the setting version that Cura currently uses, in order to ensure that the settings have the same names and the same functionality. The settings that are set by these profiles are all nozzle-dimensional settings that haven't changed since 3.5, so we don't need to actually change the settings right now. Contributes to issue CURA-6262. --- .../structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg | 2 +- .../structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg | 2 +- .../structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg | 4 ++-- .../structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg | 4 ++-- .../structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg | 4 ++-- .../structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg | 4 ++-- .../structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg index cbafbcbbc7..bd67b654cd 100644 --- a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg @@ -4,7 +4,7 @@ version = 4 definition = structur3d_discov3ry1_complete_um2plus [metadata] -setting_version = 5 +setting_version = 7 type = variant hardware_type = nozzle diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg index 54ed35afff..389984f293 100644 --- a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg @@ -4,7 +4,7 @@ version = 4 definition = structur3d_discov3ry1_complete_um2plus [metadata] -setting_version = 5 +setting_version = 7 type = variant hardware_type = nozzle diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg index c5f071240e..f6936233e9 100644 --- a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg @@ -4,11 +4,11 @@ version = 4 definition = structur3d_discov3ry1_complete_um2plus [metadata] -setting_version = 5 +setting_version = 7 type = variant hardware_type = nozzle [values] machine_nozzle_id = 0.41mm (Blue) machine_nozzle_size = 0.41 -machine_nozzle_tip_outer_diameter = 0.51 \ No newline at end of file +machine_nozzle_tip_outer_diameter = 0.51 diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg index 0dcab9e9e9..b30770afc4 100644 --- a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg @@ -4,11 +4,11 @@ version = 4 definition = structur3d_discov3ry1_complete_um2plus [metadata] -setting_version = 5 +setting_version = 7 type = variant hardware_type = nozzle [values] machine_nozzle_id = 0.58mm (Pink) machine_nozzle_size = 0.58 -machine_nozzle_tip_outer_diameter = 0.68 \ No newline at end of file +machine_nozzle_tip_outer_diameter = 0.68 diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg index b011364fda..b83bef727d 100644 --- a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg @@ -4,11 +4,11 @@ version = 4 definition = structur3d_discov3ry1_complete_um2plus [metadata] -setting_version = 5 +setting_version = 7 type = variant hardware_type = nozzle [values] machine_nozzle_id = 0.84mm (Green) machine_nozzle_size = 0.84 -machine_nozzle_tip_outer_diameter = 0.94 \ No newline at end of file +machine_nozzle_tip_outer_diameter = 0.94 diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg index 84453c9b0d..9a0f4922ef 100644 --- a/resources/variants/structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg @@ -4,11 +4,11 @@ version = 4 definition = structur3d_discov3ry1_complete_um2plus [metadata] -setting_version = 5 +setting_version = 7 type = variant hardware_type = nozzle [values] machine_nozzle_id = 1.19mm (Grey) machine_nozzle_size = 1.19 -machine_nozzle_tip_outer_diameter = 1.29 \ No newline at end of file +machine_nozzle_tip_outer_diameter = 1.29 diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg index ef0fa455af..a235f406c0 100644 --- a/resources/variants/structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg +++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg @@ -4,11 +4,11 @@ version = 4 definition = structur3d_discov3ry1_complete_um2plus [metadata] -setting_version = 5 +setting_version = 7 type = variant hardware_type = nozzle [values] machine_nozzle_id = 1.60mm (Olive) machine_nozzle_size = 1.60 -machine_nozzle_tip_outer_diameter = 1.70 \ No newline at end of file +machine_nozzle_tip_outer_diameter = 1.70 From 0fe9e660b11a58e9d3a0a9f3c786f651f7dfa301 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 5 Mar 2019 15:36:31 +0100 Subject: [PATCH 40/48] Don't show Silicone for UM printers that are incompatible with it anyway It's still an open bug that we show materials of which all configurations are incompatible with the printer. Contributes to issue CURA-6262. --- resources/definitions/ultimaker.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json index a980a1afdf..aec7907dbe 100644 --- a/resources/definitions/ultimaker.def.json +++ b/resources/definitions/ultimaker.def.json @@ -7,7 +7,7 @@ "manufacturer": "Ultimaker B.V.", "category": "Ultimaker", "visible": false, - "exclude_materials": [ "generic_hips", "generic_petg" ] + "exclude_materials": [ "generic_hips", "generic_petg", "structur3d_dap100silicone" ] }, "overrides": { "machine_max_feedrate_e": { From 4979b401b3f566fb8084634f6c719b7bdfe68e7a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 6 Mar 2019 11:02:53 +0100 Subject: [PATCH 41/48] Disable prime blob by default for CFFF CURA-6282 --- resources/definitions/fdmprinter.def.json | 2 +- resources/definitions/ultimaker3.def.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 04c69c9497..295108f27b 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4581,7 +4581,7 @@ "description": "Whether to prime the filament with a blob before printing. Turning this setting on will ensure that the extruder will have material ready at the nozzle before printing. Printing Brim or Skirt can act like priming too, in which case turning this setting off saves some time.", "type": "bool", "resolve": "any(extruderValues('prime_blob_enable'))", - "default_value": true, + "default_value": false, "settable_per_mesh": false, "settable_per_extruder": true, "enabled": false diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 72756de2a5..9e017688a2 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -78,7 +78,7 @@ "prime_tower_position_x": { "value": "machine_depth - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) - 30" }, "prime_tower_wipe_enabled": { "default_value": false }, - "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "enabled": true, "default_value": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, From e56a97bfa2a06a561126fc26cc8c1967634ffe38 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 6 Mar 2019 17:28:22 +0600 Subject: [PATCH 42/48] monitor does not show "Build Plate" bed_temperature_matches : error in temperature search expression --- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 752773723e..e49f0c166e 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -265,7 +265,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if match[2]: extruder.updateTargetHotendTemperature(float(match[2])) - bed_temperature_matches = re.findall(b"B: ?(\d+\.?\d*) ?\/?(\d+\.?\d*) ?", line) + bed_temperature_matches = re.findall(b"B: ?(\d+\.?\d*) ?\/?(\d+\.?\d*)?", line) if bed_temperature_matches: match = bed_temperature_matches[0] if match[0]: From 473e8efac080e8cec422598684c629c69af1a5c6 Mon Sep 17 00:00:00 2001 From: kaleidoscopeit Date: Thu, 7 Mar 2019 17:06:49 +0100 Subject: [PATCH 43/48] Deltacomb 3D - Updated profile --- resources/definitions/deltacomb.def.json | 115 ++++++++++-------- .../extruders/deltacomb_extruder_0.def.json | 8 +- .../extruders/deltacomb_extruder_1.def.json | 18 +++ .../deltacomb_abs_Draft_Quality.inst.cfg | 4 +- .../deltacomb_abs_Fast_Quality.inst.cfg | 4 +- .../deltacomb_abs_High_Quality.inst.cfg | 6 +- .../deltacomb_abs_Normal_Quality.inst.cfg | 4 +- .../deltacomb_abs_Verydraft_Quality.inst.cfg | 4 +- .../deltacomb_global_Draft_Quality.inst.cfg | 2 +- .../deltacomb_global_Fast_Quality.inst.cfg | 2 +- .../deltacomb_global_High_Quality.inst.cfg | 4 +- .../deltacomb_global_Normal_Quality.inst.cfg | 2 +- ...eltacomb_global_Verydraft_Quality.inst.cfg | 2 +- .../deltacomb_petg_Draft_Quality.inst.cfg | 25 ++++ .../deltacomb_petg_Fast_Quality.inst.cfg | 25 ++++ .../deltacomb_petg_High_Quality.inst.cfg | 25 ++++ .../deltacomb_petg_Normal_Quality.inst.cfg | 25 ++++ .../deltacomb_petg_Verydraft_Quality.inst.cfg | 25 ++++ .../deltacomb_pla_Draft_Quality.inst.cfg | 4 +- .../deltacomb_pla_Fast_Quality.inst.cfg | 4 +- .../deltacomb_pla_High_Quality.inst.cfg | 6 +- .../deltacomb_pla_Normal_Quality.inst.cfg | 4 +- .../deltacomb_pla_Verydraft_Quality.inst.cfg | 4 +- .../deltacomb_tpu_Draft_Quality.inst.cfg | 27 ++++ .../deltacomb_tpu_Fast_Quality.inst.cfg | 27 ++++ .../deltacomb_tpu_High_Quality.inst.cfg | 27 ++++ .../deltacomb_tpu_Normal_Quality.inst.cfg | 27 ++++ .../deltacomb_tpu_Verydraft_Quality.inst.cfg | 27 ++++ resources/variants/deltacomb_025_e3d.inst.cfg | 13 ++ resources/variants/deltacomb_040_e3d.inst.cfg | 13 ++ resources/variants/deltacomb_080_e3d.inst.cfg | 13 ++ 31 files changed, 411 insertions(+), 85 deletions(-) create mode 100755 resources/extruders/deltacomb_extruder_1.def.json mode change 100644 => 100755 resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg mode change 100644 => 100755 resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg mode change 100644 => 100755 resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg mode change 100644 => 100755 resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg mode change 100644 => 100755 resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg mode change 100644 => 100755 resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg mode change 100644 => 100755 resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg mode change 100644 => 100755 resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg mode change 100644 => 100755 resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg mode change 100644 => 100755 resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg create mode 100755 resources/quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg create mode 100755 resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg create mode 100755 resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg create mode 100755 resources/quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg create mode 100755 resources/quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg create mode 100755 resources/variants/deltacomb_025_e3d.inst.cfg create mode 100755 resources/variants/deltacomb_040_e3d.inst.cfg create mode 100755 resources/variants/deltacomb_080_e3d.inst.cfg diff --git a/resources/definitions/deltacomb.def.json b/resources/definitions/deltacomb.def.json index 8fec0f8950..026dfca9ed 100755 --- a/resources/definitions/deltacomb.def.json +++ b/resources/definitions/deltacomb.def.json @@ -1,61 +1,68 @@ { - "version": 2, - "name": "Deltacomb 3D", - "inherits": "fdmprinter", + "version": 2, + "name": "Deltacomb 3D", + "inherits": "fdmprinter", + "metadata": { - "author": "Gabriele Rossetti", - "visible": true, - "manufacturer": "Deltacomb 3D", - "category": "Other", - "file_formats": "text/x-gcode", - "platform": "deltacomb.stl", - "has_machine_quality": true, - "machine_extruder_trains": - { - "0": "deltacomb_extruder_0" - } + "author": "Gabriele Rossetti", + "visible": true, + "manufacturer": "Deltacomb 3D", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2", + "platform": "deltacomb.stl", + "has_machine_quality": true, + "has_materials": true, + "has_machine_materials": false, + "has_variants": true, + "variants_name": "Head", + "preferred_variant_name": "E3D 0.40mm", + "preferred_material": "generic_pla", + "preferred_quality_type": "normal", + "machine_extruder_trains": { "0": "deltacomb_extruder_0", "1": "deltacomb_extruder_1" } }, "overrides": { - "machine_heated_bed": { "default_value": true }, - "machine_width": { "default_value": 190 }, - "machine_height": { "default_value": 250 }, - "machine_depth": { "default_value": 190 }, - "machine_center_is_zero": { "default_value": true }, - "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 ;Home all axes (max 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\nG28 ;Home all axes (max endstops)\nM84 ;steppers off\nG90 ;absolute positioning" }, - "machine_shape": { "default_value": "elliptic" }, - "retraction_hop_enabled": { "default_value": true }, - "retraction_amount" : { "default_value": 3.5 }, - "retraction_speed" : { "default_value": 50 }, - "material_final_print_temperature": { "value": "material_print_temperature - 5" }, - "material_initial_print_temperature": { "value": "material_print_temperature" }, - "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, - "material_diameter": { "default_value": 1.75 }, - "travel_avoid_distance": { "default_value": 1, "value": "1" }, - "speed_print" : { "default_value": 70 }, - "speed_travel": { "value": "150.0" }, - "speed_infill": { "value": "round(speed_print * 1.05, 0)" }, - "speed_topbottom": { "value": "round(speed_print * 0.95, 0)" }, - "speed_wall": { "value": "speed_print" }, - "speed_wall_0": { "value": "20" }, - "speed_wall_x": { "value": "speed_wall" }, - "speed_layer_0": { "value": "min(round(speed_print * 0.75, 0), 45.0)" }, - "speed_travel_layer_0": { "value": "round(speed_travel * 0.7, 0)" }, - "skirt_brim_speed": { "value": "speed_layer_0" }, - "skirt_line_count": { "default_value": 3 }, - "skirt_brim_minimal_length": { "default_value": 150 }, - "infill_sparse_density": { "default_value": 90 }, - "gradual_infill_steps": { "default_value": 2 }, - "infill_before_walls" : { "default_value": false }, - "top_bottom_thickness": { "default_value": 0.6 }, - "support_z_distance": { "value": "layer_height * 2" }, - "support_bottom_distance": { "value": "layer_height" }, - "support_use_towers" : { "default_value": false }, - "jerk_wall_0" : { "value": "30" }, - "jerk_travel" : { "default_value": 20 }, - "acceleration_travel" : { "value": 10000 }, - "machine_max_feedrate_z" : { "default_value": 150 } + "machine_extruder_count": { "default_value": 1 }, + "machine_heated_bed": { "default_value": true }, + "machine_width": { "default_value": 190 }, + "machine_height": { "default_value": 250 }, + "machine_depth": { "default_value": 190 }, + "machine_center_is_zero": { "default_value": true }, + "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 ;Home all axes (max endstops)\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\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\nG28 ;Home all axes (max endstops)\nM84 ;steppers off\nG90 ;absolute positioning" }, + "machine_shape": { "default_value": "elliptic" }, + "retraction_hop_enabled": { "default_value": true }, + "retraction_hop": { "default_value": 1 }, + "retraction_amount" : { "default_value": 3.5 }, + "retraction_speed" : { "default_value": 30 }, + "retraction_combing" : { "default_value": "noskin" }, + "travel_avoid_distance": { "default_value": 1, "value": "1" }, + "speed_print" : { "default_value": 80 }, + "speed_infill": { "value": "round(speed_print * 1.05, 0)" }, + "speed_topbottom": { "value": "round(speed_print * 0.95, 0)" }, + "speed_wall": { "value": "speed_print" }, + "speed_wall_0": { "value": "30" }, + "speed_wall_x": { "value": "speed_wall" }, + "speed_layer_0": { "value": "min(round(speed_print * 0.75, 0), 45.0)" }, + "speed_travel": { "default_value": 150, "value": 150 }, + "speed_travel_layer_0": { "value": "round(speed_travel * 0.7, 0)" }, + "skirt_brim_speed": { "value": "speed_layer_0" }, + "skirt_line_count": { "default_value": 3 }, + "skirt_brim_minimal_length": { "default_value": 150 }, + "infill_sparse_density": { "default_value": 30 }, + "infill_pattern": { "value": "'cubic'" }, + "infill_before_walls" : { "default_value": false }, + "top_bottom_thickness": { "default_value": 0.8 }, + "support_z_distance": { "value": "layer_height * 2" }, + "support_bottom_distance": { "value": "layer_height" }, + "support_use_towers" : { "default_value": false }, + "jerk_enabled": { "default_value": 1, "value": "1" }, + "jerk_infill" : { "default_value": 5, "value": "5" }, + "jerk_support" : { "default_value": 5, "value": "5" }, + "acceleration_enabled": { "default_value": 1, "value": "1" }, + "acceleration_travel" : { "value": 5000 }, + "machine_max_feedrate_z" : { "default_value": 300 } } } diff --git a/resources/extruders/deltacomb_extruder_0.def.json b/resources/extruders/deltacomb_extruder_0.def.json index 046becfd82..64c512b7fe 100755 --- a/resources/extruders/deltacomb_extruder_0.def.json +++ b/resources/extruders/deltacomb_extruder_0.def.json @@ -9,8 +9,10 @@ }, "overrides": { - "extruder_nr": { "default_value": 0 }, - "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 1.75 } + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 } } } diff --git a/resources/extruders/deltacomb_extruder_1.def.json b/resources/extruders/deltacomb_extruder_1.def.json new file mode 100755 index 0000000000..1657688482 --- /dev/null +++ b/resources/extruders/deltacomb_extruder_1.def.json @@ -0,0 +1,18 @@ +{ + "id": "deltacomb_extruder_1", + "version": 2, + "name": "Extruder 2", + "inherits": "fdmextruder", + "metadata": { + "machine": "deltacomb", + "position": "1" + }, + + "overrides": { + "extruder_nr": { "default_value": 1 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 } + } +} diff --git a/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg old mode 100644 new mode 100755 index 9ac0791b7d..8aa8189768 --- a/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fast (beta) definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = draft weight = -2 @@ -13,7 +13,7 @@ material = generic_abs [values] adhesion_type = raft cool_fan_enabled = True -cool_fan_full_at_height = =layer_height * 2 +cool_fan_full_at_height = =layer_height * 6 cool_fan_speed = 50 cool_fan_speed_max = 50 cool_fan_speed_min = 50 diff --git a/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg old mode 100644 new mode 100755 index 43d6bfb778..76b3518d02 --- a/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Normal (beta) definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = fast weight = -1 @@ -13,7 +13,7 @@ material = generic_abs [values] adhesion_type = raft cool_fan_enabled = True -cool_fan_full_at_height = =layer_height * 2 +cool_fan_full_at_height = =layer_height * 6 cool_fan_speed = 50 cool_fan_speed_max = 50 cool_fan_speed_min = 50 diff --git a/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg old mode 100644 new mode 100755 index 7116247ca3..cc162b7e73 --- a/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg @@ -4,16 +4,16 @@ name = Extra Fine (beta) definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = high -weight = 1 +weight = 0 material = generic_abs [values] adhesion_type = raft cool_fan_enabled = True -cool_fan_full_at_height = =layer_height * 2 +cool_fan_full_at_height = =layer_height * 6 cool_fan_speed = 50 cool_fan_speed_max = 50 cool_fan_speed_min = 50 diff --git a/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg old mode 100644 new mode 100755 index 9b968e1a47..9b8dad877f --- a/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fine (beta) definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = normal weight = 0 @@ -13,7 +13,7 @@ material = generic_abs [values] adhesion_type = raft cool_fan_enabled = True -cool_fan_full_at_height = =layer_height * 2 +cool_fan_full_at_height = =layer_height * 6 cool_fan_speed = 50 cool_fan_speed_max = 50 cool_fan_speed_min = 50 diff --git a/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg old mode 100644 new mode 100755 index 68846ce68b..cf260d5737 --- a/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fast (beta) definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = verydraft weight = -3 @@ -13,7 +13,7 @@ material = generic_abs [values] adhesion_type = raft cool_fan_enabled = True -cool_fan_full_at_height = =layer_height * 2 +cool_fan_full_at_height = =layer_height * 6 cool_fan_speed = 50 cool_fan_speed_max = 50 cool_fan_speed_min = 50 diff --git a/resources/quality/deltacomb/deltacomb_global_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_global_Draft_Quality.inst.cfg index 6f63b0f5b4..f8887810d5 100755 --- a/resources/quality/deltacomb/deltacomb_global_Draft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_global_Draft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fast definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = draft weight = -2 diff --git a/resources/quality/deltacomb/deltacomb_global_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_global_Fast_Quality.inst.cfg index 2d76f87d66..99030a084b 100755 --- a/resources/quality/deltacomb/deltacomb_global_Fast_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_global_Fast_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Normal definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = fast weight = -1 diff --git a/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg index 6495b09042..d6d853466a 100755 --- a/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg @@ -4,10 +4,10 @@ name = Extra Fine definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = high -weight = 1 +weight = 0 global_quality = True [values] diff --git a/resources/quality/deltacomb/deltacomb_global_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_global_Normal_Quality.inst.cfg index 7bd4591064..a3bafadeec 100755 --- a/resources/quality/deltacomb/deltacomb_global_Normal_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_global_Normal_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fine definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = normal weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_global_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_global_Verydraft_Quality.inst.cfg index a13d029c1a..84c6e66f61 100755 --- a/resources/quality/deltacomb/deltacomb_global_Verydraft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_global_Verydraft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fast definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = verydraft weight = -3 diff --git a/resources/quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg new file mode 100644 index 0000000000..96caae0578 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 4 +name = Fast +definition = deltacomb + +[metadata] +setting_version = 5 +type = quality +quality_type = draft +weight = -2 +material = generic_petg + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_fan_full_at_height = =layer_height * 4 +cool_fan_speed = 60 +cool_fan_speed_max = 100 +cool_fan_speed_min = 60 +cool_min_layer_time = 5 +cool_min_speed = 20 +speed_print = 50 +default_material_print_temperature = 235 +material_standby_temperature = 215 +material_print_temperature_layer_0 = =default_material_print_temperature + 5 diff --git a/resources/quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg new file mode 100644 index 0000000000..a77364b963 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 4 +name = Normal +definition = deltacomb + +[metadata] +setting_version = 5 +type = quality +quality_type = fast +weight = -1 +material = generic_petg + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_fan_full_at_height = =layer_height * 4 +cool_fan_speed = 60 +cool_fan_speed_max = 100 +cool_fan_speed_min = 60 +cool_min_layer_time = 5 +cool_min_speed = 20 +speed_print = 50 +default_material_print_temperature = 235 +material_standby_temperature = 215 +material_print_temperature_layer_0 = =default_material_print_temperature + 5 diff --git a/resources/quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg new file mode 100644 index 0000000000..3aec71c4d3 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 4 +name = Extra Fine +definition = deltacomb + +[metadata] +setting_version = 5 +type = quality +quality_type = high +weight = 0 +material = generic_petg + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_fan_full_at_height = =layer_height * 4 +cool_fan_speed = 60 +cool_fan_speed_max = 100 +cool_fan_speed_min = 60 +cool_min_layer_time = 5 +cool_min_speed = 20 +speed_print = 50 +default_material_print_temperature = 235 +material_standby_temperature = 215 +material_print_temperature_layer_0 = =default_material_print_temperature + 5 diff --git a/resources/quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..1c355e9493 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 4 +name = Fine +definition = deltacomb + +[metadata] +setting_version = 5 +type = quality +quality_type = normal +weight = 0 +material = generic_petg + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_fan_full_at_height = =layer_height * 4 +cool_fan_speed = 60 +cool_fan_speed_max = 100 +cool_fan_speed_min = 60 +cool_min_layer_time = 5 +cool_min_speed = 20 +speed_print = 50 +default_material_print_temperature = 235 +material_standby_temperature = 215 +material_print_temperature_layer_0 = =default_material_print_temperature + 5 diff --git a/resources/quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg new file mode 100644 index 0000000000..91f079e6b3 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 4 +name = Extra Fast +definition = deltacomb + +[metadata] +setting_version = 5 +type = quality +quality_type = verydraft +weight = -3 +material = generic_petg + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_fan_full_at_height = =layer_height * 4 +cool_fan_speed = 60 +cool_fan_speed_max = 100 +cool_fan_speed_min = 60 +cool_min_layer_time = 5 +cool_min_speed = 20 +speed_print = 50 +default_material_print_temperature = 235 +material_standby_temperature = 215 +material_print_temperature_layer_0 = =default_material_print_temperature + 5 diff --git a/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg old mode 100644 new mode 100755 index d5387f3014..6d9f47dd8c --- a/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fast definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = draft weight = -2 @@ -13,7 +13,7 @@ material = generic_pla [values] adhesion_type = skirt cool_fan_enabled = True -cool_fan_full_at_height = =layer_height +cool_fan_full_at_height = =layer_height * 4 cool_fan_speed = 100 cool_fan_speed_max = 100 cool_fan_speed_min = 100 diff --git a/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg old mode 100644 new mode 100755 index b41eb9d81f..316cc8eb2d --- a/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Normal definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = fast weight = -1 @@ -13,7 +13,7 @@ material = generic_pla [values] adhesion_type = skirt cool_fan_enabled = True -cool_fan_full_at_height = =layer_height +cool_fan_full_at_height = =layer_height * 4 cool_fan_speed = 100 cool_fan_speed_max = 100 cool_fan_speed_min = 100 diff --git a/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg old mode 100644 new mode 100755 index ceaeb4667e..bbff29874e --- a/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg @@ -4,16 +4,16 @@ name = Extra Fine definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = high -weight = 1 +weight = 0 material = generic_pla [values] adhesion_type = skirt cool_fan_enabled = True -cool_fan_full_at_height = =layer_height +cool_fan_full_at_height = =layer_height * 4 cool_fan_speed = 100 cool_fan_speed_max = 100 cool_fan_speed_min = 100 diff --git a/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg old mode 100644 new mode 100755 index ba82feb97d..665286ce4d --- a/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fine definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = normal weight = 0 @@ -13,7 +13,7 @@ material = generic_pla [values] adhesion_type = skirt cool_fan_enabled = True -cool_fan_full_at_height = =layer_height +cool_fan_full_at_height = =layer_height * 4 cool_fan_speed = 100 cool_fan_speed_max = 100 cool_fan_speed_min = 100 diff --git a/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg old mode 100644 new mode 100755 index f312c27233..34aea16596 --- a/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fast definition = deltacomb [metadata] -setting_version = 7 +setting_version = 5 type = quality quality_type = verydraft weight = -3 @@ -13,7 +13,7 @@ material = generic_pla [values] adhesion_type = skirt cool_fan_enabled = True -cool_fan_full_at_height = =layer_height +cool_fan_full_at_height = =layer_height * 4 cool_fan_speed = 100 cool_fan_speed_max = 100 cool_fan_speed_min = 100 diff --git a/resources/quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg new file mode 100755 index 0000000000..4d858145d4 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg @@ -0,0 +1,27 @@ +[general] +version = 4 +name = Fast +definition = deltacomb + +[metadata] +setting_version = 5 +type = quality +quality_type = draft +weight = -2 +material = generic_tpu + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_fan_full_at_height = =layer_height * 6 +cool_fan_speed = 100 +cool_fan_speed_max = 100 +cool_fan_speed_min = 70 +cool_min_layer_time = 5 +cool_min_speed = 20 +material_print_temperature_layer_0 = =default_material_print_temperature + 5 +speed_print = 25 +speed_travel = 300 +acceleration_travel = 10000 +retraction_amount = 5 +retraction_hop_enabled = False diff --git a/resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg new file mode 100755 index 0000000000..53c6fa72f7 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg @@ -0,0 +1,27 @@ +[general] +version = 4 +name = Normal +definition = deltacomb + +[metadata] +setting_version = 5 +type = quality +quality_type = fast +weight = -1 +material = generic_tpu + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_fan_full_at_height = =layer_height * 6 +cool_fan_speed = 100 +cool_fan_speed_max = 100 +cool_fan_speed_min = 70 +cool_min_layer_time = 5 +cool_min_speed = 20 +material_print_temperature_layer_0 = =default_material_print_temperature + 5 +speed_print = 25 +speed_travel = 300 +acceleration_travel = 10000 +retraction_amount = 5 +retraction_hop_enabled = False diff --git a/resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg new file mode 100755 index 0000000000..b71cdf6fef --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg @@ -0,0 +1,27 @@ +[general] +version = 4 +name = Extra Fine +definition = deltacomb + +[metadata] +setting_version = 5 +type = quality +quality_type = high +weight = 0 +material = generic_tpu + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_fan_full_at_height = =layer_height * 6 +cool_fan_speed = 100 +cool_fan_speed_max = 100 +cool_fan_speed_min = 70 +cool_min_layer_time = 5 +cool_min_speed = 20 +material_print_temperature_layer_0 = =default_material_print_temperature + 5 +speed_print = 25 +speed_travel = 300 +acceleration_travel = 10000 +retraction_amount = 5 +retraction_hop_enabled = False diff --git a/resources/quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg new file mode 100755 index 0000000000..681022086c --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg @@ -0,0 +1,27 @@ +[general] +version = 4 +name = Fine +definition = deltacomb + +[metadata] +setting_version = 5 +type = quality +quality_type = normal +weight = 0 +material = generic_tpu + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_fan_full_at_height = =layer_height * 6 +cool_fan_speed = 100 +cool_fan_speed_max = 100 +cool_fan_speed_min = 70 +cool_min_layer_time = 5 +cool_min_speed = 20 +material_print_temperature_layer_0 = =default_material_print_temperature + 5 +speed_print = 25 +speed_travel = 300 +acceleration_travel = 10000 +retraction_amount = 5 +retraction_hop_enabled = False diff --git a/resources/quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg new file mode 100755 index 0000000000..957771e5b6 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg @@ -0,0 +1,27 @@ +[general] +version = 4 +name = Extra Fast +definition = deltacomb + +[metadata] +setting_version = 5 +type = quality +quality_type = verydraft +weight = -3 +material = generic_tpu + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_fan_full_at_height = =layer_height * 6 +cool_fan_speed = 100 +cool_fan_speed_max = 100 +cool_fan_speed_min = 70 +cool_min_layer_time = 5 +cool_min_speed = 20 +material_print_temperature_layer_0 = =default_material_print_temperature + 5 +speed_print = 25 +speed_travel = 300 +acceleration_travel = 10000 +retraction_amount = 5 +retraction_hop_enabled = False diff --git a/resources/variants/deltacomb_025_e3d.inst.cfg b/resources/variants/deltacomb_025_e3d.inst.cfg new file mode 100755 index 0000000000..a741ee38b6 --- /dev/null +++ b/resources/variants/deltacomb_025_e3d.inst.cfg @@ -0,0 +1,13 @@ +[general] +name = E3D 0.25mm +version = 4 +definition = deltacomb + +[metadata] +author = Deltacomb 3D +setting_version = 5 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.25 diff --git a/resources/variants/deltacomb_040_e3d.inst.cfg b/resources/variants/deltacomb_040_e3d.inst.cfg new file mode 100755 index 0000000000..3f8f122af1 --- /dev/null +++ b/resources/variants/deltacomb_040_e3d.inst.cfg @@ -0,0 +1,13 @@ +[general] +name = E3D 0.40mm +version = 4 +definition = deltacomb + +[metadata] +author = Deltacomb 3D +setting_version = 5 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.4 diff --git a/resources/variants/deltacomb_080_e3d.inst.cfg b/resources/variants/deltacomb_080_e3d.inst.cfg new file mode 100755 index 0000000000..bcef7198b8 --- /dev/null +++ b/resources/variants/deltacomb_080_e3d.inst.cfg @@ -0,0 +1,13 @@ +[general] +name = E3D 0.80mm +version = 4 +definition = deltacomb + +[metadata] +author = Deltacomb 3D +setting_version = 5 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.8 From 7f3abbd717e27ce7e670fb794e4f31be206ada13 Mon Sep 17 00:00:00 2001 From: kaleidoscopeit Date: Thu, 7 Mar 2019 17:17:02 +0100 Subject: [PATCH 44/48] Deltacomb 3D - Updated profile --- .../quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_global_Draft_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_global_Fast_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_global_High_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_global_Normal_Quality.inst.cfg | 2 +- .../deltacomb/deltacomb_global_Verydraft_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg | 2 +- .../quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg index 8aa8189768..3defed4dbc 100755 --- a/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fast (beta) definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = draft weight = -2 diff --git a/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg index 76b3518d02..bcbeba5964 100755 --- a/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Normal (beta) definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = fast weight = -1 diff --git a/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg index cc162b7e73..d4b9185108 100755 --- a/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fine (beta) definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = high weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg index 9b8dad877f..843176f4a1 100755 --- a/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fine (beta) definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = normal weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg index cf260d5737..5035bad786 100755 --- a/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fast (beta) definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = verydraft weight = -3 diff --git a/resources/quality/deltacomb/deltacomb_global_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_global_Draft_Quality.inst.cfg index f8887810d5..6f63b0f5b4 100755 --- a/resources/quality/deltacomb/deltacomb_global_Draft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_global_Draft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fast definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = draft weight = -2 diff --git a/resources/quality/deltacomb/deltacomb_global_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_global_Fast_Quality.inst.cfg index 99030a084b..2d76f87d66 100755 --- a/resources/quality/deltacomb/deltacomb_global_Fast_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_global_Fast_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Normal definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = fast weight = -1 diff --git a/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg index d6d853466a..9b8c8080a2 100755 --- a/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fine definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = high weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_global_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_global_Normal_Quality.inst.cfg index a3bafadeec..7bd4591064 100755 --- a/resources/quality/deltacomb/deltacomb_global_Normal_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_global_Normal_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fine definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = normal weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_global_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_global_Verydraft_Quality.inst.cfg index 84c6e66f61..a13d029c1a 100755 --- a/resources/quality/deltacomb/deltacomb_global_Verydraft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_global_Verydraft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fast definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = verydraft weight = -3 diff --git a/resources/quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg index 96caae0578..003f312fa8 100644 --- a/resources/quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fast definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = draft weight = -2 diff --git a/resources/quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg index a77364b963..6dbdb759d1 100644 --- a/resources/quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Normal definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = fast weight = -1 diff --git a/resources/quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg index 3aec71c4d3..275edfe4d1 100644 --- a/resources/quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fine definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = high weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg index 1c355e9493..5d746aad68 100644 --- a/resources/quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fine definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = normal weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg index 91f079e6b3..8dd0f1fbb6 100644 --- a/resources/quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fast definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = verydraft weight = -3 diff --git a/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg index 6d9f47dd8c..9c966d726c 100755 --- a/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fast definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = draft weight = -2 diff --git a/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg index 316cc8eb2d..a1a1fde055 100755 --- a/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Normal definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = fast weight = -1 diff --git a/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg index bbff29874e..0872d6d0a2 100755 --- a/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fine definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = high weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg index 665286ce4d..cae00671c4 100755 --- a/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fine definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = normal weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg index 34aea16596..c26cec5127 100755 --- a/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fast definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = verydraft weight = -3 diff --git a/resources/quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg index 4d858145d4..5fcbd76229 100755 --- a/resources/quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fast definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = draft weight = -2 diff --git a/resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg index 53c6fa72f7..299d12ac00 100755 --- a/resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Normal definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = fast weight = -1 diff --git a/resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg index b71cdf6fef..32b2aadd0b 100755 --- a/resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fine definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = high weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg index 681022086c..880c35c14e 100755 --- a/resources/quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Fine definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = normal weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg index 957771e5b6..104df50eee 100755 --- a/resources/quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fast definition = deltacomb [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = verydraft weight = -3 From 70e640be2276955f3befd72bba12538850ebd4ca Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 8 Mar 2019 11:25:49 +0600 Subject: [PATCH 45/48] Change regexp for greater compatibility Change regexp in bed_temperature_matches and extruder_temperature_matches for greater compatibility with different printers. --- plugins/USBPrinting/USBPrinterOutputDevice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index e49f0c166e..3375ac27e7 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -243,7 +243,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._last_temperature_request = time() if re.search(b"[B|T\d*]: ?\d+\.?\d*", line): # Temperature message. 'T:' for extruder and 'B:' for bed - extruder_temperature_matches = re.findall(b"T(\d*): ?(\d+\.?\d*) ?\/?(\d+\.?\d*)?", line) + extruder_temperature_matches = re.findall(b"T(\d*): ?(\d+\.?\d*)\s*\/?(\d+\.?\d*)?", line) # Update all temperature values matched_extruder_nrs = [] for match in extruder_temperature_matches: @@ -265,7 +265,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if match[2]: extruder.updateTargetHotendTemperature(float(match[2])) - bed_temperature_matches = re.findall(b"B: ?(\d+\.?\d*) ?\/?(\d+\.?\d*)?", line) + bed_temperature_matches = re.findall(b"B: ?(\d+\.?\d*)\s*\/?(\d+\.?\d*)?", line) if bed_temperature_matches: match = bed_temperature_matches[0] if match[0]: From d53c8b1162d597a26b6485c60830ea88726e87f7 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 8 Mar 2019 15:27:17 +0100 Subject: [PATCH 46/48] Change text to singular mode It makes more sense. --- resources/qml/ViewsSelector.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/ViewsSelector.qml b/resources/qml/ViewsSelector.qml index 0e9be649db..af98469921 100644 --- a/resources/qml/ViewsSelector.qml +++ b/resources/qml/ViewsSelector.qml @@ -47,7 +47,7 @@ Cura.ExpandablePopup Label { id: title - text: catalog.i18nc("@label", "View types") + text: catalog.i18nc("@label", "View type") verticalAlignment: Text.AlignVCenter height: parent.height elide: Text.ElideRight From 93966281708a1072fe4ae7f4efbfc3e54a179707 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 8 Mar 2019 15:46:21 +0100 Subject: [PATCH 47/48] Make suggested changes to post processing scripts Contributes to CURA-5713. --- .../scripts/InsertAtLayerChange.py | 10 ++-------- plugins/PostProcessingPlugin/scripts/TimeLapse.py | 12 +++--------- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py b/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py index 04c0a3badf..32fcc85fe1 100644 --- a/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py +++ b/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py @@ -14,7 +14,7 @@ class InsertAtLayerChange(Script): "version": 2, "settings": { - "insert_loc": + "insert_location": { "label": "When to insert", "description": "Whether to insert code before or after layer change.", @@ -33,19 +33,13 @@ class InsertAtLayerChange(Script): }""" def execute(self, data): - in_layer = False gcode_to_add = self.getSettingValueByKey("gcode_to_add") + "\n" for layer in data: # Check that a layer is being printed lines = layer.split("\n") if ";LAYER:" in lines[0]: - in_layer = True - else: - in_layer = False - - if in_layer: index = data.index(layer) - if self.getSettingValueByKey("insert_loc") == "before": + if self.getSettingValueByKey("insert_location") == "before": layer = gcode_to_add + layer else: layer = layer + gcode_to_add diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index a4b0996075..76d9143459 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -14,7 +14,7 @@ class TimeLapse(Script): "version": 2, "settings": { - "trigger_cmd": + "trigger_command": { "label": "Trigger camera command", "description": "Gcode command used to trigger camera.", @@ -68,30 +68,24 @@ class TimeLapse(Script): }""" def execute(self, data): - in_layer = False feed_rate = self.getSettingValueByKey("park_feed_rate") park_print_head = self.getSettingValueByKey("park_print_head") x_park = self.getSettingValueByKey("head_park_x") y_park = self.getSettingValueByKey("head_park_y") - trigger_cmd = self.getSettingValueByKey("trigger_cmd") + trigger_command = self.getSettingValueByKey("trigger_command") pause_length = self.getSettingValueByKey("pause_length") gcode_to_append = ";TimeLapse Begin\n" if park_print_head: gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Park print head\n" gcode_to_append += self.putValue(M = 400) + ";Wait for moves to finish\n" - gcode_to_append += trigger_cmd + ";Snap Photo\n" + gcode_to_append += trigger_command + ";Snap Photo\n" gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n" gcode_to_append += ";TimeLapse End\n" for layer in data: # Check that a layer is being printed lines = layer.split("\n") if ";LAYER:" in lines[0]: - in_layer = True - else: - in_layer = False - - if in_layer: index = data.index(layer) layer += gcode_to_append From 0286c701fdfef3754ae0a5840baef2fdec95526d Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 8 Mar 2019 17:00:17 +0100 Subject: [PATCH 48/48] Change setting_version to be the same as in current master Also change the profiles to act as global profiles and fix indentation. Contributes to CURA-6080. --- .../definitions/anycubic_chiron.def.json | 44 +++++++++---------- .../anycubic_chiron_draft.inst.cfg | 5 ++- .../anycubic_chiron_high.inst.cfg | 5 ++- .../anycubic_chiron_normal.inst.cfg | 5 ++- 4 files changed, 31 insertions(+), 28 deletions(-) diff --git a/resources/definitions/anycubic_chiron.def.json b/resources/definitions/anycubic_chiron.def.json index 78191d6cca..83c2056d76 100644 --- a/resources/definitions/anycubic_chiron.def.json +++ b/resources/definitions/anycubic_chiron.def.json @@ -7,21 +7,21 @@ "visible": true, "author": "Patrick Glatt", "manufacturer": "Anycubic", - "category": "Other", + "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "platform": "anycubic_chiron_platform.obj", - "platform_texture": "anycubic-chiron.png", + "platform_texture": "anycubic-chiron.png", "has_materials": true, - "preferred_material": "generic_pla", + "preferred_material": "generic_pla", "has_machine_quality": true, - "quality_definition": "anycubic_chiron", - "preferred_quality_type": "normal", + "quality_definition": "anycubic_chiron", + "preferred_quality_type": "normal", "machine_extruder_trains": { "0": "anycubic_chiron_extruder_0" - }, - "firmware_file": "MarlinChiron.hex" + }, + "firmware_file": "MarlinChiron.hex" }, "overrides": @@ -45,7 +45,7 @@ "machine_depth": { "default_value": 400 - }, + }, "machine_center_is_zero": { "default_value": false @@ -53,28 +53,28 @@ "gantry_height": { "default_value": 35 - }, - "machine_head_with_fans_polygon": - { - "default_value": - [ - [-45, 50], - [-45, -45], - [45, 50], - [45, -45] - ] - }, + }, + "machine_head_with_fans_polygon": + { + "default_value": + [ + [-45, 50], + [-45, -45], + [45, 50], + [45, -45] + ] + }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": "M107 ;Start with the fan off\nG21 ;Set units to millimeters\nG91 ;Change to relative positioning mode for retract filament and nozzle lifting\nG1 F200 E-3 ;Retract 3mm filament for a clean start\nG92 E0 ;Zero the extruded length\nG1 F1000 Z5 ;Lift the nozzle 5mm before homing axes\nG90 ;Absolute positioning\nM82 ;Set extruder to absolute mode too\nG28 X0 Y0 ;First move X/Y to min endstops\nG28 Z0 ;Then move Z to min endstops\nG1 F1000 Z15 ;After homing lift the nozzle 15mm before start printing\n" + "default_value": "M107 ;Start with the fan off\nG21 ;Set units to millimeters\nG91 ;Change to relative positioning mode for retract filament and nozzle lifting\nG1 F200 E-3 ;Retract 3mm filament for a clean start\nG92 E0 ;Zero the extruded length\nG1 F1000 Z5 ;Lift the nozzle 5mm before homing axes\nG90 ;Absolute positioning\nM82 ;Set extruder to absolute mode too\nG28 X0 Y0 ;First move X/Y to min endstops\nG28 Z0 ;Then move Z to min endstops\nG1 F1000 Z15 ;After homing lift the nozzle 15mm before start printing\n" }, "machine_end_gcode": { - "default_value": "G91 ;Change to relative positioning mode for filament retraction and nozzle lifting\nG1 F200 E-4;Retract the filament a bit before lifting the nozzle\nG1 F1000 Z5;Lift nozzle 5mm\nG90 ;Change to absolute positioning mode to prepare for part rermoval\nG1 X0 Y400 ;Move the print to max y pos for part rermoval\nM104 S0 ; Turn off hotend\nM106 S0 ; Turn off cooling fan\nM140 S0 ; Turn off bed\nM84 ; Disable motors\n" - } + "default_value": "G91 ;Change to relative positioning mode for filament retraction and nozzle lifting\nG1 F200 E-4;Retract the filament a bit before lifting the nozzle\nG1 F1000 Z5;Lift nozzle 5mm\nG90 ;Change to absolute positioning mode to prepare for part rermoval\nG1 X0 Y400 ;Move the print to max y pos for part rermoval\nM104 S0 ; Turn off hotend\nM106 S0 ; Turn off cooling fan\nM140 S0 ; Turn off bed\nM84 ; Disable motors\n" + } } } diff --git a/resources/quality/anycubic_chiron/anycubic_chiron_draft.inst.cfg b/resources/quality/anycubic_chiron/anycubic_chiron_draft.inst.cfg index 881abc1152..6011fdbb32 100644 --- a/resources/quality/anycubic_chiron/anycubic_chiron_draft.inst.cfg +++ b/resources/quality/anycubic_chiron/anycubic_chiron_draft.inst.cfg @@ -4,10 +4,11 @@ name = Draft definition = anycubic_chiron [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = draft -weight = 0 +weight = -2 +global_quality = True [values] acceleration_enabled = True diff --git a/resources/quality/anycubic_chiron/anycubic_chiron_high.inst.cfg b/resources/quality/anycubic_chiron/anycubic_chiron_high.inst.cfg index 1fa6cc413c..93561d9956 100644 --- a/resources/quality/anycubic_chiron/anycubic_chiron_high.inst.cfg +++ b/resources/quality/anycubic_chiron/anycubic_chiron_high.inst.cfg @@ -4,10 +4,11 @@ name = High definition = anycubic_chiron [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = high -weight = 2 +weight = 1 +global_quality = True [values] acceleration_enabled = True diff --git a/resources/quality/anycubic_chiron/anycubic_chiron_normal.inst.cfg b/resources/quality/anycubic_chiron/anycubic_chiron_normal.inst.cfg index e0c583f25c..d1496ff187 100644 --- a/resources/quality/anycubic_chiron/anycubic_chiron_normal.inst.cfg +++ b/resources/quality/anycubic_chiron/anycubic_chiron_normal.inst.cfg @@ -4,10 +4,11 @@ name = Normal definition = anycubic_chiron [metadata] -setting_version = 5 +setting_version = 7 type = quality quality_type = normal -weight = 1 +weight = 0 +global_quality = True [values] acceleration_enabled = True