From 8dd46be2ca8e68ce3a05dccd5437e348b869b7ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hajo=20Nils=20Krabbenho=CC=88ft?= Date: Sun, 20 Sep 2015 22:58:07 +0200 Subject: [PATCH 01/22] add _current_layer_jumps --- plugins/LayerView/LayerView.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 5055f6bd03..2ee2816eb4 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -29,6 +29,7 @@ class LayerView(View): self._max_layers = 10 self._current_layer_num = 10 self._current_layer_mesh = None + self._current_layer_jumps = None self._activity = False self._solid_layers = 5 @@ -47,6 +48,7 @@ class LayerView(View): def resetLayerData(self): self._current_layer_mesh = None + self._current_layer_jumps = None def beginRendering(self): scene = self.getController().getScene() @@ -111,6 +113,28 @@ class LayerView(View): if self._current_layer_mesh: renderer.queueNode(node, mesh = self._current_layer_mesh, material = self._material) + if not self._current_layer_jumps: + self._current_layer_jumps = MeshData() + for i in range(1): + layer = self._current_layer_num - i + if layer < 0: + continue + try: + layer_mesh = layer_data.getLayer(layer).createJumps() + if not layer_mesh or layer_mesh.getVertices() is None: + continue + except: + continue + + self._current_layer_jumps.addVertices(layer_mesh.getVertices()) + + # Scale layer color by a brightness factor based on the current layer number + # This will result in a range of 0.5 - 1.0 to multiply colors by. + brightness = (2.0 - (i / self._solid_layers)) / 2.0 + self._current_layer_jumps.addColors(layer_mesh.getColors() * brightness) + + renderer.queueNode(node, mesh = self._current_layer_jumps, material = self._material) + def setLayer(self, value): if self._current_layer_num != value: self._current_layer_num = value @@ -120,6 +144,7 @@ class LayerView(View): self._current_layer_num = self._max_layers self._current_layer_mesh = None + self._current_layer_jumps = None self.currentLayerNumChanged.emit() currentLayerNumChanged = Signal() From 5505d5dc74ab899d5cf61a1b8082215ad55de536 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hajo=20Nils=20Krabbenho=CC=88ft?= Date: Sun, 20 Sep 2015 23:10:11 +0200 Subject: [PATCH 02/22] introduce combind and retraction polygon types --- plugins/CuraEngineBackend/LayerData.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plugins/CuraEngineBackend/LayerData.py b/plugins/CuraEngineBackend/LayerData.py index 79c4477440..5c613ec6ef 100644 --- a/plugins/CuraEngineBackend/LayerData.py +++ b/plugins/CuraEngineBackend/LayerData.py @@ -117,9 +117,20 @@ class Layer(): return result def createMesh(self): + return self.createMeshOrJumps(True) + + def createJumps(self): + return self.createMeshOrJumps(False) + + def createMeshOrJumps(self, make_mesh): builder = MeshBuilder() for polygon in self._polygons: + if make_mesg and (polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType): + continue + if not make_mesg and not (polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType): + continue + poly_color = polygon.getColor() points = numpy.copy(polygon.data) @@ -175,6 +186,8 @@ class Polygon(): SkirtType = 5 InfillType = 6 SupportInfillType = 7 + MoveCombingType = 8 + MoveRetractionType = 9 def __init__(self, mesh, type, data, line_width): super().__init__() From cead06e925b56648d84ecc045723935dbb0f050e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hajo=20Nils=20Krabbenho=CC=88ft?= Date: Sun, 20 Sep 2015 23:11:38 +0200 Subject: [PATCH 03/22] colors --- plugins/CuraEngineBackend/LayerData.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/CuraEngineBackend/LayerData.py b/plugins/CuraEngineBackend/LayerData.py index 5c613ec6ef..0b3638f192 100644 --- a/plugins/CuraEngineBackend/LayerData.py +++ b/plugins/CuraEngineBackend/LayerData.py @@ -233,6 +233,10 @@ class Polygon(): return Color(1.0, 0.74, 0.0, 1.0) elif self._type == self.SupportInfillType: return Color(0.0, 1.0, 1.0, 1.0) + elif self._type == self.MoveCombingType: + return Color(0.0, 0.0, 1.0, 1.0) + elif self._type == self.MoveRetractionType: + return Color(0.5, 0.5, 1.0, 1.0) else: return Color(1.0, 1.0, 1.0, 1.0) From 3ed5a466a3ddde0c8430c9b54f47468f5b9456d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hajo=20Nils=20Krabbenho=CC=88ft?= Date: Sun, 20 Sep 2015 23:21:30 +0200 Subject: [PATCH 04/22] regenerate python protobuf reader --- plugins/CuraEngineBackend/Cura_pb2.py | 66 +++++++++++++++++---------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/plugins/CuraEngineBackend/Cura_pb2.py b/plugins/CuraEngineBackend/Cura_pb2.py index bb0b000541..54ddcaaa51 100644 --- a/plugins/CuraEngineBackend/Cura_pb2.py +++ b/plugins/CuraEngineBackend/Cura_pb2.py @@ -1,8 +1,6 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! # source: Cura.proto -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message from google.protobuf import reflection as _reflection @@ -18,7 +16,8 @@ _sym_db = _symbol_database.Default() DESCRIPTOR = _descriptor.FileDescriptor( name='Cura.proto', package='cura.proto', - serialized_pb=_b('\n\nCura.proto\x12\ncura.proto\"X\n\nObjectList\x12#\n\x07objects\x18\x01 \x03(\x0b\x32\x12.cura.proto.Object\x12%\n\x08settings\x18\x02 \x03(\x0b\x32\x13.cura.proto.Setting\"5\n\x05Slice\x12,\n\x0cobject_lists\x18\x01 \x03(\x0b\x32\x16.cura.proto.ObjectList\"o\n\x06Object\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x10\n\x08vertices\x18\x02 \x01(\x0c\x12\x0f\n\x07normals\x18\x03 \x01(\x0c\x12\x0f\n\x07indices\x18\x04 \x01(\x0c\x12%\n\x08settings\x18\x05 \x03(\x0b\x32\x13.cura.proto.Setting\"\x1a\n\x08Progress\x12\x0e\n\x06\x61mount\x18\x01 \x01(\x02\"=\n\x10SlicedObjectList\x12)\n\x07objects\x18\x01 \x03(\x0b\x32\x18.cura.proto.SlicedObject\"=\n\x0cSlicedObject\x12\n\n\x02id\x18\x01 \x01(\x03\x12!\n\x06layers\x18\x02 \x03(\x0b\x32\x11.cura.proto.Layer\"]\n\x05Layer\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0e\n\x06height\x18\x02 \x01(\x02\x12\x11\n\tthickness\x18\x03 \x01(\x02\x12%\n\x08polygons\x18\x04 \x03(\x0b\x32\x13.cura.proto.Polygon\"\xe1\x01\n\x07Polygon\x12&\n\x04type\x18\x01 \x01(\x0e\x32\x18.cura.proto.Polygon.Type\x12\x0e\n\x06points\x18\x02 \x01(\x0c\x12\x12\n\nline_width\x18\x03 \x01(\x02\"\x89\x01\n\x04Type\x12\x0c\n\x08NoneType\x10\x00\x12\x0e\n\nInset0Type\x10\x01\x12\x0e\n\nInsetXType\x10\x02\x12\x0c\n\x08SkinType\x10\x03\x12\x0f\n\x0bSupportType\x10\x04\x12\r\n\tSkirtType\x10\x05\x12\x0e\n\nInfillType\x10\x06\x12\x15\n\x11SupportInfillType\x10\x07\"&\n\nGCodeLayer\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"D\n\x0fObjectPrintTime\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0c\n\x04time\x18\x02 \x01(\x02\x12\x17\n\x0fmaterial_amount\x18\x03 \x01(\x02\"4\n\x0bSettingList\x12%\n\x08settings\x18\x01 \x03(\x0b\x32\x13.cura.proto.Setting\"&\n\x07Setting\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c\"\x1b\n\x0bGCodePrefix\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x62\x06proto3') + syntax='proto3', + serialized_pb=b'\n\nCura.proto\x12\ncura.proto\"X\n\nObjectList\x12#\n\x07objects\x18\x01 \x03(\x0b\x32\x12.cura.proto.Object\x12%\n\x08settings\x18\x02 \x03(\x0b\x32\x13.cura.proto.Setting\"5\n\x05Slice\x12,\n\x0cobject_lists\x18\x01 \x03(\x0b\x32\x16.cura.proto.ObjectList\"o\n\x06Object\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x10\n\x08vertices\x18\x02 \x01(\x0c\x12\x0f\n\x07normals\x18\x03 \x01(\x0c\x12\x0f\n\x07indices\x18\x04 \x01(\x0c\x12%\n\x08settings\x18\x05 \x03(\x0b\x32\x13.cura.proto.Setting\"\x1a\n\x08Progress\x12\x0e\n\x06\x61mount\x18\x01 \x01(\x02\"=\n\x10SlicedObjectList\x12)\n\x07objects\x18\x01 \x03(\x0b\x32\x18.cura.proto.SlicedObject\"=\n\x0cSlicedObject\x12\n\n\x02id\x18\x01 \x01(\x03\x12!\n\x06layers\x18\x02 \x03(\x0b\x32\x11.cura.proto.Layer\"]\n\x05Layer\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0e\n\x06height\x18\x02 \x01(\x02\x12\x11\n\tthickness\x18\x03 \x01(\x02\x12%\n\x08polygons\x18\x04 \x03(\x0b\x32\x13.cura.proto.Polygon\"\x8e\x02\n\x07Polygon\x12&\n\x04type\x18\x01 \x01(\x0e\x32\x18.cura.proto.Polygon.Type\x12\x0e\n\x06points\x18\x02 \x01(\x0c\x12\x12\n\nline_width\x18\x03 \x01(\x02\"\xb6\x01\n\x04Type\x12\x0c\n\x08NoneType\x10\x00\x12\x0e\n\nInset0Type\x10\x01\x12\x0e\n\nInsetXType\x10\x02\x12\x0c\n\x08SkinType\x10\x03\x12\x0f\n\x0bSupportType\x10\x04\x12\r\n\tSkirtType\x10\x05\x12\x0e\n\nInfillType\x10\x06\x12\x15\n\x11SupportInfillType\x10\x07\x12\x13\n\x0fMoveCombingType\x10\x08\x12\x16\n\x12MoveRetractionType\x10\t\"&\n\nGCodeLayer\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"D\n\x0fObjectPrintTime\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0c\n\x04time\x18\x02 \x01(\x02\x12\x17\n\x0fmaterial_amount\x18\x03 \x01(\x02\"4\n\x0bSettingList\x12%\n\x08settings\x18\x01 \x03(\x0b\x32\x13.cura.proto.Setting\"&\n\x07Setting\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c\"\x1b\n\x0bGCodePrefix\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x62\x06proto3' ) _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -62,11 +61,19 @@ _POLYGON_TYPE = _descriptor.EnumDescriptor( name='SupportInfillType', index=7, number=7, options=None, type=None), + _descriptor.EnumValueDescriptor( + name='MoveCombingType', index=8, number=8, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MoveRetractionType', index=9, number=9, + options=None, + type=None), ], containing_type=None, options=None, serialized_start=622, - serialized_end=759, + serialized_end=804, ) _sym_db.RegisterEnumDescriptor(_POLYGON_TYPE) @@ -100,6 +107,7 @@ _OBJECTLIST = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], @@ -130,6 +138,7 @@ _SLICE = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], @@ -155,21 +164,21 @@ _OBJECT = _descriptor.Descriptor( _descriptor.FieldDescriptor( name='vertices', full_name='cura.proto.Object.vertices', index=1, number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), + has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='normals', full_name='cura.proto.Object.normals', index=2, number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), + has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='indices', full_name='cura.proto.Object.indices', index=3, number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), + has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -188,6 +197,7 @@ _OBJECT = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], @@ -218,6 +228,7 @@ _PROGRESS = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], @@ -248,6 +259,7 @@ _SLICEDOBJECTLIST = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], @@ -285,6 +297,7 @@ _SLICEDOBJECT = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], @@ -336,6 +349,7 @@ _LAYER = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], @@ -361,7 +375,7 @@ _POLYGON = _descriptor.Descriptor( _descriptor.FieldDescriptor( name='points', full_name='cura.proto.Polygon.points', index=1, number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), + has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -381,11 +395,12 @@ _POLYGON = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], serialized_start=534, - serialized_end=759, + serialized_end=804, ) @@ -406,7 +421,7 @@ _GCODELAYER = _descriptor.Descriptor( _descriptor.FieldDescriptor( name='data', full_name='cura.proto.GCodeLayer.data', index=1, number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), + has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -418,11 +433,12 @@ _GCODELAYER = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], - serialized_start=761, - serialized_end=799, + serialized_start=806, + serialized_end=844, ) @@ -462,11 +478,12 @@ _OBJECTPRINTTIME = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], - serialized_start=801, - serialized_end=869, + serialized_start=846, + serialized_end=914, ) @@ -492,11 +509,12 @@ _SETTINGLIST = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], - serialized_start=871, - serialized_end=923, + serialized_start=916, + serialized_end=968, ) @@ -510,14 +528,14 @@ _SETTING = _descriptor.Descriptor( _descriptor.FieldDescriptor( name='name', full_name='cura.proto.Setting.name', index=0, number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='value', full_name='cura.proto.Setting.value', index=1, number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), + has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -529,11 +547,12 @@ _SETTING = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], - serialized_start=925, - serialized_end=963, + serialized_start=970, + serialized_end=1008, ) @@ -547,7 +566,7 @@ _GCODEPREFIX = _descriptor.Descriptor( _descriptor.FieldDescriptor( name='data', full_name='cura.proto.GCodePrefix.data', index=0, number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), + has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -559,11 +578,12 @@ _GCODEPREFIX = _descriptor.Descriptor( ], options=None, is_extendable=False, + syntax='proto3', extension_ranges=[], oneofs=[ ], - serialized_start=965, - serialized_end=992, + serialized_start=1010, + serialized_end=1037, ) _OBJECTLIST.fields_by_name['objects'].message_type = _OBJECT From 1e5a2ddab930286294ddcef7d89cd5bd8140beb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hajo=20Nils=20Krabbenho=CC=88ft?= Date: Mon, 21 Sep 2015 00:13:52 +0200 Subject: [PATCH 05/22] hide jumps from line view + fix solid display --- plugins/CuraEngineBackend/LayerData.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/LayerData.py b/plugins/CuraEngineBackend/LayerData.py index 0b3638f192..8d20a009e0 100644 --- a/plugins/CuraEngineBackend/LayerData.py +++ b/plugins/CuraEngineBackend/LayerData.py @@ -107,7 +107,7 @@ class Layer(): def build(self, offset, vertices, colors, indices): result = offset for polygon in self._polygons: - if polygon._type == Polygon.InfillType: + if polygon.type == Polygon.InfillType or polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType: continue polygon.build(result, vertices, colors, indices) @@ -126,9 +126,9 @@ class Layer(): builder = MeshBuilder() for polygon in self._polygons: - if make_mesg and (polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType): + if make_mesh and (polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType): continue - if not make_mesg and not (polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType): + if not make_mesh and not (polygon.type == Polygon.MoveCombingType or polygon.type == Polygon.MoveRetractionType): continue poly_color = polygon.getColor() From d77903871d046066605f97f1b67136e64aa1fb21 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 8 Oct 2015 11:53:05 +0200 Subject: [PATCH 06/22] Fix crash handler to not complain about debug_mode not being set --- cura/CrashHandler.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index b369717f79..57de2959eb 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -8,11 +8,10 @@ from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTex from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") -debug_mode = False - def show(exception_type, value, tb): - if QCoreApplication.instance() and QCoreApplication.instance().getCommandLineOption("debug-mode", False): - debug_mode = True + debug_mode = False + if QCoreApplication.instance(): + debug_mode = QCoreApplication.instance().getCommandLineOption("debug-mode", False) traceback.print_exception(exception_type, value, tb) From 9c6c06d501bc5ed01528ca8ce0ea449ca19dd31e Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 8 Oct 2015 17:48:22 +0200 Subject: [PATCH 07/22] Clean up "View" configuration page Contributes to CURA-211 --- resources/qml/ViewPage.qml | 90 +++++++++++++------------------------- 1 file changed, 31 insertions(+), 59 deletions(-) diff --git a/resources/qml/ViewPage.qml b/resources/qml/ViewPage.qml index 37a5024375..7b33345a9a 100644 --- a/resources/qml/ViewPage.qml +++ b/resources/qml/ViewPage.qml @@ -19,79 +19,51 @@ UM.PreferencesPage { UM.Preferences.resetPreference("view/show_overhang"); UM.Preferences.resetPreference("view/center_on_select"); - overhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang")) - centerCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select")) } - GridLayout + Column { - columns: 2; UM.I18nCatalog { id: catalog; name:"cura"} - CheckBox + + UM.TooltipArea { - id: overhangCheckbox - checked: boolCheck(UM.Preferences.getValue("view/show_overhang")) - onCheckedChanged: UM.Preferences.setValue("view/show_overhang", checked ? "True" : "False") - } - Button - { - id: viewText //is a button so the user doesn't have te click inconvenientley precise to enable or disable the checkbox + width: childrenRect.width; + height: childrenRect.height; - //: Display Overhang preference checkbox - text: catalog.i18nc("@option:check","Display Overhang"); - onClicked: overhangCheckbox.checked = !overhangCheckbox.checked + text: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will nog print properly.") - //: Display Overhang preference tooltip - tooltip: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will nog print properly.") - - style: ButtonStyle + CheckBox { - background: Rectangle - { - border.width: 0 - color: "transparent" - } - label: Text - { - renderType: Text.NativeRendering - horizontalAlignment: Text.AlignLeft - text: control.text - } + id: overhangCheckbox + + checked: boolCheck(UM.Preferences.getValue("view/show_overhang")) + onClicked: UM.Preferences.setValue("view/show_overhang", checked) + + text: catalog.i18nc("@option:check","Display Overhang"); } } - CheckBox - { - id: centerCheckbox - checked: boolCheck(UM.Preferences.getValue("view/center_on_select")) - onCheckedChanged: UM.Preferences.setValue("view/center_on_select", checked ? "True" : "False") - } - Button - { - id: centerText //is a button so the user doesn't have te click inconvenientley precise to enable or disable the checkbox + UM.TooltipArea { + width: childrenRect.width; + height: childrenRect.height; + text: catalog.i18nc("@info:tooltip","Moves the camera so the object is in the center of the view when an object is selected") - //: Display Overhang preference checkbox - text: catalog.i18nc("@action:button","Center camera when item is selected"); - onClicked: centerCheckbox.checked = !centerCheckbox.checked - - //: Display Overhang preference tooltip - tooltip: catalog.i18nc("@info:tooltip","Moves the camera so the object is in the center of the view when an object is selected") - - style: ButtonStyle + CheckBox { - background: Rectangle - { - border.width: 0 - color: "transparent" - } - label: Text - { - renderType: Text.NativeRendering - horizontalAlignment: Text.AlignLeft - text: control.text - } + id: centerCheckbox + text: catalog.i18nc("@action:button","Center camera when item is selected"); + checked: boolCheck(UM.Preferences.getValue("view/center_on_select")) + onClicked: UM.Preferences.setValue("view/center_on_select", checked) + } + } + + Connections { + target: UM.Preferences + onPreferenceChanged: + { + overhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang")) + centerCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select")) } } - Item { Layout.fillHeight: true; Layout.columnSpan: 2 } } } From a45dfe6a57302e033bc17f9850596827650da4b5 Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Fri, 9 Oct 2015 15:38:22 +0200 Subject: [PATCH 08/22] 15.10 Restyling of the post-processing-plugin Contributes to issue CURA-47 --- resources/themes/cura/theme.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index f2b908e52e..63e04c6e6e 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -32,10 +32,11 @@ "capitalize": true, "family": "Roboto" }, - "timeslider_time": { + "default_header": { "size": 1.0, "bold": true, - "family": "Roboto" + "family": "Roboto", + "letterSpacing": 2.0 }, "button_tooltip": { "size": 0.75, From 9aeb9bb37d7728dcf6103bed915ca2066c3caee1 Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Fri, 9 Oct 2015 17:18:14 +0200 Subject: [PATCH 09/22] cleanup --- resources/qml/SaveButton.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 7254711917..c1af9c18e6 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -270,7 +270,6 @@ Rectangle { height: parent.height UM.RecolorImage { - id: lengthIcon anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter width: UM.Theme.sizes.standard_arrow.width From a855da5c4c4c18a8e8fb99628a8a39cb569444ee Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Mon, 12 Oct 2015 18:39:53 +0200 Subject: [PATCH 10/22] contributes to #CURA-256 --- resources/qml/WizardPages/AddMachine.qml | 9 +-------- resources/qml/WizardPages/SelectUpgradedParts.qml | 14 ++++++++++++-- resources/qml/WizardPages/UltimakerCheckup.qml | 13 ++++++------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/resources/qml/WizardPages/AddMachine.qml b/resources/qml/WizardPages/AddMachine.qml index cd0713a34d..2ac479d276 100644 --- a/resources/qml/WizardPages/AddMachine.qml +++ b/resources/qml/WizardPages/AddMachine.qml @@ -128,14 +128,7 @@ Item text: model.name - onClicked: { - ListView.view.currentIndex = index; - if(model.pages.length > 0) { - base.wizard.nextAvailable = true; - } else { - base.wizard.nextAvailable = false; - } - } + onClicked: ListView.view.currentIndex = index; Label { diff --git a/resources/qml/WizardPages/SelectUpgradedParts.qml b/resources/qml/WizardPages/SelectUpgradedParts.qml index 4275defdbf..409b1ad5c9 100644 --- a/resources/qml/WizardPages/SelectUpgradedParts.qml +++ b/resources/qml/WizardPages/SelectUpgradedParts.qml @@ -50,15 +50,25 @@ Item } CheckBox { + id: heatedBedCheckBox1 text: catalog.i18nc("@option:check","Heated printer bed (standard kit)") y: checkBox.height * 1 - onClicked: UM.MachineManager.setMachineSettingValue("machine_heated_bed", true) + onClicked: { + UM.MachineManager.setMachineSettingValue("machine_heated_bed", true) + if (heatedBedCheckBox2.checked == true) + heatedBedCheckBox2.checked = false + } } CheckBox { + id: heatedBedCheckBox2 text: catalog.i18nc("@option:check","Heated printer bed (self built)") y: checkBox.height * 2 - onClicked: UM.MachineManager.setMachineSettingValue("machine_heated_bed", true) + onClicked: { + UM.MachineManager.setMachineSettingValue("machine_heated_bed", true) + if (heatedBedCheckBox1.checked == true) + heatedBedCheckBox1.checked = false + } } CheckBox { diff --git a/resources/qml/WizardPages/UltimakerCheckup.qml b/resources/qml/WizardPages/UltimakerCheckup.qml index 5f1ab3ee2e..97d89186de 100644 --- a/resources/qml/WizardPages/UltimakerCheckup.qml +++ b/resources/qml/WizardPages/UltimakerCheckup.qml @@ -20,7 +20,7 @@ Item property bool heater_works: false property int extruder_target_temp: 0 property int bed_target_temp: 0 - property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.rowCount() != 0 ? UM.USBPrinterManager.connectedPrinterList.getItem(0).printer: null + property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.rowCount() != 0 ? UM.USBPrinterManager.connectedPrinterList.getItem(0).printer : null UM.I18nCatalog { id: catalog; name:"cura"} Component.onCompleted: @@ -65,7 +65,6 @@ Item anchors.top: parent.top anchors.left: parent.left text: catalog.i18nc("@action:button","Start Printer Check"); - enabled: manager.progress >= 100; onClicked: { checkupContent.visible = true startCheckButton.enabled = false @@ -80,7 +79,6 @@ Item anchors.left: parent.width < wizardPage.width ? startCheckButton.right : parent.left anchors.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0 text: catalog.i18nc("@action:button","Skip Printer Check"); - enabled: manager.progress >= 100; onClicked: { base.currentPage += 1 } @@ -109,7 +107,7 @@ Item anchors.left: connectionLabel.right anchors.top: parent.top wrapMode: Text.WordWrap - text: UM.USBPrinterManager.connectedPrinterList.count ? catalog.i18nc("@info:status","Done"):catalog.i18nc("@info:status","Incomplete") + text: UM.USBPrinterManager.connectedPrinterList.rowCount() > 0 ? catalog.i18nc("@info:status","Done"):catalog.i18nc("@info:status","Incomplete") } ////////////////////////////////////////////////////////// Label @@ -205,7 +203,7 @@ Item { if(printer_connection != null) { - heater_status_label.text = catalog.i18nc("@info:progress","Checking") + nozzleTempStatus.text = catalog.i18nc("@info:progress","Checking") printer_connection.heatupNozzle(190) wizardPage.extruder_target_temp = 190 } @@ -300,13 +298,14 @@ Item z_min_pressed = true } } + onExtruderTemperatureChanged: { if(printer_connection.extruderTemperature > wizardPage.extruder_target_temp - 10 && printer_connection.extruderTemperature < wizardPage.extruder_target_temp + 10) { if(printer_connection != null) { - heater_status_label.text = catalog.i18nc("@info:status","Works") + nozzleTempStatus.text = catalog.i18nc("@info:status","Works") printer_connection.heatupNozzle(0) } } @@ -315,7 +314,7 @@ Item { if(printer_connection.bedTemperature > wizardPage.bed_target_temp - 5 && printer_connection.bedTemperature < wizardPage.bed_target_temp + 5) { - bed_status_label.text = catalog.i18nc("@info:status","Works") + bedTempStatus.text = catalog.i18nc("@info:status","Works") printer_connection.heatupBed(0) } } From 3bbefd588bd5c37e358d5054a534aea15c851e57 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 13 Oct 2015 15:40:40 +0200 Subject: [PATCH 11/22] Increase the amount of spacing from platform physics This creates a stable situation more quickly CURA-203 #Start-Review --- cura/PlatformPhysics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index aaaf650819..2e4d77b77f 100644 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -127,8 +127,8 @@ class PlatformPhysics: if overlap is None: continue - move_vector.setX(overlap[0] * 1.01) - move_vector.setZ(overlap[1] * 1.01) + move_vector.setX(overlap[0] * 1.1) + move_vector.setZ(overlap[1] * 1.1) convex_hull = node.callDecoration("getConvexHull") if convex_hull: if not convex_hull.isValid(): From 463fbae9aaa302cb86c9b062586f4cea6af895e7 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 13 Oct 2015 18:42:01 +0200 Subject: [PATCH 12/22] Fail loading the 3MF file if no meshes were found This way we indicate loading the 3MF file failed instead of indicating success but not actually loading anything. CURA-236 --- plugins/3MFReader/ThreeMFReader.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 9b6c63c309..9ca8875543 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -42,6 +42,10 @@ class ThreeMFReader(MeshReader): # There can be multiple objects, try to load all of them. objects = root.findall("./3mf:resources/3mf:object", self._namespaces) + if len(objects) == 0: + Logger.log("w", "No objects found in 3MF file %s, either the file is corrupt or you are using an outdated format", file_name) + return None + for object in objects: mesh = MeshData() node = SceneNode() @@ -53,18 +57,18 @@ class ThreeMFReader(MeshReader): triangles = object.findall(".//3mf:triangle", self._namespaces) mesh.reserveFaceCount(len(triangles)) - + #for triangle in object.mesh.triangles.triangle: for triangle in triangles: v1 = int(triangle.get("v1")) v2 = int(triangle.get("v2")) v3 = int(triangle.get("v3")) mesh.addFace(vertex_list[v1][0],vertex_list[v1][1],vertex_list[v1][2],vertex_list[v2][0],vertex_list[v2][1],vertex_list[v2][2],vertex_list[v3][0],vertex_list[v3][1],vertex_list[v3][2]) - #TODO: We currently do not check for normals and simply recalculate them. + #TODO: We currently do not check for normals and simply recalculate them. mesh.calculateNormals() node.setMeshData(mesh) node.setSelectable(True) - + transformation = root.findall("./3mf:build/3mf:item[@objectid='{0}']".format(object.get("id")), self._namespaces) if transformation: transformation = transformation[0] @@ -88,25 +92,25 @@ class ThreeMFReader(MeshReader): temp_mat._data[0,2] = splitted_transformation[6] temp_mat._data[1,2] = splitted_transformation[7] temp_mat._data[2,2] = splitted_transformation[8] - + # Translation temp_mat._data[0,3] = splitted_transformation[9] temp_mat._data[1,3] = splitted_transformation[10] temp_mat._data[2,3] = splitted_transformation[11] - + node.setPosition(Vector(temp_mat.at(0,3), temp_mat.at(1,3), temp_mat.at(2,3))) - + temp_quaternion = Quaternion() temp_quaternion.setByMatrix(temp_mat) node.setOrientation(temp_quaternion) - + # Magical scale extraction S2 = temp_mat.getTransposed().multiply(temp_mat) scale_x = math.sqrt(S2.at(0,0)) scale_y = math.sqrt(S2.at(1,1)) scale_z = math.sqrt(S2.at(2,2)) node.setScale(Vector(scale_x,scale_y,scale_z)) - + # We use a different coordinate frame, so rotate. rotation = Quaternion.fromAngleAxis(-0.5 * math.pi, Vector(1,0,0)) node.rotate(rotation) From 861b535f9d1c6f04f39628b8b735a047e0d8c5d7 Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Wed, 14 Oct 2015 11:53:53 +0200 Subject: [PATCH 13/22] Implementing missing functionalities on the addmachine -> add original wizard contributes to #CURA-256 --- plugins/USBPrinting/PrinterConnection.py | 8 +- resources/qml/WizardPages/Bedleveling.qml | 43 ++++++--- .../qml/WizardPages/SelectUpgradedParts.qml | 6 -- .../qml/WizardPages/UltimakerCheckup.qml | 89 ++++++++++++++++--- resources/qml/WizardPages/UpgradeFirmware.qml | 4 + 5 files changed, 117 insertions(+), 33 deletions(-) diff --git a/plugins/USBPrinting/PrinterConnection.py b/plugins/USBPrinting/PrinterConnection.py index 323452b67c..b1ac8603cc 100644 --- a/plugins/USBPrinting/PrinterConnection.py +++ b/plugins/USBPrinting/PrinterConnection.py @@ -46,6 +46,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): self._end_stop_thread = threading.Thread(target = self._pollEndStop) self._end_stop_thread.deamon = True + self._poll_endstop = -1 # Printer is connected self._is_connected = False @@ -237,8 +238,9 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): @pyqtSlot() def startPollEndstop(self): - self._poll_endstop = True - self._end_stop_thread.start() + if self._poll_endstop == -1: + self._poll_endstop = True + self._end_stop_thread.start() @pyqtSlot() def stopPollEndstop(self): @@ -346,7 +348,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): self._serial = None def isConnected(self): - return self._is_connected + return self._is_connected @pyqtSlot(int) def heatupNozzle(self, temperature): diff --git a/resources/qml/WizardPages/Bedleveling.qml b/resources/qml/WizardPages/Bedleveling.qml index e8c3500eae..9bb9f4f652 100644 --- a/resources/qml/WizardPages/Bedleveling.qml +++ b/resources/qml/WizardPages/Bedleveling.qml @@ -15,6 +15,7 @@ Item property bool three_point_leveling: true property int platform_width: UM.MachineManager.getSettingValue("machine_width") property int platform_height: UM.MachineManager.getSettingValue("machine_depth") + property bool alreadyTested: base.addOriginalProgress.bedLeveling anchors.fill: parent; property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer Component.onCompleted: printer_connection.homeHead() @@ -40,7 +41,7 @@ Item } Label { - id: bedelevelingText + id: bedlevelingText anchors.top: pageDescription.bottom anchors.topMargin: UM.Theme.sizes.default_margin.height width: parent.width @@ -49,47 +50,69 @@ Item } Item{ - anchors.top: bedelevelingText.bottom + id: bedlevelingWrapper + anchors.top: bedlevelingText.bottom anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.horizontalCenter: parent.horizontalCenter - width: bedelevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height < wizardPage.width ? bedelevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height : wizardPage.width + height: skipBedlevelingButton.height + width: bedlevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height < wizardPage.width ? bedlevelingButton.width + skipBedlevelingButton.width + UM.Theme.sizes.default_margin.height : wizardPage.width Button { - id: bedelevelingButton + id: bedlevelingButton anchors.top: parent.top anchors.left: parent.left + enabled: !alreadyTested text: catalog.i18nc("@action:button","Move to Next Position"); onClicked: { if(wizardPage.leveling_state == 0) { - printer_connection.moveHead(platform_width /2 , platform_height,0) + printer_connection.moveHead(platform_width, 0 ,0) } if(wizardPage.leveling_state == 1) { - printer_connection.moveHead(platform_width , 0,0) + printer_connection.moveHead(platform_width/2, platform_height, 0) } if(wizardPage.leveling_state == 2) { - printer_connection.moveHead(0, 0 ,0) + printer_connection.moveHead(0, 0, 0) } wizardPage.leveling_state++ - + if (wizardPage.leveling_state >= 3){ + base.addOriginalProgress.bedLeveling = true + resultText.visible = true + skipBedlevelingButton.enabled = false + bedlevelingButton.enabled = false + wizardPage.leveling_state = 0 + } } } Button { id: skipBedlevelingButton - anchors.top: parent.width < wizardPage.width ? parent.top : bedelevelingButton.bottom + enabled: !alreadyTested + anchors.top: parent.width < wizardPage.width ? parent.top : bedlevelingButton.bottom anchors.topMargin: parent.width < wizardPage.width ? 0 : UM.Theme.sizes.default_margin.height/2 - anchors.left: parent.width < wizardPage.width ? bedelevelingButton.right : parent.left + anchors.left: parent.width < wizardPage.width ? bedlevelingButton.right : parent.left anchors.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0 text: catalog.i18nc("@action:button","Skip Bedleveling"); onClicked: base.visible = false; } } + Label + { + id: resultText + visible: alreadyTested + anchors.top: bedlevelingWrapper.bottom + anchors.topMargin: UM.Theme.sizes.default_margin.height + anchors.left: parent.left + width: parent.width + wrapMode: Text.WordWrap + text: catalog.i18nc("@label", "Everythink is in order! You're done with bedeleveling.") + } + function threePointLeveling(width, height) { diff --git a/resources/qml/WizardPages/SelectUpgradedParts.qml b/resources/qml/WizardPages/SelectUpgradedParts.qml index 409b1ad5c9..8680a478e9 100644 --- a/resources/qml/WizardPages/SelectUpgradedParts.qml +++ b/resources/qml/WizardPages/SelectUpgradedParts.qml @@ -70,12 +70,6 @@ Item heatedBedCheckBox1.checked = false } } - CheckBox - { - text: catalog.i18nc("@option:check","Dual extrusion (experimental)") - y: checkBox.height * 3 - enabled: false; - } } Label diff --git a/resources/qml/WizardPages/UltimakerCheckup.qml b/resources/qml/WizardPages/UltimakerCheckup.qml index 97d89186de..a917098b42 100644 --- a/resources/qml/WizardPages/UltimakerCheckup.qml +++ b/resources/qml/WizardPages/UltimakerCheckup.qml @@ -14,24 +14,51 @@ Item property int leftRow: wizardPage.width*0.40 property int rightRow: wizardPage.width*0.60 anchors.fill: parent; + property bool alreadyTested: base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length-1] property bool x_min_pressed: false property bool y_min_pressed: false property bool z_min_pressed: false property bool heater_works: false property int extruder_target_temp: 0 property int bed_target_temp: 0 - property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.rowCount() != 0 ? UM.USBPrinterManager.connectedPrinterList.getItem(0).printer : null + property variant printer_connection: { + if (UM.USBPrinterManager.connectedPrinterList.rowCount() != 0){ + base.addOriginalProgress.checkUp[0] = true + checkTotalCheckUp() + return UM.USBPrinterManager.connectedPrinterList.getItem(0).printer + } + else { + return null + } + } + //property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.getItem(0).printer UM.I18nCatalog { id: catalog; name:"cura"} + function checkTotalCheckUp(){ + var allDone = true + for (var i = 0; i < (base.addOriginalProgress.checkUp.length - 1); i++){ + if (base.addOriginalProgress.checkUp[i] == false){ + allDone = false + } + } + if (allDone == true){ + base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length] = true + skipCheckButton.enabled = false + resultText.visible = true + } + } + Component.onCompleted: { - if (printer_connection != null) + if (printer_connection != null){ printer_connection.startPollEndstop() + } } Component.onDestruction: { - if (printer_connection != null) + if (printer_connection != null){ printer_connection.stopPollEndstop() + } } Label { @@ -64,10 +91,12 @@ Item id: startCheckButton anchors.top: parent.top anchors.left: parent.left + enabled: !alreadyTested text: catalog.i18nc("@action:button","Start Printer Check"); onClicked: { checkupContent.visible = true startCheckButton.enabled = false + printer_connection.homeHead() } } @@ -78,6 +107,7 @@ Item anchors.topMargin: parent.width < wizardPage.width ? 0 : UM.Theme.sizes.default_margin.height/2 anchors.left: parent.width < wizardPage.width ? startCheckButton.right : parent.left anchors.leftMargin: parent.width < wizardPage.width ? UM.Theme.sizes.default_margin.width : 0 + enabled: !alreadyTested text: catalog.i18nc("@action:button","Skip Printer Check"); onClicked: { base.currentPage += 1 @@ -89,7 +119,7 @@ Item id: checkupContent anchors.top: startStopButtons.bottom anchors.topMargin: UM.Theme.sizes.default_margin.height - visible: false + visible: alreadyTested ////////////////////////////////////////////////////////// Label { @@ -107,7 +137,7 @@ Item anchors.left: connectionLabel.right anchors.top: parent.top wrapMode: Text.WordWrap - text: UM.USBPrinterManager.connectedPrinterList.rowCount() > 0 ? catalog.i18nc("@info:status","Done"):catalog.i18nc("@info:status","Incomplete") + text: UM.USBPrinterManager.connectedPrinterList.rowCount() > 0 || alreadyTested ? catalog.i18nc("@info:status","Done"):catalog.i18nc("@info:status","Incomplete") } ////////////////////////////////////////////////////////// Label @@ -126,7 +156,7 @@ Item anchors.left: endstopXLabel.right anchors.top: connectionLabel.bottom wrapMode: Text.WordWrap - text: x_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") + text: x_min_pressed || alreadyTested ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") } ////////////////////////////////////////////////////////////// Label @@ -145,7 +175,7 @@ Item anchors.left: endstopYLabel.right anchors.top: endstopXLabel.bottom wrapMode: Text.WordWrap - text: y_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") + text: y_min_pressed || alreadyTested ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") } ///////////////////////////////////////////////////////////////////// Label @@ -164,7 +194,7 @@ Item anchors.left: endstopZLabel.right anchors.top: endstopYLabel.bottom wrapMode: Text.WordWrap - text: z_min_pressed ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") + text: z_min_pressed || alreadyTested ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") } //////////////////////////////////////////////////////////// Label @@ -203,9 +233,14 @@ Item { if(printer_connection != null) { - nozzleTempStatus.text = catalog.i18nc("@info:progress","Checking") - printer_connection.heatupNozzle(190) - wizardPage.extruder_target_temp = 190 + if (alreadyTested){ + nozzleTempStatus.text = catalog.i18nc("@info:status","Works") + } + else { + nozzleTempStatus.text = catalog.i18nc("@info:progress","Checking") + printer_connection.heatupNozzle(190) + wizardPage.extruder_target_temp = 190 + } } } } @@ -259,9 +294,14 @@ Item { if(printer_connection != null) { - bedTempStatus.text = catalog.i18nc("@info:progress","Checking") - printer_connection.heatupBed(60) - wizardPage.bed_target_temp = 60 + if (alreadyTested){ + bedTempStatus.text = catalog.i18nc("@info:status","Works") + } + else { + bedTempStatus.text = catalog.i18nc("@info:progress","Checking") + printer_connection.heatupBed(60) + wizardPage.bed_target_temp = 60 + } } } } @@ -277,6 +317,17 @@ Item text: printer_connection != null ? printer_connection.bedTemperature + "°C": "0°C" font.bold: true } + Label + { + id: resultText + visible: base.addOriginalProgress.checkUp[base.addOriginalProgress.checkUp.length-1] + anchors.top: bedTemp.bottom + anchors.topMargin: UM.Theme.sizes.default_margin.height + anchors.left: parent.left + width: parent.width + wrapMode: Text.WordWrap + text: catalog.i18nc("@label", "Everything is in order! You're done with your CheckUp.") + } } @@ -287,15 +338,21 @@ Item { if(key == "x_min") { + base.addOriginalProgress.checkUp[1] = true x_min_pressed = true + checkTotalCheckUp() } if(key == "y_min") { + base.addOriginalProgress.checkUp[2] = true y_min_pressed = true + checkTotalCheckUp() } if(key == "z_min") { + base.addOriginalProgress.checkUp[3] = true z_min_pressed = true + checkTotalCheckUp() } } @@ -306,6 +363,8 @@ Item if(printer_connection != null) { nozzleTempStatus.text = catalog.i18nc("@info:status","Works") + base.addOriginalProgress.checkUp[4] = true + checkTotalCheckUp() printer_connection.heatupNozzle(0) } } @@ -315,6 +374,8 @@ Item if(printer_connection.bedTemperature > wizardPage.bed_target_temp - 5 && printer_connection.bedTemperature < wizardPage.bed_target_temp + 5) { bedTempStatus.text = catalog.i18nc("@info:status","Works") + base.addOriginalProgress.checkUp[5] = true + checkTotalCheckUp() printer_connection.heatupBed(0) } } diff --git a/resources/qml/WizardPages/UpgradeFirmware.qml b/resources/qml/WizardPages/UpgradeFirmware.qml index edf075ee60..1e91ea2468 100644 --- a/resources/qml/WizardPages/UpgradeFirmware.qml +++ b/resources/qml/WizardPages/UpgradeFirmware.qml @@ -14,6 +14,7 @@ Item SystemPalette{id: palette} UM.I18nCatalog { id: catalog; name:"cura"} + property variant printer_connection: UM.USBPrinterManager.connectedPrinterList.rowCount() != 0 ? UM.USBPrinterManager.connectedPrinterList.getItem(0).printer : null Label { id: pageTitle @@ -61,6 +62,9 @@ Item anchors.top: parent.top anchors.left: parent.left text: catalog.i18nc("@action:button","Upgrade to Marlin Firmware"); + onClicked: { + printer_connection.updateAllFirmware + } } Button { id: skipUpgradeButton From ead30e71ecd413f9f9e497ff01dd4c0f85bf5130 Mon Sep 17 00:00:00 2001 From: Nicanor Romero Venier Date: Wed, 14 Oct 2015 12:49:43 +0200 Subject: [PATCH 14/22] Added profiles for 2nd Gen printers from BQ --- resources/machines/bq_hephestos_2.json | 71 +++++++++++++++++++++++++ resources/machines/bq_witbox_2.json | 71 +++++++++++++++++++++++++ resources/meshes/bq_hephestos_2.stl | Bin 0 -> 377184 bytes 3 files changed, 142 insertions(+) create mode 100644 resources/machines/bq_hephestos_2.json create mode 100644 resources/machines/bq_witbox_2.json create mode 100644 resources/meshes/bq_hephestos_2.stl diff --git a/resources/machines/bq_hephestos_2.json b/resources/machines/bq_hephestos_2.json new file mode 100644 index 0000000000..7fb2a82f5a --- /dev/null +++ b/resources/machines/bq_hephestos_2.json @@ -0,0 +1,71 @@ +{ + "id": "bq_hephestos_2", + "version": 1, + "name": "BQ Hephestos 2", + "manufacturer": "Other", + "author": "BQ", + "platform": "bq_hephestos_2.stl", + "inherits": "fdmprinter.json", + + "machine_settings": { + "machine_start_gcode": { + "default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" + }, + "machine_width": { + "default": 210 + }, + "machine_depth": { + "default": 297 + }, + "machine_height": { + "default": 220 + }, + "machine_heated_bed": { + "default": false + }, + "machine_center_is_zero": { + "default": false + }, + "machine_gcode_flavor": { + "default": "RepRap" + }, + "machine_platform_offset": { + "default": [-6, 1320, 0] + } + }, + "overrides": { + "bottom_thickness": { "default": 1.2, "visible": true }, + "cool_fan_full_at_height": { "default": 0.8, "visible": false }, + "speed_wall_0": { "default": 35.0, "visible": false }, + "material_diameter": { "default": 1.75 }, + "layer_height_0": { "default": 0.2, "visible": true }, + "speed_layer_0": { "default": 35.0, "visible": true }, + "infill_overlap": { "default": 15.0, "visible": false }, + "layer_height": { "default": 0.2 }, + "cool_min_speed": { "default": 20.0, "visible": false }, + "speed_wall_x": { "default": 35.0, "visible": false }, + "wall_line_count": { "default": 3, "visible": false }, + "retraction_amount": { "default": 4.0, "visible": false }, + "retract_hop": { "default": 0.075, "visible": false }, + "retraction_speed": { "default": 45.0, "visible": false }, + "skirt_gap": { "default": 7.0 }, + "skirt_line_count": { "default": 4 }, + "speed_infill": { "default": 50.0, "visible": true }, + "material_print_temperature": { "default": 220.0, "visible": true }, + "speed_topbottom": { "default": 35.0, "visible": false }, + "top_thickness": { "default": 1.2, "visible": false }, + "top_layers": { "default": 6, "visible": false }, + "speed_travel": { "default": 150.0 }, + "shell_thickness": { "default": 1.2 }, + "wall_thickness": { "default": 1.2, "visible": false }, + "top_bottom_thickness": { "default": 1.2, "visible": false }, + "material_bed_temperature": { "default": 0 }, + "support_enable": { "default": false }, + "speed_print": { "default": 50.0 }, + "skirt_speed": { "default": 35.0, "visible": false }, + "skirt_minimal_length": { "default": 300.0, "visible": false } + } +} diff --git a/resources/machines/bq_witbox_2.json b/resources/machines/bq_witbox_2.json new file mode 100644 index 0000000000..a6a0ca07ae --- /dev/null +++ b/resources/machines/bq_witbox_2.json @@ -0,0 +1,71 @@ +{ + "id": "bq_witbox_2", + "version": 1, + "name": "BQ Witbox 2", + "manufacturer": "Other", + "author": "BQ", + "platform": "witbox_platform.stl", + "inherits": "fdmprinter.json", + + "machine_settings": { + "machine_start_gcode": { + "default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" + }, + "machine_width": { + "default": 297 + }, + "machine_depth": { + "default": 210 + }, + "machine_height": { + "default": 200 + }, + "machine_heated_bed": { + "default": false + }, + "machine_center_is_zero": { + "default": false + }, + "machine_gcode_flavor": { + "default": "RepRap" + }, + "machine_platform_offset": { + "default": [0, -145, -38] + } + }, + "overrides": { + "bottom_thickness": { "default": 1.2, "visible": true }, + "cool_fan_full_at_height": { "default": 0.8, "visible": false }, + "speed_wall_0": { "default": 35.0, "visible": false }, + "material_diameter": { "default": 1.75 }, + "layer_height_0": { "default": 0.2, "visible": true }, + "speed_layer_0": { "default": 35.0, "visible": true }, + "infill_overlap": { "default": 15.0, "visible": false }, + "layer_height": { "default": 0.2 }, + "cool_min_speed": { "default": 20.0, "visible": false }, + "speed_wall_x": { "default": 35.0, "visible": false }, + "wall_line_count": { "default": 3, "visible": false }, + "retraction_amount": { "default": 4.0, "visible": false }, + "retract_hop": { "default": 0.075, "visible": false }, + "retraction_speed": { "default": 45.0, "visible": false }, + "skirt_gap": { "default": 7.0 }, + "skirt_line_count": { "default": 4 }, + "speed_infill": { "default": 50.0, "visible": true }, + "material_print_temperature": { "default": 220.0, "visible": true }, + "speed_topbottom": { "default": 35.0, "visible": false }, + "top_thickness": { "default": 1.2, "visible": false }, + "top_layers": { "default": 6, "visible": false }, + "speed_travel": { "default": 150.0 }, + "shell_thickness": { "default": 1.2 }, + "wall_thickness": { "default": 1.2, "visible": false }, + "top_bottom_thickness": { "default": 1.2, "visible": false }, + "material_bed_temperature": { "default": 0 }, + "support_enable": { "default": false }, + "speed_print": { "default": 50.0 }, + "skirt_speed": { "default": 35.0, "visible": false }, + "skirt_minimal_length": { "default": 300.0, "visible": false } + } +} diff --git a/resources/meshes/bq_hephestos_2.stl b/resources/meshes/bq_hephestos_2.stl new file mode 100644 index 0000000000000000000000000000000000000000..3a3a89eba4a6e206cadcd9763af8b89dd4408363 GIT binary patch literal 377184 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 U)Ou~u%0qLZ9q+2Qif$4AAChu#Y5)KL literal 0 HcmV?d00001 From f9f0969a6d2ef1ab348ac57e784a6cff65c1ae50 Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Wed, 14 Oct 2015 15:00:27 +0200 Subject: [PATCH 15/22] Fixes problems with the upgraded parts page of the add Original wizard The setMachineSettingValue functionalities are now bound to whether the checkboxes are checked or not instead of onClicked. Also the wizard now saves the values, so the user cannot get confused when revisiting this part of the wizard. commits to #143 contributes to #CURA-256 --- .../qml/WizardPages/SelectUpgradedParts.qml | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/resources/qml/WizardPages/SelectUpgradedParts.qml b/resources/qml/WizardPages/SelectUpgradedParts.qml index 8680a478e9..4e84e61ec6 100644 --- a/resources/qml/WizardPages/SelectUpgradedParts.qml +++ b/resources/qml/WizardPages/SelectUpgradedParts.qml @@ -14,6 +14,19 @@ Item SystemPalette{id: palette} UM.I18nCatalog { id: catalog; name:"cura"} + + Component.onDestruction: + { + base.addOriginalProgress.upgrades[0] = extruderCheckBox.checked + base.addOriginalProgress.upgrades[1] = heatedBedCheckBox1.checked + base.addOriginalProgress.upgrades[2] = heatedBedCheckBox2.checked + if (extruderCheckBox.checked == true){ + UM.MachineManager.setMachineSettingValue("machine_extruder_drive_upgrade", true); + } + if (heatedBedCheckBox1.checked == true || heatedBedCheckBox2.checked == true){ + UM.MachineManager.setMachineSettingValue("machine_heated_bed", true) + } + } Label { id: pageTitle @@ -43,18 +56,17 @@ Item width: parent.width - UM.Theme.sizes.default_margin.width CheckBox { - id: checkBox + id: extruderCheckBox text: catalog.i18nc("@option:check","Extruder driver ugrades") - checked: true - onClicked: UM.MachineManager.setMachineSettingValue("machine_extruder_drive_upgrade", true); + checked: base.addOriginalProgress.upgrades[0] } CheckBox { id: heatedBedCheckBox1 text: catalog.i18nc("@option:check","Heated printer bed (standard kit)") - y: checkBox.height * 1 + y: extruderCheckBox.height * 1 + checked: base.addOriginalProgress.upgrades[1] onClicked: { - UM.MachineManager.setMachineSettingValue("machine_heated_bed", true) if (heatedBedCheckBox2.checked == true) heatedBedCheckBox2.checked = false } @@ -63,9 +75,9 @@ Item { id: heatedBedCheckBox2 text: catalog.i18nc("@option:check","Heated printer bed (self built)") - y: checkBox.height * 2 + y: extruderCheckBox.height * 2 + checked: base.addOriginalProgress.upgrades[2] onClicked: { - UM.MachineManager.setMachineSettingValue("machine_heated_bed", true) if (heatedBedCheckBox1.checked == true) heatedBedCheckBox1.checked = false } From ed693d57a99b7ac86f11bb86466f56caae100e4f Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Wed, 14 Oct 2015 16:03:29 +0200 Subject: [PATCH 16/22] Fixes that the firmware update kan be called from the add machine -> add UMO wizard fixes #CURA-256 --- plugins/USBPrinting/USBPrinterManager.py | 1 + resources/qml/WizardPages/UpgradeFirmware.qml | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterManager.py b/plugins/USBPrinting/USBPrinterManager.py index d2168b523b..1249c454ff 100644 --- a/plugins/USBPrinting/USBPrinterManager.py +++ b/plugins/USBPrinting/USBPrinterManager.py @@ -84,6 +84,7 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension): self._firmware_view.show() + @pyqtSlot() def updateAllFirmware(self): self.spawnFirmwareInterface("") for printer_connection in self._printer_connections: diff --git a/resources/qml/WizardPages/UpgradeFirmware.qml b/resources/qml/WizardPages/UpgradeFirmware.qml index 1e91ea2468..f7031febe3 100644 --- a/resources/qml/WizardPages/UpgradeFirmware.qml +++ b/resources/qml/WizardPages/UpgradeFirmware.qml @@ -62,9 +62,7 @@ Item anchors.top: parent.top anchors.left: parent.left text: catalog.i18nc("@action:button","Upgrade to Marlin Firmware"); - onClicked: { - printer_connection.updateAllFirmware - } + onClicked: UM.USBPrinterManager.updateAllFirmware() } Button { id: skipUpgradeButton From 4ceb48c3fd7f67716b2549a99c7a0de26eb36b97 Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Wed, 14 Oct 2015 16:19:24 +0200 Subject: [PATCH 17/22] Makes the page display the separate test-values. When the user doesn't finish the checkup and later on re-checks on it, it doens't look like they can't proceed with the check-up. fixes #CURA-256 --- resources/qml/WizardPages/UltimakerCheckup.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/qml/WizardPages/UltimakerCheckup.qml b/resources/qml/WizardPages/UltimakerCheckup.qml index a917098b42..6ef87ef069 100644 --- a/resources/qml/WizardPages/UltimakerCheckup.qml +++ b/resources/qml/WizardPages/UltimakerCheckup.qml @@ -137,7 +137,7 @@ Item anchors.left: connectionLabel.right anchors.top: parent.top wrapMode: Text.WordWrap - text: UM.USBPrinterManager.connectedPrinterList.rowCount() > 0 || alreadyTested ? catalog.i18nc("@info:status","Done"):catalog.i18nc("@info:status","Incomplete") + text: UM.USBPrinterManager.connectedPrinterList.rowCount() > 0 || base.addOriginalProgress.checkUp[0] ? catalog.i18nc("@info:status","Done"):catalog.i18nc("@info:status","Incomplete") } ////////////////////////////////////////////////////////// Label @@ -156,7 +156,7 @@ Item anchors.left: endstopXLabel.right anchors.top: connectionLabel.bottom wrapMode: Text.WordWrap - text: x_min_pressed || alreadyTested ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") + text: x_min_pressed || base.addOriginalProgress.checkUp[1] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") } ////////////////////////////////////////////////////////////// Label @@ -175,7 +175,7 @@ Item anchors.left: endstopYLabel.right anchors.top: endstopXLabel.bottom wrapMode: Text.WordWrap - text: y_min_pressed || alreadyTested ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") + text: y_min_pressed || base.addOriginalProgress.checkUp[2] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") } ///////////////////////////////////////////////////////////////////// Label @@ -194,7 +194,7 @@ Item anchors.left: endstopZLabel.right anchors.top: endstopYLabel.bottom wrapMode: Text.WordWrap - text: z_min_pressed || alreadyTested ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") + text: z_min_pressed || base.addOriginalProgress.checkUp[3] ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") } //////////////////////////////////////////////////////////// Label From 58d5487eb900c0eac055e72449aa8eb4505e91b6 Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Wed, 14 Oct 2015 16:36:12 +0200 Subject: [PATCH 18/22] The print job name changes to empty when there is no mesh. Only the machine abbreviation remains. fixes #CURA-122 --- resources/qml/SaveButton.qml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index c1af9c18e6..70b43ffb72 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -61,6 +61,13 @@ Rectangle { } } + onActivityChanged: { + if (activity == false){ + base.fileBaseName = '' + base.createFileName() + } + } + Rectangle{ id: printJobRow implicitWidth: base.width; From 769ff84c15f0e8d31576fe680e17f6278679ea4d Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 14 Oct 2015 17:57:00 +0200 Subject: [PATCH 19/22] Delay showing the main window a little so we do not get garbage on the window CURA-160 #Start-Review --- resources/qml/Cura.qml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 93bc311da1..25b6cf534c 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -670,18 +670,22 @@ UM.MainWindow Component.onCompleted: { UM.Theme.load(UM.Resources.getPath(UM.Resources.Themes, "cura")) - visible = true; - addMachineTimer.start(); } Timer { - id: addMachineTimer; + id: startupTimer; interval: 100; repeat: false; + running: true; onTriggered: { - if(UM.MachineManager.activeMachineInstance == "") + if(!base.visible) + { + base.visible = true; + restart(); + } + else if(UM.MachineManager.activeMachineInstance == "") { addMachineWizard.firstRun = true; addMachineWizard.open(); From e42ffb23cae1edb90c6c36cfe263dbd514ae435c Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 15 Oct 2015 01:04:32 +0200 Subject: [PATCH 20/22] Move the infill pattern and infill overlap settings back as children of infill_density This makes the inherit functions work properly --- resources/machines/fdmprinter.json | 50 +++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/resources/machines/fdmprinter.json b/resources/machines/fdmprinter.json index 9ca44a7e86..577181a63a 100644 --- a/resources/machines/fdmprinter.json +++ b/resources/machines/fdmprinter.json @@ -455,32 +455,32 @@ "visible": false, "inherit_function": "0 if parent_value == 0 else (infill_line_width * 100) / parent_value" } - } - }, - "infill_pattern": { - "label": "Infill Pattern", - "description": "Cura defaults to switching between grid and line infill. But with this setting visible you can control this yourself. The line infill swaps direction on alternate layers of infill, while the grid prints the full cross-hatching on each layer of infill.", - "type": "enum", - "visible": false, - "options": { - "grid": "Grid", - "lines": "Lines", - "concentric": "Concentric", - "zigzag": "Zig Zag" }, - "default": "grid", - "inherit_function": "'lines' if parent_value > 25 else 'grid'" - }, - "infill_overlap": { - "label": "Infill Overlap", - "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", - "unit": "%", - "type": "float", - "default": 10, - "min_value": "0", - "max_value": "100", - "inherit_function": "10 if infill_sparse_density < 95 else 0", - "visible": false + "infill_pattern": { + "label": "Infill Pattern", + "description": "Cura defaults to switching between grid and line infill. But with this setting visible you can control this yourself. The line infill swaps direction on alternate layers of infill, while the grid prints the full cross-hatching on each layer of infill.", + "type": "enum", + "visible": false, + "options": { + "grid": "Grid", + "lines": "Lines", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default": "grid", + "inherit_function": "'lines' if parent_value > 25 else 'grid'" + }, + "infill_overlap": { + "label": "Infill Overlap", + "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", + "unit": "%", + "type": "float", + "default": 10, + "min_value": "0", + "max_value": "100", + "inherit_function": "10 if infill_sparse_density < 95 else 0", + "visible": false + } }, "infill_wipe_dist": { "label": "Infill Wipe Distance", From 0b9047f6ca4e73ce3ea157b000251cbf16f7c4a5 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 15 Oct 2015 09:42:52 +0200 Subject: [PATCH 21/22] Properly set the current folder on file open This makes sure the next time the file dialog is opened the last folder used is openend. CURA-246 #Start-Review --- resources/qml/Cura.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 25b6cf534c..8d42bce562 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -636,6 +636,11 @@ UM.MainWindow onAccepted: { + //Because several implementations of the file dialog only update the folder + //when it is explicitly set. + var f = folder; + folder = f; + UM.MeshFileHandler.readLocalFile(fileUrl) openDialog.sendMeshName(fileUrl.toString()) } From 6effacb1deaa7d9e2b166b97f5e2f3970175874f Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Fri, 16 Oct 2015 10:15:01 +0200 Subject: [PATCH 22/22] Change infill settings back to not being children of infill density For some reason, making them children causes them to disappear --- resources/machines/fdmprinter.json | 53 +++++++++++++++--------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/resources/machines/fdmprinter.json b/resources/machines/fdmprinter.json index 577181a63a..98bed779b1 100644 --- a/resources/machines/fdmprinter.json +++ b/resources/machines/fdmprinter.json @@ -275,7 +275,8 @@ "description": "Make an extra wall at every second layer, so that infill will be caught between an extra wall above and one below. This results in a better cohesion between infill and walls, but might have an impact on the surface quality.", "type": "boolean", "default": false, - "visible": false + "visible": false, + "inherit": false }, "top_bottom_thickness": { "label": "Bottom/Top Thickness", @@ -455,33 +456,33 @@ "visible": false, "inherit_function": "0 if parent_value == 0 else (infill_line_width * 100) / parent_value" } - }, - "infill_pattern": { - "label": "Infill Pattern", - "description": "Cura defaults to switching between grid and line infill. But with this setting visible you can control this yourself. The line infill swaps direction on alternate layers of infill, while the grid prints the full cross-hatching on each layer of infill.", - "type": "enum", - "visible": false, - "options": { - "grid": "Grid", - "lines": "Lines", - "concentric": "Concentric", - "zigzag": "Zig Zag" - }, - "default": "grid", - "inherit_function": "'lines' if parent_value > 25 else 'grid'" - }, - "infill_overlap": { - "label": "Infill Overlap", - "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", - "unit": "%", - "type": "float", - "default": 10, - "min_value": "0", - "max_value": "100", - "inherit_function": "10 if infill_sparse_density < 95 else 0", - "visible": false } }, + "infill_pattern": { + "label": "Infill Pattern", + "description": "Cura defaults to switching between grid and line infill. But with this setting visible you can control this yourself. The line infill swaps direction on alternate layers of infill, while the grid prints the full cross-hatching on each layer of infill.", + "type": "enum", + "visible": false, + "options": { + "grid": "Grid", + "lines": "Lines", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default": "grid", + "inherit_function": "'lines' if infill_sparse_density > 25 else 'grid'" + }, + "infill_overlap": { + "label": "Infill Overlap", + "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", + "unit": "%", + "type": "float", + "default": 10, + "min_value": "0", + "max_value": "100", + "inherit_function": "10 if infill_sparse_density < 95 else 0", + "visible": false + }, "infill_wipe_dist": { "label": "Infill Wipe Distance", "description": "Distance of a travel move inserted after every infill line, to make the infill stick to the walls better. This option is imilar to infill overlap, but without extrusion and only on one end of the infill line.",