From 933def40b2ad6e54e911cac3510414d049596172 Mon Sep 17 00:00:00 2001 From: Nicanor Romero Venier Date: Tue, 18 Aug 2015 16:22:32 +0200 Subject: [PATCH 01/49] Modified some settings in profiles --- resources/settings/hephestos.json | 49 +++++++++++----------------- resources/settings/hephestos_xl.json | 47 ++++++++++---------------- resources/settings/witbox.json | 38 ++++++++------------- 3 files changed, 51 insertions(+), 83 deletions(-) diff --git a/resources/settings/hephestos.json b/resources/settings/hephestos.json index 5ff301b07c..5d6bf49ed8 100644 --- a/resources/settings/hephestos.json +++ b/resources/settings/hephestos.json @@ -1,15 +1,15 @@ { - "id": "hephestos", + "id": "bq_hephestos", "version": 1, "name": "BQ Prusa i3 Hephestos", "manufacturer": "BQ", - "author": "other", + "author": "BQ", "platform": "hephestos_platform.stl", "inherits": "fdmprinter.json", "machine_settings": { "machine_start_gcode": { - "default": "; -- START GCODE --\n;Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + "default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" }, "machine_end_gcode": { "default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" @@ -33,39 +33,28 @@ "default": "RepRap" }, "machine_platform_offset": { - "default": [0.0, 100.0, 0.0] + "default": [0, 100, 0] } }, - - "overrides": { + "overrides": { "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": true }, - "shell_thickness": { "default": 1.2 }, - "wall_thickness": { "default": 1.2, "visible": false }, - "top_bottom_thickness": { "default": 0.8, "visible": false }, - "bottom_thickness": { "default": 0.4, "visible": false }, + "layer_height_0": { "default": 0.2, "visible": false }, + "shell_thickness": { "default": 1.0 }, + "wall_thickness": { "default": 1.0, "visible": false }, + "top_bottom_thickness": { "default": 1.0, "visible": false}, + "bottom_thickness": { "default": 1.0, "visible": false }, "material_print_temperature": { "default": 220, "visible": true }, "material_bed_temperature": { "default": 0, "visible": false }, "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 40.0 }, - "speed_infill": { "default": 40.0, "visible": false }, - "speed_wall": { "default":35.0, "visible": false }, - "speed_wall_0": { "default": 35.0, "visible": false }, - "speed_wall_x": { "default": 35.0, "visible": false }, - "speed_topbottom": { "default": 35.0, "visible": false }, - "speed_support": { "default": 35.0, "visible": false }, - "speed_travel": { "default": 110.0 }, + "speed_print": { "default": 40.0}, + "speed_infill": { "default": 40.0, "visible": true }, + "speed_wall": { "default": 35.0, "visible": true}, + "speed_topbottom": { "default": 35.0, "visible": true }, + "speed_travel": { "default": 120.0 }, "speed_layer_0": { "default": 20.0, "visible": false }, - "retraction_speed": { "default": 30.0, "visible": true }, - "retraction_retract_speed": { "default": 30.0, "visible": true }, - "retraction_prime_speed": { "default": 30.0, "visible": true }, - "retraction_amount": { "default": 2.0, "visible": true }, - "retraction_hop": { "default": 0.75, "visible": false }, - "skirt_minimal_length": { "default": 150 }, - "raft_base_line_width": { "default": 0.7 }, - "raft_interface_thickness": { "default": 0.2 }, - "support_enable": { "default": true }, - "support_z_distance": { "default": 0.2, "visible": false }, - "support_infill_rate": { "default": 10, "visible": false } + "retraction_speed": { "default": 30.0, "visible": false}, + "retraction_amount": { "default": 2.0, "visible": false }, + "retraction_hop": { "default": 0.075, "visible": false }, + "support_enable": { "default": true } } } diff --git a/resources/settings/hephestos_xl.json b/resources/settings/hephestos_xl.json index 8e52bc03b4..a6849bb8e0 100644 --- a/resources/settings/hephestos_xl.json +++ b/resources/settings/hephestos_xl.json @@ -1,15 +1,15 @@ { - "id": "hephestos_xl", + "id": "bq_hephestos_xl", "version": 1, "name": "BQ Prusa i3 Hephestos XL", "manufacturer": "BQ", - "author": "other", + "author": "BQ", "platform": "hephestos_platform.stl", "inherits": "fdmprinter.json", "machine_settings": { "machine_start_gcode": { - "default": "; -- START GCODE --\n;Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + "default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" }, "machine_end_gcode": { "default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" @@ -33,39 +33,28 @@ "default": "RepRap" }, "machine_platform_offset": { - "default": [0.0, 100.0, 0.0] + "default": [0, 100, 0] } }, - "overrides": { "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": true }, - "shell_thickness": { "default": 1.2 }, - "wall_thickness": { "default": 1.2, "visible": false }, - "top_bottom_thickness": { "default": 0.8, "visible": false }, - "bottom_thickness": { "default": 0.4, "visible": false }, + "layer_height_0": { "default": 0.2, "visible": false }, + "shell_thickness": { "default": 1.0 }, + "wall_thickness": { "default": 1.0, "visible": false }, + "top_bottom_thickness": { "default": 1.0, "visible": false}, + "bottom_thickness": { "default": 1.0, "visible": false }, "material_print_temperature": { "default": 220, "visible": true }, "material_bed_temperature": { "default": 0, "visible": false }, "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 40.0 }, - "speed_infill": { "default": 40.0, "visible": false }, - "speed_wall": { "default":35.0, "visible": false }, - "speed_wall_0": { "default": 35.0, "visible": false }, - "speed_wall_x": { "default": 35.0, "visible": false }, - "speed_topbottom": { "default": 35.0, "visible": false }, - "speed_support": { "default": 35.0, "visible": false }, - "speed_travel": { "default": 110.0 }, + "speed_print": { "default": 40.0}, + "speed_infill": { "default": 40.0, "visible": true }, + "speed_wall": { "default": 35.0, "visible": true}, + "speed_topbottom": { "default": 35.0, "visible": true }, + "speed_travel": { "default": 120.0 }, "speed_layer_0": { "default": 20.0, "visible": false }, - "retraction_speed": { "default": 30.0, "visible": true }, - "retraction_retract_speed": { "default": 30.0, "visible": true }, - "retraction_prime_speed": { "default": 30.0, "visible": true }, - "retraction_amount": { "default": 2.0, "visible": true }, - "retraction_hop": { "default": 0.75, "visible": false }, - "skirt_minimal_length": { "default": 150 }, - "raft_base_line_width": { "default": 0.7 }, - "raft_interface_thickness": { "default": 0.2 }, - "support_enable": { "default": true }, - "support_z_distance": { "default": 0.2, "visible": false }, - "support_infill_rate": { "default": 10, "visible": false } + "retraction_speed": { "default": 30.0, "visible": false}, + "retraction_amount": { "default": 2.0, "visible": false }, + "retraction_hop": { "default": 0.075, "visible": false }, + "support_enable": { "default": true } } } diff --git a/resources/settings/witbox.json b/resources/settings/witbox.json index 4e27b5886d..0351dd7e00 100644 --- a/resources/settings/witbox.json +++ b/resources/settings/witbox.json @@ -3,13 +3,13 @@ "version": 1, "name": "BQ Witbox", "manufacturer": "BQ", - "author": "other", + "author": "BQ", "platform": "witbox_platform.stl", "inherits": "fdmprinter.json", "machine_settings": { "machine_start_gcode": { - "default": "; -- START GCODE --\n;Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + "default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" }, "machine_end_gcode": { "default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" @@ -38,33 +38,23 @@ }, "overrides": { "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": true }, - "shell_thickness": { "default": 1.2}, - "wall_thickness": { "default": 1.2, "visible": false }, - "top_bottom_thickness": { "default": 0.8, "visible": false}, - "bottom_thickness": { "default": 0.4, "visible": false }, + "layer_height_0": { "default": 0.2, "visible": false }, + "shell_thickness": { "default": 1.0 }, + "wall_thickness": { "default": 1.0, "visible": false }, + "top_bottom_thickness": { "default": 1.0, "visible": false}, + "bottom_thickness": { "default": 1.0, "visible": false }, "material_print_temperature": { "default": 220, "visible": true }, "material_bed_temperature": { "default": 0, "visible": false }, "material_diameter": { "default": 1.75, "visible": true }, "speed_print": { "default": 40.0}, - "speed_infill": { "default": 40.0, "visible": false }, - "speed_wall": { "default":35.0, "visible": false}, - "speed_wall_0": { "default": 35.0, "visible": false }, - "speed_wall_x": { "default": 35.0, "visible": false }, - "speed_topbottom": { "default": 35.0, "visible": false }, - "speed_support": { "default": 35.0, "visible": false }, + "speed_infill": { "default": 40.0, "visible": true }, + "speed_wall": { "default": 35.0, "visible": true}, + "speed_topbottom": { "default": 35.0, "visible": true }, "speed_travel": { "default": 120.0 }, "speed_layer_0": { "default": 20.0, "visible": false }, - "retraction_speed": { "default": 30.0, "visible": true}, - "retraction_retract_speed": { "default": 30.0, "visible": true }, - "retraction_prime_speed": { "default": 30.0, "visible": true }, - "retraction_amount": { "default": 2.0, "visible": true }, - "retraction_hop": { "default": 0.75, "visible": false }, - "skirt_minimal_length": { "default": 150 }, - "raft_base_line_width": { "default": 0.7 }, - "raft_interface_thickness": { "default": 0.2 }, - "support_enable": { "default": true }, - "support_z_distance": { "default": 0.2, "visible": false }, - "support_infill_rate": { "default": 10, "visible": false } + "retraction_speed": { "default": 30.0, "visible": false}, + "retraction_amount": { "default": 2.0, "visible": false }, + "retraction_hop": { "default": 0.075, "visible": false }, + "support_enable": { "default": true } } } From 56e4fb71ad80074b504fe2b54e1e193644e68f41 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 18 Aug 2015 16:27:35 +0200 Subject: [PATCH 02/49] JSON: extruder_nr was still present in UMO and UM2 --- resources/settings/dual_extrusion_printer.json | 10 +++++++++- resources/settings/ultimaker2.json | 9 --------- resources/settings/ultimaker_original.json | 9 --------- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/resources/settings/dual_extrusion_printer.json b/resources/settings/dual_extrusion_printer.json index 64e9060c76..1b034ccd76 100644 --- a/resources/settings/dual_extrusion_printer.json +++ b/resources/settings/dual_extrusion_printer.json @@ -4,7 +4,15 @@ "inherits": "fdmprinter.json", "machine_settings": { - "extruder_nr": { "default": 0 }, + "extruder_nr": { + "label": "Extruder", + "description": "The extruder train used for printing. This is used in multi-extrusion.", + "type": "int", + "default": 0, + "min_value": 0, + "max_value": 16, + "inherit_function": "extruder_nr" + }, "machine_use_extruder_offset_to_offset_coords": { "default": false }, diff --git a/resources/settings/ultimaker2.json b/resources/settings/ultimaker2.json index 0e42d73688..64c008c5d4 100644 --- a/resources/settings/ultimaker2.json +++ b/resources/settings/ultimaker2.json @@ -13,15 +13,6 @@ "machine_extruder_trains": [ { - "extruder_nr": { - "label": "Extruder", - "description": "The extruder train used for printing. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": 0, - "max_value": 16, - "inherit_function": "extruder_nr" - }, "machine_nozzle_size": { "default": 0.4 }, diff --git a/resources/settings/ultimaker_original.json b/resources/settings/ultimaker_original.json index 5dde73fcf7..84849abb83 100644 --- a/resources/settings/ultimaker_original.json +++ b/resources/settings/ultimaker_original.json @@ -18,15 +18,6 @@ "machine_extruder_trains": [ { - "extruder_nr": { - "label": "Extruder", - "description": "The extruder train used for printing. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": 0, - "max_value": 16, - "inherit_function": "extruder_nr" - }, "machine_nozzle_size": { "default": 0.4 }, From 6047d85c7f9bd5a02cc778ca01afe4210f10ac25 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 18 Aug 2015 17:14:22 +0200 Subject: [PATCH 03/49] JSON: 100% infill bugfix: 100% infill now triggers all layers to be bottom layers --- resources/settings/fdmprinter.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index d06ecf49f3..7dc8f6db27 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -321,7 +321,7 @@ "default": 6, "type": "int", "visible": false, - "inherit_function": "math.ceil(parent_value / layer_height)" + "inherit_function": "0 if support_infill_rate == 100 else math.ceil(parent_value / layer_height)" } } }, @@ -341,7 +341,7 @@ "default": 6, "type": "int", "visible": false, - "inherit_function": "math.ceil(parent_value / layer_height)" + "inherit_function": "999999 if support_infill_rate == 100 else math.ceil(parent_value / layer_height)" } } } From 4dd2b15ab517c0fb351642218e710c3897b756eb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Aug 2015 09:43:54 +0200 Subject: [PATCH 04/49] Added force reslice function --- plugins/CuraEngineBackend/CuraEngineBackend.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index f6b56b9386..461839f708 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -241,6 +241,10 @@ class CuraEngineBackend(Backend): self._socket.registerMessageType(6, Cura_pb2.SettingList) self._socket.registerMessageType(7, Cura_pb2.GCodePrefix) + ## Manually triggers a reslice + def forceSlice(self): + self._change_timer.start() + def _onChanged(self): if not self._settings: return From 752a4b26faa4396c90e7aa073f894f4a0c2e79fb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Aug 2015 09:50:14 +0200 Subject: [PATCH 05/49] Forced reset of progress when no model was found on platform --- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 461839f708..26c4488857 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -130,6 +130,7 @@ class CuraEngineBackend(Backend): if not getattr(node, "_outside_buildarea", False): temp_list.append(node) if len(temp_list) == 0: + self.processingProgress.emit(0.0) return object_groups.append(temp_list) #for node in DepthFirstIterator(self._scene.getRoot()): From a85347134ea97e1c87e99b27de53059f8cf9ef43 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Aug 2015 10:34:40 +0200 Subject: [PATCH 06/49] Added check to see if requested layer is in the list. contributes to #193 --- plugins/CuraEngineBackend/LayerData.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/LayerData.py b/plugins/CuraEngineBackend/LayerData.py index c793c17504..597839ea39 100644 --- a/plugins/CuraEngineBackend/LayerData.py +++ b/plugins/CuraEngineBackend/LayerData.py @@ -28,7 +28,8 @@ class LayerData(MeshData): self._layers[layer].polygons.append(p) def getLayer(self, layer): - return self._layers[layer] + if layer in self._layers: + return self._layers[layer] def getLayers(self): return self._layers From 48ea6308965bf2fdda2255bcdca97b1c3dc50d7e Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 24 Aug 2015 12:05:31 +0200 Subject: [PATCH 07/49] JSON: new: z_seam_type; bugfix: inherit for top/bottom when 100% infill --- resources/settings/fdmprinter.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index 7dc8f6db27..c46d92b9a4 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -321,7 +321,7 @@ "default": 6, "type": "int", "visible": false, - "inherit_function": "0 if support_infill_rate == 100 else math.ceil(parent_value / layer_height)" + "inherit_function": "0 if infill_sparse_density == 100 else math.ceil(parent_value / layer_height)" } } }, @@ -341,7 +341,7 @@ "default": 6, "type": "int", "visible": false, - "inherit_function": "999999 if support_infill_rate == 100 else math.ceil(parent_value / layer_height)" + "inherit_function": "999999 if infill_sparse_density == 100 else math.ceil(parent_value / layer_height)" } } } @@ -433,6 +433,18 @@ "type": "float", "default": 0, "visible": false + }, + "z_seam_type": { + "label": "Z Seam Alignment", + "description": "Starting point of each part in a layer. When parts in consecutive layers start at the same point a vertical seam may show on the print. When aligning these at the back, the seam is easiest to remove. When placed randomly the inaccuracies at the part start will be less noticable. When taking the shortest path the print will be more quick.", + "type": "enum", + "options": [ + "Back", + "Shortest", + "Random" + ], + "default": "Shortest", + "visible": false } } }, From 45aef7903b88808afe9f35df7686ee5c6e9fe737 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Aug 2015 13:26:34 +0200 Subject: [PATCH 08/49] Duplicate object now also copies rotation. Fixes Ultimaker/Cura#281 --- cura/CuraApplication.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1584eaa9ab..da9d0a3543 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -264,8 +264,10 @@ class CuraApplication(QtApplication): for i in range(count): new_node = SceneNode() new_node.setMeshData(node.getMeshData()) - new_node.setScale(node.getScale()) + new_node.translate(Vector((i + 1) * node.getBoundingBox().width, 0, 0)) + new_node.setOrientation(node.getOrientation()) + new_node.setScale(node.getScale()) new_node.setSelectable(True) op.addOperation(AddSceneNodeOperation(new_node, node.getParent())) op.push() From 88ae6dfac11d24e39343bde72f29c3fb07cad44d Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 24 Aug 2015 13:55:38 +0200 Subject: [PATCH 09/49] JSON: polygon or polygons objects should now have "type": "polygon" --- resources/settings/fdmprinter.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index 6a91a43eab..4c3b8943a3 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -40,6 +40,7 @@ "default": "RepRap" }, "machine_disallowed_areas": { + "type": "polygons", "default": [] }, "machine_platform_offset": { @@ -50,6 +51,7 @@ ] }, "machine_head_polygon": { + "type": "polygon", "default": [ [ -1, @@ -71,6 +73,7 @@ }, "machine_head_with_fans_polygon": { + "type": "polygon", "default": [ [ -20, From ed24f5e451518f911357b850366696ac537c7194 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Aug 2015 14:37:20 +0200 Subject: [PATCH 10/49] Duplication now takes sunk into bottom into account. Fixes Ultimaker/Cura#286 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index da9d0a3543..70c1496ec2 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -265,7 +265,7 @@ class CuraApplication(QtApplication): new_node = SceneNode() new_node.setMeshData(node.getMeshData()) - new_node.translate(Vector((i + 1) * node.getBoundingBox().width, 0, 0)) + new_node.translate(Vector((i + 1) * node.getBoundingBox().width, node.getPosition().y, 0)) new_node.setOrientation(node.getOrientation()) new_node.setScale(node.getScale()) new_node.setSelectable(True) From 856ca783e45e5206530049f8488ba8fb4b572f19 Mon Sep 17 00:00:00 2001 From: Nicanor Romero Venier Date: Mon, 24 Aug 2015 16:10:47 +0200 Subject: [PATCH 11/49] Renamed BQ printer profiles --- resources/settings/{hephestos.json => bq_hephestos.json} | 0 resources/settings/{hephestos_xl.json => bq_hephestos_xl.json} | 0 resources/settings/{witbox.json => bq_witbox.json} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename resources/settings/{hephestos.json => bq_hephestos.json} (100%) rename resources/settings/{hephestos_xl.json => bq_hephestos_xl.json} (100%) rename resources/settings/{witbox.json => bq_witbox.json} (100%) diff --git a/resources/settings/hephestos.json b/resources/settings/bq_hephestos.json similarity index 100% rename from resources/settings/hephestos.json rename to resources/settings/bq_hephestos.json diff --git a/resources/settings/hephestos_xl.json b/resources/settings/bq_hephestos_xl.json similarity index 100% rename from resources/settings/hephestos_xl.json rename to resources/settings/bq_hephestos_xl.json diff --git a/resources/settings/witbox.json b/resources/settings/bq_witbox.json similarity index 100% rename from resources/settings/witbox.json rename to resources/settings/bq_witbox.json From 96c63ef6e9d30bc38efdbfab00d5fba2bb2903c3 Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Mon, 24 Aug 2015 17:05:24 +0200 Subject: [PATCH 12/49] 15.10 Restyling of the message stack Contributes to: issue CURA-60 --- resources/themes/cura/icons/cross2.svg | 10 ++++++++++ resources/themes/cura/styles.qml | 9 +++------ resources/themes/cura/theme.json | 3 ++- 3 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 resources/themes/cura/icons/cross2.svg diff --git a/resources/themes/cura/icons/cross2.svg b/resources/themes/cura/icons/cross2.svg new file mode 100644 index 0000000000..dda0b9d501 --- /dev/null +++ b/resources/themes/cura/icons/cross2.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index 0810989304..a2d7fe7c7b 100644 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -205,26 +205,23 @@ QtObject { background:Rectangle { implicitWidth: UM.Theme.sizes.message.width - (UM.Theme.sizes.default_margin.width * 2) implicitHeight: UM.Theme.sizes.progressbar.height - x: UM.Theme.sizes.default_margin.width color: UM.Theme.colors.progressbar_background } progress: Rectangle { color: control.indeterminate ? "transparent" : UM.Theme.colors.progressbar_control - Rectangle{ color: UM.Theme.colors.progressbar_control width: UM.Theme.sizes.progressbar_control.width height: UM.Theme.sizes.progressbar_control.height - x: UM.Theme.sizes.default_margin.width visible: control.indeterminate SequentialAnimation on x { id: xAnim - property int animEndPoint: UM.Theme.sizes.message.width - UM.Theme.sizes.default_margin.width - UM.Theme.sizes.progressbar_control.width + property int animEndPoint: UM.Theme.sizes.message.width - (UM.Theme.sizes.default_margin.width * 2) - UM.Theme.sizes.progressbar_control.width running: control.indeterminate loops: Animation.Infinite - NumberAnimation { from: UM.Theme.sizes.default_margin.width; to: xAnim.animEndPoint; duration: 2000;} - NumberAnimation { from: xAnim.animEndPoint; to: UM.Theme.sizes.default_margin.width; duration: 2000;} + NumberAnimation { from: 0; to: xAnim.animEndPoint; duration: 2000;} + NumberAnimation { from: xAnim.animEndPoint; to: 0; duration: 2000;} } } } diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 413a653d3c..1e3f24e1f2 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -132,7 +132,8 @@ "save_button_background": [249, 249, 249, 255], "message_background": [255, 255, 255, 255], - "message_text": [12, 169, 227, 255], + "message_text": [32, 166, 219, 255], + "message_dismiss": [139, 143, 153, 255], "tool_panel_background": [255, 255, 255, 255] }, From 289f9df67e01d92f544c2c4b27859f742465dc95 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 25 Aug 2015 09:19:30 +0200 Subject: [PATCH 13/49] moved infill_pattern outside density ; made retraction visible by default --- resources/settings/fdmprinter.json | 31 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index 4c3b8943a3..5e1537738a 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -448,20 +448,6 @@ "type": "float", "default": 20, "children": { - "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", - "Lines", - "Concentric", - "ZigZag" - ], - "default": "Grid", - "inherit_function": "'Lines' if parent_value > 25 else 'Grid'" - }, "infill_line_distance": { "label": "Line distance", "description": "Distance between the printed infill lines.", @@ -473,6 +459,20 @@ } } }, + "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", + "Lines", + "Concentric", + "ZigZag" + ], + "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.", @@ -556,7 +556,8 @@ "label": "Enable Retraction", "description": "Retract the filament when the nozzle is moving over a non-printed area. Details about the retraction can be configured in the advanced tab.", "type": "boolean", - "default": true + "default": true, + "visible": true }, "retraction_amount": { "label": "Retraction Distance", From ed60c3c92912cf6c6d0062127abbf5ef94476397 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 25 Aug 2015 10:05:47 +0200 Subject: [PATCH 14/49] JSON: support hammock density and pattern --- resources/settings/fdmprinter.json | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index 5e1537738a..faea45add9 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -1282,6 +1282,37 @@ "value": true } }, + "support_roof_density": { + "label": "Hammock Density", + "description": "This controls how densely filled the roofs of the support will be. A higher percentage results in better overhangs, which are more difficult to remove.", + "unit": "%", + "type": "float", + "default": 20, + "children": { + "support_roof_line_distance": { + "label": "Hammock Line Distance", + "description": "Distance between the printed hammock lines.", + "unit": "mm", + "type": "float", + "default": 2, + "visible": false, + "inherit_function": "0 if parent_value == 0 else (support_roof_line_width * 100) / parent_value" + } + } + }, + "support_roof_pattern": { + "label": "Hammock Pattern", + "description": "The pattern with which the hammock is printed.", + "type": "enum", + "visible": false, + "options": [ + "Grid", + "Lines", + "Concentric", + "ZigZag" + ], + "default": "Lines" + }, "support_use_towers": { "label": "Use towers.", "description": "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof.", From bbebeeb66d0cb8438ca1b109e00f563e1ba42fcc Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 25 Aug 2015 11:34:33 +0200 Subject: [PATCH 15/49] Added sliceInfo plugin stub --- plugins/SliceInfoPlugin/__init__.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 plugins/SliceInfoPlugin/__init__.py diff --git a/plugins/SliceInfoPlugin/__init__.py b/plugins/SliceInfoPlugin/__init__.py new file mode 100644 index 0000000000..8db60a7d52 --- /dev/null +++ b/plugins/SliceInfoPlugin/__init__.py @@ -0,0 +1,19 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. +from . import SliceInfo +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + +def getMetaData(): + return { + "plugin": { + "name": "Slice Info", + "author": "Ultimaker", + "version": "1.0", + "description": catalog.i18nc("Slice Info plugin description", "Submits anonymous slice info. Can be disabled through preferences."), + "api": 2 + } + } + +def register(app): + return { "extension": SliceInfo.SliceInfo()} \ No newline at end of file From 86b6f608092dd5eec732c52afb3e534ffb06d5b4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 25 Aug 2015 11:36:44 +0200 Subject: [PATCH 16/49] Added status events to usb printer --- plugins/USBPrinting/PrinterConnection.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/USBPrinting/PrinterConnection.py b/plugins/USBPrinting/PrinterConnection.py index 1ac1cb1b89..76c1f5a49b 100644 --- a/plugins/USBPrinting/PrinterConnection.py +++ b/plugins/USBPrinting/PrinterConnection.py @@ -155,6 +155,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): @pyqtSlot() def startPrint(self): + self.writeStarted.emit(self) gcode_list = getattr( Application.getInstance().getController().getScene(), "gcode_list") self.printGCode(gcode_list) @@ -163,6 +164,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): def printGCode(self, gcode_list): if self.isPrinting() or not self._is_connected: Logger.log("d", "Printer is busy or not connected, aborting print") + self.writeError.emit() return self._gcode.clear() @@ -179,6 +181,8 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): for i in range(0, 4): #Push first 4 entries before accepting other inputs self._sendNextGcodeLine() + self.writeFinished.emit() + ## Get the serial port string of this connection. # \return serial port def getSerialPort(self): From 534c277b005deabf004196ad9b0dcbe26722317a Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Tue, 25 Aug 2015 12:20:13 +0200 Subject: [PATCH 17/49] 15.10 restyling of the layerview slider Adds a textfield to the handle for per layer selection and removes the display of the min- and maxvalue Contributes to: issue CURA-60 --- plugins/LayerView/LayerView.qml | 10 +++-- resources/qml/Toolbar.qml | 4 +- resources/themes/cura/styles.qml | 65 ++++++++++++++------------------ resources/themes/cura/theme.json | 16 ++++---- 4 files changed, 44 insertions(+), 51 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 4d0da440d1..9c35b9337c 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -19,7 +19,7 @@ Item width: 10 height: 250 anchors.right : parent.right - anchors.rightMargin: UM.Theme.sizes.slider_layerview_margin.width + anchors.rightMargin: UM.Theme.sizes.slider_layerview_margin.width/2 orientation: Qt.Vertical minimumValue: 0; maximumValue: UM.LayerView.numLayers; @@ -38,14 +38,16 @@ Item height: UM.Theme.sizes.slider_layerview_background_extension.height color: UM.Theme.colors.slider_text_background } - UM.AngledCornerRectangle { + Rectangle { anchors.right : parent.right anchors.verticalCenter: parent.verticalCenter z: slider.z - 1 - cornerSize: UM.Theme.sizes.default_margin.width; width: UM.Theme.sizes.slider_layerview_background.width height: slider.height + UM.Theme.sizes.default_margin.height * 2 - color: UM.Theme.colors.slider_text_background + color: UM.Theme.colors.tool_panel_background; + border.width: UM.Theme.sizes.default_lining.width + border.color: UM.Theme.colors.lining + MouseArea { id: sliderMouseArea property double manualStepSize: slider.maximumValue / 11 diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index e14dfdc99d..542aceaa15 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -51,7 +51,7 @@ Item { z: parent.z - 1 anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter - color: UM.Theme.colors.button_lining + color: UM.Theme.colors.lining } Rectangle { @@ -68,7 +68,7 @@ Item { color: UM.Theme.colors.tool_panel_background; border.width: UM.Theme.sizes.default_lining.width - border.color: UM.Theme.colors.button_lining + border.color: UM.Theme.colors.lining Loader { id: panel diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index a2d7fe7c7b..f5f93bf547 100644 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -67,10 +67,10 @@ QtObject { Rectangle { id: tool_button_background - anchors.top: parent.verticalCenter; + anchors.top: parent.bottom - width: parent.width; - height: control.hovered ? parent.height / 2 + label.height : 0; + width: label.width > parent.width ? label.width : parent.width + height: control.hovered ? label.height : 0; Behavior on height { NumberAnimation { duration: 100; } } opacity: control.hovered ? 1.0 : 0.0; @@ -416,26 +416,6 @@ QtObject { color: UM.Theme.colors.slider_groove_fill; width: (control.value / (control.maximumValue - control.minimumValue)) * parent.width; } - Label { - id: maxValueLabel - visible: UM.LayerView.getLayerActivity && Printer.getPlatformActivity ? true : false - text: control.maximumValue + 1 - font: control.maximumValue > 998 ? UM.Theme.fonts.small : UM.Theme.fonts.default - transformOrigin: Item.BottomLeft - rotation: 90 - x: parent.x + parent.width - maxValueLabel.height - y: control.maximumValue > 998 ? parent.y + UM.Theme.sizes.slider_layerview_smalltext_margin.width : parent.y - } - Label { - id: minValueLabel - visible: UM.LayerView.getLayerActivity && Printer.getPlatformActivity ? true : false - text: '1' - font: control.maximumValue > 998 ? UM.Theme.fonts.small : UM.Theme.fonts.default - transformOrigin: Item.BottomLeft - rotation: 90 - x: parent.x - y: control.maximumValue > 998 ? parent.y + UM.Theme.sizes.slider_layerview_smalltext_margin.width : parent.y - } } handle: Rectangle { id: layerSliderControl @@ -443,26 +423,37 @@ QtObject { height: UM.Theme.sizes.slider_handle.height; color: control.hovered ? UM.Theme.colors.slider_handle_hover : UM.Theme.colors.slider_handle; Behavior on color { ColorAnimation { duration: 50; } } - Label { + TextField { id: valueLabel + property int unremovableSpacing: 5 + property string maxValue: control.maximumValue + 1 + placeholderText: control.value + 1 + onEditingFinished: { + if (valueLabel.text != ''){ + control.value = valueLabel.text - 1 + valueLabel.text = '' + valueLabel.focus = false + } + + } + validator: IntValidator {bottom: 1; top: control.maximumValue + 1;} visible: UM.LayerView.getLayerActivity && Printer.getPlatformActivity ? true : false - text: control.value + 1 anchors.bottom: layerSliderControl.bottom anchors.right: layerSliderControl.left - anchors.bottomMargin: parent.width + UM.Theme.sizes.default_margin.width - font: UM.Theme.fonts.default + anchors.rightMargin: valueLabel.unremovableSpacing / 2 + anchors.bottomMargin: parent.width + (UM.Theme.sizes.default_margin.width / 2) transformOrigin: Item.BottomRight rotation: 90 - Rectangle { - width: (parent.width + UM.Theme.sizes.tooltip_margins.width) < 35 ? 35 : parent.width + UM.Theme.sizes.tooltip_margins.width - height: parent.height + (UM.Theme.sizes.tooltip_margins.height / 2) - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - z: parent.z - 1 - color: UM.Theme.colors.slider_text_background - border.width: 1 - border.color: UM.Theme.colors.slider_groove_fill; - + style: TextFieldStyle{ + textColor: UM.Theme.colors.setting_control_text; + font: UM.Theme.fonts.default; + background: Rectangle { + radius: 0 + implicitWidth: control.maxValue.length * valueLabel.font.pixelSize + implicitHeight: UM.Theme.sizes.slider_handle.height + valueLabel.unremovableSpacing + border.width: 1; + border.color: UM.Theme.colors.slider_groove_border; + } } } } diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 1e3f24e1f2..6989cdc475 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -54,6 +54,7 @@ "colors": { "sidebar": [255, 255, 255, 255], + "lining": [208, 210, 211, 255], "primary": [12, 169, 227, 255], "primary_hover": [34, 150, 190, 255], @@ -67,10 +68,9 @@ "text_pressed": [12, 169, 227, 255], "button": [139, 143, 153, 255], - "button_hover": [116, 120, 127, 255], - "button_active": [12, 169, 227, 255], + "button_hover": [77, 184, 226, 255], + "button_active": [32, 166, 219, 255], "button_active_hover": [77, 184, 226, 255], - "button_lining": [208, 210, 211, 255], "button_text": [255, 255, 255, 255], "button_disabled": [245, 245, 245, 255], "button_tooltip_text": [35, 35, 35, 255], @@ -107,10 +107,10 @@ "progressbar_control": [12, 169, 227, 255], "slider_groove": [245, 245, 245, 255], - "slider_groove_border": [160, 163, 171, 255], - "slider_groove_fill": [160, 163, 171, 255], - "slider_handle": [12, 169, 227, 255], - "slider_handle_hover": [34, 150, 190, 255], + "slider_groove_border": [139, 143, 153, 255], + "slider_groove_fill": [139, 143, 153, 255], + "slider_handle": [32, 166, 219, 255], + "slider_handle_hover": [77, 182, 226, 255], "slider_text_background": [255, 255, 255, 255], "checkbox": [255, 255, 255, 255], @@ -174,7 +174,7 @@ "slider_groove": [0.5, 0.5], "slider_handle": [1.5, 1.5], - "slider_layerview_background": [6.0, 0.0], + "slider_layerview_background": [4.0, 0.0], "slider_layerview_smalltext_margin": [0.3, 0.00], "slider_layerview_background_extension": [0.0, 2.2], "slider_layerview_margin": [3.0, 3.0], From 34eb78cbaa72e8ecb82c91a4268c0c271fff5492 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 25 Aug 2015 13:10:14 +0200 Subject: [PATCH 18/49] JSON: made every fill option available for all fill types (skin, support, infill) --- resources/settings/fdmprinter.json | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index faea45add9..87ba60343a 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -391,7 +391,10 @@ "type": "enum", "options": [ "Lines", - "Concentric" + "Grid", + "Triangles", + "Concentric", + "ZigZag" ], "default": "Lines", "visible": false @@ -465,8 +468,9 @@ "type": "enum", "visible": false, "options": [ - "Grid", "Lines", + "Grid", + "Triangles", "Concentric", "ZigZag" ], @@ -1306,8 +1310,9 @@ "type": "enum", "visible": false, "options": [ - "Grid", "Lines", + "Grid", + "Triangles", "Concentric", "ZigZag" ], @@ -1363,8 +1368,10 @@ "description": "Cura supports 3 distinct types of support structure. First is a grid based support structure which is quite solid and can be removed as 1 piece. The second is a line based support structure which has to be peeled off line by line. The third is a structure in between the other two; it consists of lines which are connected in an accordeon fashion.", "type": "enum", "options": [ - "Grid", "Lines", + "Grid", + "Triangles", + "Concentric", "ZigZag" ], "default": "ZigZag", From c83ef32c171775322c899770919223abccd0d5ba Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 25 Aug 2015 13:30:28 +0200 Subject: [PATCH 19/49] changed support roof defaults (now concentric) --- resources/settings/fdmprinter.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index 87ba60343a..c6bc121b8b 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -1291,14 +1291,14 @@ "description": "This controls how densely filled the roofs of the support will be. A higher percentage results in better overhangs, which are more difficult to remove.", "unit": "%", "type": "float", - "default": 20, + "default": 100, "children": { "support_roof_line_distance": { "label": "Hammock Line Distance", "description": "Distance between the printed hammock lines.", "unit": "mm", "type": "float", - "default": 2, + "default": 0.4, "visible": false, "inherit_function": "0 if parent_value == 0 else (support_roof_line_width * 100) / parent_value" } @@ -1316,7 +1316,7 @@ "Concentric", "ZigZag" ], - "default": "Lines" + "default": "Concentric" }, "support_use_towers": { "label": "Use towers.", From 9b6ed1f0ee3627799d9d74d8e0529d07ded742ef Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 25 Aug 2015 13:34:25 +0200 Subject: [PATCH 20/49] Added self to output device signals --- plugins/USBPrinting/PrinterConnection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/PrinterConnection.py b/plugins/USBPrinting/PrinterConnection.py index 76c1f5a49b..3ddd3ea763 100644 --- a/plugins/USBPrinting/PrinterConnection.py +++ b/plugins/USBPrinting/PrinterConnection.py @@ -164,7 +164,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): def printGCode(self, gcode_list): if self.isPrinting() or not self._is_connected: Logger.log("d", "Printer is busy or not connected, aborting print") - self.writeError.emit() + self.writeError.emit(self) return self._gcode.clear() @@ -181,7 +181,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): for i in range(0, 4): #Push first 4 entries before accepting other inputs self._sendNextGcodeLine() - self.writeFinished.emit() + self.writeFinished.emit(self) ## Get the serial port string of this connection. # \return serial port From dafe0c8b0db4552760feb945fb258e05c2e46f56 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 25 Aug 2015 13:34:51 +0200 Subject: [PATCH 21/49] Added sliceInfo --- plugins/SliceInfoPlugin/SliceInfo.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 plugins/SliceInfoPlugin/SliceInfo.py diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py new file mode 100644 index 0000000000..7abf9c4eaf --- /dev/null +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -0,0 +1,14 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from UM.Extension import Extension +from UM.Application import Application + +class SliceInfo(Extension): + def __init__(self): + super().__init__() + Application.getInstance().getOutputDeviceManager().writeStarted.connect(self._onWriteStarted) + + def _onWriteStarted(self, output_device): + print("Write started") + pass \ No newline at end of file From f92b4d72c7f6377d830647d84adeeee2964be0a5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 25 Aug 2015 14:16:35 +0200 Subject: [PATCH 22/49] Added getPrintInformation to curaApp --- cura/CuraApplication.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 70c1496ec2..1c09c7ee31 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -188,6 +188,9 @@ class CuraApplication(QtApplication): return super().event(event) + def getPrintInformation(self): + return self._print_information + def registerObjects(self, engine): engine.rootContext().setContextProperty("Printer", self) self._print_information = PrintInformation.PrintInformation() From 529617bc06a9869eab3897bfbbf804a96a26e284 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 25 Aug 2015 14:44:50 +0200 Subject: [PATCH 23/49] Removed state check that broke connection for printrbot --- plugins/USBPrinting/PrinterConnection.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/plugins/USBPrinting/PrinterConnection.py b/plugins/USBPrinting/PrinterConnection.py index 3ddd3ea763..c599cfdf1d 100644 --- a/plugins/USBPrinting/PrinterConnection.py +++ b/plugins/USBPrinting/PrinterConnection.py @@ -262,11 +262,6 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): except Exception as e: Logger.log("i", "Could not establish connection on %s, unknown reasons. Device is not arduino based." % self._serial_port) - if not self._serial: - self._is_connecting = False - Logger.log("i", "Could not establish connection on %s, unknown reasons.", self._serial_port) - return - # If the programmer connected, we know its an atmega based version. Not all that usefull, but it does give some debugging information. for baud_rate in self._getBaudrateList(): # Cycle all baud rates (auto detect) if self._serial is None: From 4eb37a1cc9dfea0a9a5c8663322502896ac5f68a Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 25 Aug 2015 16:18:12 +0200 Subject: [PATCH 24/49] JSON: feat: infill before walls --- resources/settings/fdmprinter.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index c6bc121b8b..1e534a94f2 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -511,6 +511,13 @@ "inherit_function": "math.floor((parent_value + 0.001) / layer_height)" } } + }, + "infill_before_walls": { + "label": "Infill Before Walls", + "description": "Print the infill before printing the walls. Printing the walls first may lead to more accurate walls, but overhangs print worse. Printing the infill first leads to sturdier walls, but the infill pattern might sometimes show through the surface.", + "type": "boolean", + "default": true, + "visible": false } } }, From 721dd8e2d8fab2d523a3ce38a46e857fd8d0f60f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Aug 2015 12:24:17 +0200 Subject: [PATCH 25/49] Fixed ported urllib code from old cura --- plugins/SliceInfoPlugin/SliceInfo.py | 96 +++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 2 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 7abf9c4eaf..3962d69e3e 100644 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -3,12 +3,104 @@ from UM.Extension import Extension from UM.Application import Application +from UM.Preferences import Preferences +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator +from UM.Scene.SceneNode import SceneNode +import collections +import json +import os.path +import copy +import platform +import math +import urllib.request +import urllib.parse + + +## This Extension runs in the background and sends several bits of information to the Ultimaker servers. +# The data is only sent when the user in question gave permission to do so. All data is anonymous and +# no model files are being sent (Just a SHA256 hash of the model). class SliceInfo(Extension): def __init__(self): super().__init__() Application.getInstance().getOutputDeviceManager().writeStarted.connect(self._onWriteStarted) + Preferences.getInstance().addPreference("info/send_slice_info", True) def _onWriteStarted(self, output_device): - print("Write started") - pass \ No newline at end of file + print("Starting sending") + if not Preferences.getInstance().getValue("info/send_slice_info"): + return # Do nothing, user does not want to send data + + settings = Application.getInstance().getActiveMachine() + profile = settings.getActiveProfile() + profile_values = None + + # Load all machine definitions and put them in machine_settings dict + setting_file_name = Application.getInstance().getActiveMachine()._json_file + machine_settings = {} + with open(setting_file_name, "rt", -1, "utf-8") as f: + data = json.load(f, object_pairs_hook = collections.OrderedDict) + machine_settings[os.path.basename(setting_file_name)] = copy.deepcopy(data) + # Loop through inherited json files + while True: + if "inherits" in data: + inherited_setting_file_name = os.path.dirname(setting_file_name) + "/" + data["inherits"] + with open(inherited_setting_file_name, "rt", -1, "utf-8") as f: + data = json.load(f, object_pairs_hook = collections.OrderedDict) + machine_settings[os.path.basename(inherited_setting_file_name)] = copy.deepcopy(data) + print("Inherited:", os.path.basename(inherited_setting_file_name)) + else: + break + + if profile: + profile_values = profile.getChangedSettings() + + # Get total material used (in mm^3) + print_information = Application.getInstance().getPrintInformation() + material_radius = 0.5 * settings.getSettingValueByKey("material_diameter") + material_used = math.pi * material_radius * material_radius * print_information.materialAmount #Volume of material used + + # Get model information (bounding boxes, hashes and transformation matrix) + models_info = [] + for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): + if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: + if not getattr(node, "_outside_buildarea", False): + model_info = {} + model_info["hash"] = node.getMeshData().getHash() + model_info["bounding_box"] = {} + model_info["bounding_box"]["minimum"] = {} + model_info["bounding_box"]["minimum"]["x"] = node.getBoundingBox().minimum.x + model_info["bounding_box"]["minimum"]["y"] = node.getBoundingBox().minimum.y + model_info["bounding_box"]["minimum"]["z"] = node.getBoundingBox().minimum.z + + model_info["bounding_box"]["maximum"] = {} + model_info["bounding_box"]["maximum"]["x"] = node.getBoundingBox().maximum.x + model_info["bounding_box"]["maximum"]["y"] = node.getBoundingBox().maximum.y + model_info["bounding_box"]["maximum"]["z"] = node.getBoundingBox().maximum.z + model_info["transformation"] = str(node.getWorldTransformation().getData()) + + models_info.append(model_info) + + # Bundle the collected data + submitted_data = { + "processor": platform.processor(), + "machine": platform.machine(), + "platform": platform.platform(), + "machine_settings": json.dumps(machine_settings), + "version": "15.10",#Application.getInstance().getVersion(), + "printtime": print_information.currentPrintTime, + "filament": material_used + } + + # Convert data to bytes + submitted_data = urllib.parse.urlencode(submitted_data) + binary_data = submitted_data.encode('utf-8') + + # Submit data + try: + f = urllib.request.urlopen("https://stats.youmagine.com/curastats/slice", data = binary_data, timeout = 1) + except Exception as e: + print("Exception occured", e) + + print("Result: ", f.read()) + f.close() \ No newline at end of file From 97f80914c5895dc6f2f91bd8af5a011385df1038 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Aug 2015 15:09:53 +0200 Subject: [PATCH 26/49] Fixed slice settings sender --- plugins/SliceInfoPlugin/SliceInfo.py | 9 +++++--- resources/qml/GeneralPage.qml | 33 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 3962d69e3e..abbb1ac43b 100644 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -87,9 +87,12 @@ class SliceInfo(Extension): "machine": platform.machine(), "platform": platform.platform(), "machine_settings": json.dumps(machine_settings), - "version": "15.10",#Application.getInstance().getVersion(), - "printtime": print_information.currentPrintTime, - "filament": material_used + "version": Application.getInstance().getVersion(), + "modelhash": "None", + "printtime": str(print_information.currentPrintTime), + "filament": material_used, + "language": Preferences.getInstance().getValue("general/language"), + "materials_profiles ": {} } # Convert data to bytes diff --git a/resources/qml/GeneralPage.qml b/resources/qml/GeneralPage.qml index 9f7203702f..f8f9ceb6a7 100644 --- a/resources/qml/GeneralPage.qml +++ b/resources/qml/GeneralPage.qml @@ -125,6 +125,39 @@ UM.PreferencesPage } } } + + CheckBox + { + id: sendDataCheckbox + checked: UM.Preferences.getValue("info/send_slice_info") + onCheckedChanged: UM.Preferences.setValue("info/send_slice_info", checked) + } + Button + { + id: pushFreeText //is a button so the user doesn't have te click inconvenientley precise to enable or disable the checkbox + + //: Display Overhang preference checkbox + text: qsTr("Send (anonymous) slice info"); + onClicked: sendDataCheckbox.checked = !sendDataCheckbox.checked + + //: Display Overhang preference tooltip + tooltip: "Should anonymous data about your slices be sent to Ultimaker. No models or IP's are sent / stored." + + style: ButtonStyle + { + background: Rectangle + { + border.width: 0 + color: "transparent" + } + label: Text + { + renderType: Text.NativeRendering + horizontalAlignment: Text.AlignLeft + text: control.text + } + } + } Item { Layout.fillHeight: true; Layout.columnSpan: 2 } } } From a49ce21fbecccd2efe1db10a9b7abb926f796bf2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Aug 2015 15:18:01 +0200 Subject: [PATCH 27/49] Adding a machine now hides if there are no more pages --- resources/qml/WizardPages/AddMachine.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/qml/WizardPages/AddMachine.qml b/resources/qml/WizardPages/AddMachine.qml index 39dfd2414d..5491b5ad0b 100644 --- a/resources/qml/WizardPages/AddMachine.qml +++ b/resources/qml/WizardPages/AddMachine.qml @@ -274,6 +274,11 @@ ColumnLayout { elementRoot.currentPage += 1 } + + if (elementRoot.getPageCount() == elementRoot.currentPage) + { + elementRoot.visible = false + } } } } From a8afb9045f2ede555cf9e33291126cd2d29d5c1c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Aug 2015 15:24:10 +0200 Subject: [PATCH 28/49] Disabled bounding box intersection for physics Fixes Ultimaker/Cura#294 --- cura/PlatformPhysics.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index f96c81abce..8863081858 100644 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -107,11 +107,12 @@ class PlatformPhysics: continue # Check to see if the bounding boxes intersect. If not, we can ignore the node as there is no way the hull intersects. - if node.getBoundingBox().intersectsBox(other_node.getBoundingBox()) == AxisAlignedBox.IntersectionResult.NoIntersection: - continue + #if node.getBoundingBox().intersectsBox(other_node.getBoundingBox()) == AxisAlignedBox.IntersectionResult.NoIntersection: + # continue # Get the overlap distance for both convex hulls. If this returns None, there is no intersection. overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_node.callDecoration("getConvexHull")) + print("Overlap", overlap) if overlap is None: continue From c300b4d95abcf3b00cbf1cfd3e46e289549ef865 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Aug 2015 15:27:49 +0200 Subject: [PATCH 29/49] Rephrased description of cool_min_layer_time_fan_speed_max Fixes Ultimaker/Cura#263 --- resources/settings/fdmprinter.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index 1e534a94f2..8717871480 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -1085,7 +1085,7 @@ }, "cool_min_layer_time_fan_speed_max": { "label": "Minimal Layer Time Full Fan Speed", - "description": "The minimum time spent in a layer which will cause the fan to be at minmum speed. The fan speed increases linearly from maximal fan speed for layers taking minimal layer time to minimal fan speed for layers taking the time specified here.", + "description": "The minimum time spent in a layer which will cause the fan to be at maximum speed. The fan speed increases linearly from minimal fan speed for layers taking minimal layer time to maximum fan speed for layers taking the time specified here.", "unit": "sec", "type": "float", "min_value": 0, From fdd8a7bb6c44ed5f3d1deed63e8264f4afa41ab8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Aug 2015 15:30:26 +0200 Subject: [PATCH 30/49] Removed unused import --- cura/CuraApplication.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1c09c7ee31..a23dc61b05 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -45,7 +45,6 @@ import platform import sys import os import os.path -import configparser import numpy numpy.seterr(all="ignore") From 87364f37a682fb52bb634d7a3d39c989b401dfb6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Aug 2015 15:37:10 +0200 Subject: [PATCH 31/49] Fixed double ID in qml --- resources/qml/GeneralPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/GeneralPage.qml b/resources/qml/GeneralPage.qml index f8f9ceb6a7..9dab3727a5 100644 --- a/resources/qml/GeneralPage.qml +++ b/resources/qml/GeneralPage.qml @@ -134,7 +134,7 @@ UM.PreferencesPage } Button { - id: pushFreeText //is a button so the user doesn't have te click inconvenientley precise to enable or disable the checkbox + id: sendDataText //is a button so the user doesn't have te click inconvenientley precise to enable or disable the checkbox //: Display Overhang preference checkbox text: qsTr("Send (anonymous) slice info"); From 4fb577b8939bf722be49db7b2455f4cc0f57049d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Aug 2015 15:49:53 +0200 Subject: [PATCH 32/49] Fixed default button for general and view page contributes to Ultimaker/Cura#245 --- resources/qml/GeneralPage.qml | 4 ++++ resources/qml/ViewPage.qml | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/resources/qml/GeneralPage.qml b/resources/qml/GeneralPage.qml index 9dab3727a5..1b12628e92 100644 --- a/resources/qml/GeneralPage.qml +++ b/resources/qml/GeneralPage.qml @@ -17,6 +17,10 @@ UM.PreferencesPage { UM.Preferences.resetPreference("general/language") UM.Preferences.resetPreference("physics/automatic_push_free") + UM.Preferences.resetPreference("info/send_slice_info") + pushFreeCheckbox.checked = UM.Preferences.getValue("physics/automatic_push_free") + sendDataCheckbox.checked = UM.Preferences.getValue("info/send_slice_info") + languageComboBox.currentIndex = 0 } GridLayout { diff --git a/resources/qml/ViewPage.qml b/resources/qml/ViewPage.qml index ed00eacca0..952e7a9948 100644 --- a/resources/qml/ViewPage.qml +++ b/resources/qml/ViewPage.qml @@ -18,7 +18,9 @@ UM.PreferencesPage function reset() { UM.Preferences.resetPreference("view/show_overhang"); - UM.Preferences.resetPreferences("view/center_on_select"); + UM.Preferences.resetPreference("view/center_on_select"); + overhangCheckbox.checked = UM.Preferences.getValue("view/show_overhang") + centerCheckbox.checked = UM.Preferences.getValue("view/center_on_select") } GridLayout From af18019ce027cb3ccc401b2b1a50bd8c8a2ba5a7 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Aug 2015 16:08:00 +0200 Subject: [PATCH 33/49] Added exception handling for checking overlap. Fixes Ultimaker/Cura#297 --- cura/PlatformPhysics.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 8863081858..6416b83e01 100644 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -111,8 +111,11 @@ class PlatformPhysics: # continue # Get the overlap distance for both convex hulls. If this returns None, there is no intersection. - overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_node.callDecoration("getConvexHull")) - print("Overlap", overlap) + try: + overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_node.callDecoration("getConvexHull")) + except: + overlap = None #It can sometimes occur that the caclulated convex hull has no size, in which case there is no overlap. + if overlap is None: continue From f17cc811c430b191c2be0ae01a8da640c97b67f3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Aug 2015 13:24:37 +0200 Subject: [PATCH 34/49] Added message asking about sending data to server --- plugins/SliceInfoPlugin/SliceInfo.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index abbb1ac43b..70b31d8acd 100644 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -6,6 +6,8 @@ from UM.Application import Application from UM.Preferences import Preferences from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode +from UM.Message import Message +from UM.i18n import i18nCatalog import collections import json @@ -16,6 +18,8 @@ import math import urllib.request import urllib.parse +catalog = i18nCatalog("cura") + ## This Extension runs in the background and sends several bits of information to the Ultimaker servers. # The data is only sent when the user in question gave permission to do so. All data is anonymous and @@ -25,9 +29,19 @@ class SliceInfo(Extension): super().__init__() Application.getInstance().getOutputDeviceManager().writeStarted.connect(self._onWriteStarted) Preferences.getInstance().addPreference("info/send_slice_info", True) + Preferences.getInstance().addPreference("info/asked_send_slice_info", False) + + if not Preferences.getInstance().getValue("info/asked_send_slice_info"): + self.send_slice_info_message = Message(catalog.i18nc("", "Cura automatically sends slice info. You can disable this in preferences"), lifetime = 0, dismissable = False) + self.send_slice_info_message.addAction("Dismiss","Dismiss", None, "Dismiss") + self.send_slice_info_message.actionTriggered.connect(self.messageActionTriggered) + self.send_slice_info_message.show() + + def messageActionTriggered(self, message_id, action_id): + self.send_slice_info_message.hide() + Preferences.getInstance().setValue("info/asked_send_slice_info", True) def _onWriteStarted(self, output_device): - print("Starting sending") if not Preferences.getInstance().getValue("info/send_slice_info"): return # Do nothing, user does not want to send data @@ -105,5 +119,4 @@ class SliceInfo(Extension): except Exception as e: print("Exception occured", e) - print("Result: ", f.read()) f.close() \ No newline at end of file From 55f51a53b6320f49d3eb7ea8eaa087712a7e63b8 Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Thu, 27 Aug 2015 14:29:44 +0200 Subject: [PATCH 35/49] 15.10 restyling of the savebutton Area More elaborate shortdescription for especially the outputdevices still have to be implemented. And the filename textfield is not finished. Contributes to: issue CURA-60 --- resources/qml/Cura.qml | 4 +- resources/qml/SaveButton.qml | 256 ++++++++++++++++--------------- resources/qml/Sidebar.qml | 2 +- resources/themes/cura/theme.json | 17 +- 4 files changed, 150 insertions(+), 129 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index e54a00d9d0..77ad9f7b23 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -305,7 +305,7 @@ UM.MainWindow { anchors { horizontalCenter: parent.horizontalCenter - horizontalCenterOffset: -(UM.Theme.sizes.panel.width / 2) + horizontalCenterOffset: -(UM.Theme.sizes.sidebar.width / 2) top: parent.top; } } @@ -319,7 +319,7 @@ UM.MainWindow { right: parent.right; } - width: UM.Theme.sizes.panel.width; + width: UM.Theme.sizes.sidebar.width; addMachineAction: actions.addMachine; configureMachinesAction: actions.configureMachines; diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index ec2066713f..89c7517760 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -14,115 +14,149 @@ Rectangle { property real progress: UM.Backend.progress; property bool activity: Printer.getPlatformActivity; Behavior on progress { NumberAnimation { duration: 250; } } + property int totalHeight: childrenRect.height property variant printDuration: PrintInformation.currentPrintTime; property real printMaterialAmount: PrintInformation.materialAmount; Rectangle{ - id: background + id: printJobRow implicitWidth: base.width; - implicitHeight: parent.height; - color: UM.Theme.colors.save_button_background; - border.width: UM.Theme.sizes.save_button_border.width - border.color: UM.Theme.colors.save_button_border - - Rectangle { - id: infoBox - width: parent.width - UM.Theme.sizes.default_margin.width * 2; - height: UM.Theme.sizes.save_button_slicing_bar.height - - anchors.top: parent.top - anchors.topMargin: UM.Theme.sizes.default_margin.height; + implicitHeight: UM.Theme.sizes.sidebar_header.height + anchors.top: parent.top + color: UM.Theme.colors.sidebar_header_bar + Label{ + id: printJobTextfieldLabel + //: insert filename textfield label + text: qsTr("Printjob name"); anchors.left: parent.left anchors.leftMargin: UM.Theme.sizes.default_margin.width; - - border.width: UM.Theme.sizes.save_button_border.width - border.color: UM.Theme.colors.save_button_border - color: UM.Theme.colors.save_button_estimated_text_background; - Label { - id: label; - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width; - visible: base.progress >= 0 && base.progress < 0.99 ? false : true - color: UM.Theme.colors.save_button_estimated_text; - font: UM.Theme.fonts.small; - text: { - if(base.activity == false) { - //: Save button label - return qsTr("Please load a 3D model"); - } else if (base.progress < 0.99) { - //: Save button label - return qsTr("Calculating Print-time"); - } else if (base.printDuration.days > 0 || base.progress == null){ - return qsTr(""); - } - else if (base.progress > 0.99){ - //: Save button label - return qsTr("Estimated Print-time"); - } - return ""; + anchors.verticalCenter: parent.verticalCenter + font: UM.Theme.fonts.default; + color: UM.Theme.colors.text_white + } + TextField { + id: printJobTextfield + anchors.right: parent.right + anchors.rightMargin: UM.Theme.sizes.default_margin.width; + anchors.verticalCenter: parent.verticalCenter + width: parent.width/100*55 + height: UM.Theme.sizes.sidebar_inputFields.height + property int unremovableSpacing: 5 + text: "UM2" + "_" + "filename" ///TODO KOMT NOG + onEditingFinished: { + if (printJobTextfield.text != ''){ + printJobTextfield.focus = false } } - Label { - id: printDurationLabel - anchors.verticalCenter: parent.verticalCenter - anchors.left: label.right; - anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width; - color: UM.Theme.colors.save_button_printtime_text; - font: UM.Theme.fonts.small; - visible: base.activity == false || base.progress < 0.99 ? false : true - text: (!base.printDuration || !base.printDuration.valid) ? "" : base.printDuration.getDisplayString(UM.DurationFormat.Long); + validator: RegExpValidator { + regExp: /^[0-9a-zA-Z\_\-]*$/ } - Label { - id: printMaterialLabel - anchors.verticalCenter: parent.verticalCenter - anchors.left: printDurationLabel.right; - anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width; - color: base.printDuration.days > 0 ? UM.Theme.colors.save_button_estimated_text : UM.Theme.colors.save_button_printtime_text; - font: UM.Theme.fonts.small; - property bool mediumLengthDuration: base.printDuration.hours > 9 && base.printMaterialAmount > 9.99 && base.printDuration.days == 0 - width: mediumLengthDuration ? 50 : undefined - elide: mediumLengthDuration ? Text.ElideRight : Text.ElideNone - visible: base.activity == false || base.progress < 0.99 ? false : true - //: Print material amount save button label - text: base.printMaterialAmount < 0 ? "" : qsTr("%1m of Material").arg(base.printMaterialAmount); + style: TextFieldStyle{ + textColor: UM.Theme.colors.setting_control_text; + font: UM.Theme.fonts.default; + background: Rectangle { + radius: 0 + implicitWidth: parent.width + implicitHeight: parent.height + border.width: 1; + border.color: UM.Theme.colors.slider_groove_border; + } } } - Rectangle { - id: infoBoxOverlay - anchors { - left: infoBox.left; - top: infoBox.top; - bottom: infoBox.bottom; + } + + Rectangle { + id: specsRow + implicitWidth: base.width + implicitHeight: UM.Theme.sizes.sidebar_specs_bar.height + anchors.top: printJobRow.bottom + Item{ + id: time + width: (parent.width / 100 * 45) - UM.Theme.sizes.default_margin.width * 2 + height: parent.height + anchors.left: parent.left + anchors.leftMargin: UM.Theme.sizes.default_margin.width + anchors.top: parent.top + visible: base.printMaterialAmount > 0 ? true : false + UM.RecolorImage { + id: timeIcon + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + width: UM.Theme.sizes.save_button_specs_icons.width + height: UM.Theme.sizes.save_button_specs_icons.height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.colors.text_hover + source: UM.Theme.icons.print_time; + } + Label{ + id: timeSpec + anchors.verticalCenter: parent.verticalCenter + anchors.left: timeIcon.right + anchors.leftMargin: UM.Theme.sizes.default_margin.width/2 + font: UM.Theme.fonts.default + color: UM.Theme.colors.text + text: (!base.printDuration || !base.printDuration.valid) ? "" : qsTr("%1 h:m").arg(base.printDuration.getDisplayString(UM.DurationFormat.Short)) } - width: Math.max(infoBox.width * base.progress); - color: UM.Theme.colors.save_button_active - visible: progress > 0.99 ? false : true } + Item{ + width: parent.width / 100 * 55 + height: parent.height + anchors.left: time.right + anchors.top: parent.top + visible: base.printMaterialAmount > 0 ? true : false + UM.RecolorImage { + id: lengthIcon + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + width: UM.Theme.sizes.save_button_specs_icons.width + height: UM.Theme.sizes.save_button_specs_icons.height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.colors.text_hover + source: UM.Theme.icons.category_material; + } + Label{ + id: lengthSpec + anchors.verticalCenter: parent.verticalCenter + anchors.left: lengthIcon.right + anchors.leftMargin: UM.Theme.sizes.default_margin.width/2 + font: UM.Theme.fonts.default + color: UM.Theme.colors.text + text: base.printMaterialAmount <= 0 ? "" : qsTr("%1 m").arg(base.printMaterialAmount) + } + } + } + + Item{ + id: saveRow + implicitWidth: base.width / 100 * 55 + implicitHeight: saveToButton.height + (UM.Theme.sizes.default_margin.height / 2) // height + bottomMargin + anchors.top: specsRow.bottom + anchors.right: parent.right + anchors.rightMargin: UM.Theme.sizes.default_margin.width Button { id: saveToButton - anchors.top: infoBox.bottom - anchors.topMargin: UM.Theme.sizes.save_button_text_margin.height; anchors.left: parent.left - anchors.leftMargin: UM.Theme.sizes.default_margin.width; tooltip: UM.OutputDeviceManager.activeDeviceDescription; enabled: progress > 0.99 && base.activity == true - width: infoBox.width/6*4.5 + width: parent.width - UM.Theme.sizes.save_button_save_to_button.height - 2 height: UM.Theme.sizes.save_button_save_to_button.height text: UM.OutputDeviceManager.activeDeviceShortDescription; style: ButtonStyle { background: Rectangle { - color: !control.enabled ? UM.Theme.colors.save_button_inactive : control.hovered ? UM.Theme.colors.save_button_active_hover : UM.Theme.colors.save_button_active; + color: control.hovered ? UM.Theme.colors.load_save_button_hover : UM.Theme.colors.load_save_button + Behavior on color { ColorAnimation { duration: 50; } } Label { anchors.centerIn: parent - color: UM.Theme.colors.save_button_safe_to_text; - font: UM.Theme.fonts.sidebar_save_to; + color: UM.Theme.colors.load_save_button_text + font: UM.Theme.fonts.default text: control.text; } } @@ -133,52 +167,35 @@ Rectangle { Button { id: deviceSelectionMenu; - anchors.top: infoBox.bottom - anchors.topMargin: UM.Theme.sizes.save_button_text_margin.height - anchors.right: parent.right - anchors.rightMargin: UM.Theme.sizes.default_margin.width; - tooltip: qsTr("Select the active output device"); - - width: infoBox.width/6*1.3 - UM.Theme.sizes.save_button_text_margin.height; + anchors.right: parent.right + width: UM.Theme.sizes.save_button_save_to_button.height height: UM.Theme.sizes.save_button_save_to_button.height - - iconSource: UM.Theme.icons[UM.OutputDeviceManager.activeDeviceIconName]; + //iconSource: UM.Theme.icons[UM.OutputDeviceManager.activeDeviceIconName]; style: ButtonStyle { background: Rectangle { - color: UM.Theme.colors.save_button_background; - border.width: control.hovered ? UM.Theme.sizes.save_button_border.width : 0 - border.color: UM.Theme.colors.save_button_border + id: deviceSelectionIcon + color: control.hovered ? UM.Theme.colors.load_save_button_hover : UM.Theme.colors.load_save_button + Behavior on color { ColorAnimation { duration: 50; } } + anchors.left: parent.left + anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width / 2; + width: parent.height + height: parent.height - Rectangle { - id: deviceSelectionIcon - color: UM.Theme.colors.save_button_background; - anchors.left: parent.left - anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width / 2; - anchors.verticalCenter: parent.verticalCenter; - width: parent.height - UM.Theme.sizes.save_button_text_margin.width ; - height: parent.height - UM.Theme.sizes.save_button_text_margin.width; - - UM.RecolorImage { - anchors.fill: parent; - sourceSize.width: width; - sourceSize.height: height; - color: UM.Theme.colors.save_button_active - source: control.iconSource; - } - } - Label { - id: deviceSelectionArrow - anchors.right: parent.right; - anchors.rightMargin: UM.Theme.sizes.save_button_text_margin.height - anchors.verticalCenter: parent.verticalCenter; - text: "▼"; - font: UM.Theme.fonts.tiny; - color: UM.Theme.colors.save_button_active; + UM.RecolorImage { + id: lengthIcon + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: UM.Theme.sizes.standard_arrow.width + height: UM.Theme.sizes.standard_arrow.height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.colors.load_save_button_text + source: UM.Theme.icons.arrow_bottom } } - label: Item { } + label: Label{ } } menu: Menu { @@ -200,9 +217,6 @@ Rectangle { ExclusiveGroup { id: devicesMenuGroup; } } } + UM.OutputDevicesModel { id: devicesModel; } } - - UM.OutputDevicesModel { - id: devicesModel; - } -} +} \ No newline at end of file diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 0c908fc789..9fb78e72ac 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -90,7 +90,7 @@ Rectangle { SaveButton { id: saveButton; implicitWidth: base.width - implicitHeight: UM.Theme.sizes.save_button_text_margin.height * 2 + UM.Theme.sizes.save_button_slicing_bar.height + UM.Theme.sizes.save_button_save_to_button.height + UM.Theme.sizes.default_margin.height + implicitHeight: totalHeight } } diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 6989cdc475..919abbda6f 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -32,10 +32,6 @@ "capitalize": true, "family": "ProximaNova" }, - "sidebar_save_to": { - "size": 1.0, - "family": "ProximaNova" - }, "timeslider_time": { "size": 1.0, "bold": true, @@ -64,9 +60,12 @@ "text": [140, 144, 154, 255], "text_inactive": [174, 174, 174, 255], + "text_white": [255, 255, 255, 255], "text_hover": [35, 35, 35, 255], "text_pressed": [12, 169, 227, 255], + "sidebar_header_bar": [12, 169, 227, 255], + "button": [139, 143, 153, 255], "button_hover": [77, 184, 226, 255], "button_active": [32, 166, 219, 255], @@ -142,14 +141,20 @@ "window_margin": [2.0, 2.0], "default_margin": [1.0, 1.0], "default_lining": [0.1, 0.1], - "panel": [22.0, 10.0], "logo": [9.5, 2.0], "toolbar_button": [2.0, 2.0], "toolbar_spacing": [1.0, 1.0], + "loadfile_button": [11.0, 2.4], "loadfile_margin": [0.8, 0.4], + "sidebar": [24.0, 10.0], + "sidebar_header": [0.0, 3.2], + "sidebar_subParts": [0.0, 2.4], + "sidebar_specs_bar": [0.0, 2.2], + "sidebar_inputFields": [0.0, 1.9], + "section": [22.0, 3.0], "section_icon": [2.14, 2.14], "section_text_margin": [0.33, 0.33], @@ -162,6 +167,7 @@ "standard_list_lineheight": [1.5, 1.5], "standard_list_input": [20.0, 25.0], + "standard_arrow": [0.6, 0.6], "button": [3.2, 3.2], "button_icon": [2.5, 2.5], @@ -189,6 +195,7 @@ "save_button_slicing_bar": [0.0, 2.2], "save_button_label_margin": [0.5, 0.5], "save_button_save_to_button": [0.3, 2.7], + "save_button_specs_icons": [1.4, 1.4], "modal_window_minimum": [30.0, 30.0], "wizard_progress": [10.0, 0.0], From 26c46eb56ad191dda1dbb10d792e3f80e649a4ca Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Thu, 27 Aug 2015 14:30:07 +0200 Subject: [PATCH 36/49] 15.10 New Icons Contributes to: issue CURA-60 --- resources/themes/cura/icons/arrow_bottom.svg | 7 +++++++ resources/themes/cura/icons/arrow_left.svg | 7 +++++++ resources/themes/cura/icons/arrow_right.svg | 7 +++++++ resources/themes/cura/icons/arrow_top.svg | 7 +++++++ resources/themes/cura/icons/basic.svg | 16 ++++++++++++++++ resources/themes/cura/icons/light.svg | 15 +++++++++++++++ resources/themes/cura/icons/medium.svg | 19 +++++++++++++++++++ resources/themes/cura/icons/plus.svg | 8 ++++++++ resources/themes/cura/icons/print_time.svg | 8 ++++++++ resources/themes/cura/icons/quick.svg | 10 ++++++++++ .../themes/cura/icons/setting_per_object.svg | 7 +++++++ resources/themes/cura/icons/strong.svg | 14 ++++++++++++++ resources/themes/cura/icons/ulti.svg | 16 ++++++++++++++++ 13 files changed, 141 insertions(+) create mode 100644 resources/themes/cura/icons/arrow_bottom.svg create mode 100644 resources/themes/cura/icons/arrow_left.svg create mode 100644 resources/themes/cura/icons/arrow_right.svg create mode 100644 resources/themes/cura/icons/arrow_top.svg create mode 100644 resources/themes/cura/icons/basic.svg create mode 100644 resources/themes/cura/icons/light.svg create mode 100644 resources/themes/cura/icons/medium.svg create mode 100644 resources/themes/cura/icons/plus.svg create mode 100644 resources/themes/cura/icons/print_time.svg create mode 100644 resources/themes/cura/icons/quick.svg create mode 100644 resources/themes/cura/icons/setting_per_object.svg create mode 100644 resources/themes/cura/icons/strong.svg create mode 100644 resources/themes/cura/icons/ulti.svg diff --git a/resources/themes/cura/icons/arrow_bottom.svg b/resources/themes/cura/icons/arrow_bottom.svg new file mode 100644 index 0000000000..792972dcba --- /dev/null +++ b/resources/themes/cura/icons/arrow_bottom.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/resources/themes/cura/icons/arrow_left.svg b/resources/themes/cura/icons/arrow_left.svg new file mode 100644 index 0000000000..4d9ac60bde --- /dev/null +++ b/resources/themes/cura/icons/arrow_left.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/resources/themes/cura/icons/arrow_right.svg b/resources/themes/cura/icons/arrow_right.svg new file mode 100644 index 0000000000..561b0c8200 --- /dev/null +++ b/resources/themes/cura/icons/arrow_right.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/resources/themes/cura/icons/arrow_top.svg b/resources/themes/cura/icons/arrow_top.svg new file mode 100644 index 0000000000..750783af0c --- /dev/null +++ b/resources/themes/cura/icons/arrow_top.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/resources/themes/cura/icons/basic.svg b/resources/themes/cura/icons/basic.svg new file mode 100644 index 0000000000..48b2adad19 --- /dev/null +++ b/resources/themes/cura/icons/basic.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/resources/themes/cura/icons/light.svg b/resources/themes/cura/icons/light.svg new file mode 100644 index 0000000000..e32a7345b1 --- /dev/null +++ b/resources/themes/cura/icons/light.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/resources/themes/cura/icons/medium.svg b/resources/themes/cura/icons/medium.svg new file mode 100644 index 0000000000..44097c21de --- /dev/null +++ b/resources/themes/cura/icons/medium.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/resources/themes/cura/icons/plus.svg b/resources/themes/cura/icons/plus.svg new file mode 100644 index 0000000000..a8f9f201ca --- /dev/null +++ b/resources/themes/cura/icons/plus.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/resources/themes/cura/icons/print_time.svg b/resources/themes/cura/icons/print_time.svg new file mode 100644 index 0000000000..787c7c3eb7 --- /dev/null +++ b/resources/themes/cura/icons/print_time.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/resources/themes/cura/icons/quick.svg b/resources/themes/cura/icons/quick.svg new file mode 100644 index 0000000000..9b1c07a584 --- /dev/null +++ b/resources/themes/cura/icons/quick.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/resources/themes/cura/icons/setting_per_object.svg b/resources/themes/cura/icons/setting_per_object.svg new file mode 100644 index 0000000000..9c5bd9bc8d --- /dev/null +++ b/resources/themes/cura/icons/setting_per_object.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/resources/themes/cura/icons/strong.svg b/resources/themes/cura/icons/strong.svg new file mode 100644 index 0000000000..9c527ecc92 --- /dev/null +++ b/resources/themes/cura/icons/strong.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/resources/themes/cura/icons/ulti.svg b/resources/themes/cura/icons/ulti.svg new file mode 100644 index 0000000000..48b2adad19 --- /dev/null +++ b/resources/themes/cura/icons/ulti.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + From 3d5f4e6bd663f53af2fa605cabad331f3488ea8e Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Thu, 27 Aug 2015 14:59:33 +0200 Subject: [PATCH 37/49] 15.10 re-alignment of the toolbar This is a test to be reviewed Contributes to: issue CURA-60 --- resources/qml/Cura.qml | 9 ++++++--- resources/qml/Toolbar.qml | 27 ++++++++++++++++----------- resources/themes/cura/styles.qml | 11 +++++++---- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 77ad9f7b23..b69ed4534f 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -304,9 +304,12 @@ UM.MainWindow { id: toolbar; anchors { - horizontalCenter: parent.horizontalCenter - horizontalCenterOffset: -(UM.Theme.sizes.sidebar.width / 2) - top: parent.top; + left: parent.left + top: parent.top + topMargin: 74 + //horizontalCenter: parent.horizontalCenter + //horizontalCenterOffset: -(UM.Theme.sizes.sidebar.width / 2) + //top: parent.top; } } diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index 542aceaa15..ca6b625b1b 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -13,8 +13,9 @@ Item { width: buttons.width; height: buttons.height + property int activeY - RowLayout { + ColumnLayout { id: buttons; anchors.bottom: parent.bottom; @@ -39,26 +40,30 @@ Item { //just catch the click so we do not trigger that behaviour. MouseArea { anchors.fill: parent; - onClicked: parent.checked ? UM.Controller.setActiveTool(null) : UM.Controller.setActiveTool(model.id); + onClicked: { + parent.checked ? UM.Controller.setActiveTool(null) : UM.Controller.setActiveTool(model.id); + base.activeY = parent.y + + } } } } } Rectangle { - width: base.width - 10 - height: base.height - z: parent.z - 1 - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - color: UM.Theme.colors.lining - } + width: base.width + height: base.height + z: parent.z - 1 + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + color: UM.Theme.colors.lining + } Rectangle { id: panelBackground; - anchors.left: parent.left; - anchors.top: buttons.bottom; + anchors.left: parent.right; + y: base.activeY width: panel.item ? Math.max(panel.width + 2 * UM.Theme.sizes.default_margin.width) : 0; height: panel.item ? panel.height + 2 * UM.Theme.sizes.default_margin.height : 0; diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index f5f93bf547..01267eadb3 100644 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -67,11 +67,14 @@ QtObject { Rectangle { id: tool_button_background - anchors.top: parent.bottom + anchors.left: parent.right + anchors.verticalCenter: parent.verticalCenter + //anchors.top: parent.bottom - width: label.width > parent.width ? label.width : parent.width - height: control.hovered ? label.height : 0; - Behavior on height { NumberAnimation { duration: 100; } } + //width: label.width > parent.width ? label.width : parent.width + width: control.hovered ? label.width : 0; + height: label.height + Behavior on width { NumberAnimation { duration: 100; } } opacity: control.hovered ? 1.0 : 0.0; Behavior on opacity { NumberAnimation { duration: 100; } } From d195c859a2ec54a5038eb1e7fabccca92ffb474a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Aug 2015 16:04:02 +0200 Subject: [PATCH 38/49] Code style & switch to translation catalog --- plugins/USBPrinting/ControlWindow.qml | 20 +- plugins/USBPrinting/FirmwareUpdateWindow.qml | 20 +- resources/qml/AboutDialog.qml | 33 ++- resources/qml/Actions.qml | 115 +++++---- resources/qml/AddMachineWizard.qml | 8 +- resources/qml/Cura.qml | 224 +++++++++++------- resources/qml/EngineLog.qml | 28 ++- resources/qml/GeneralPage.qml | 19 +- resources/qml/SaveButton.qml | 99 +++++--- resources/qml/Sidebar.qml | 47 ++-- resources/qml/SidebarHeader.qml | 52 ++-- resources/qml/SidebarSimple.qml | 55 +++-- resources/qml/ViewPage.qml | 23 +- resources/qml/WizardPages/AddMachine.qml | 12 +- .../qml/WizardPages/SelectUpgradedParts.qml | 18 +- .../qml/WizardPages/UltimakerCheckup.qml | 40 ++-- 16 files changed, 496 insertions(+), 317 deletions(-) diff --git a/plugins/USBPrinting/ControlWindow.qml b/plugins/USBPrinting/ControlWindow.qml index 7d83bd9ce1..74f3072aca 100644 --- a/plugins/USBPrinting/ControlWindow.qml +++ b/plugins/USBPrinting/ControlWindow.qml @@ -6,13 +6,14 @@ import QtQuick.Controls 1.1 import QtQuick.Layouts 1.1 import QtQuick.Window 2.1 -import UM 1.0 as UM +import UM 1.1 as UM -UM.Dialog { +UM.Dialog +{ width: 500 * Screen.devicePixelRatio; height: 100 * Screen.devicePixelRatio; - title: "Print with USB" + title: catalog.i18nc("@title:window", "Print with USB") Column { @@ -23,18 +24,20 @@ UM.Dialog { Text { //: USB Printing dialog label, %1 is head temperature - text: qsTr("Extruder Temperature %1").arg(manager.extruderTemperature) + text: catalog.i18nc("@label","Extruder Temperature %1").arg(manager.extruderTemperature) } Text { //: USB Printing dialog label, %1 is bed temperature - text: qsTr("Bed Temperature %1").arg(manager.bedTemperature) + text: catalog.i18nc("@label","Bed Temperature %1").arg(manager.bedTemperature) } Text { text: "" + manager.error } + UM.I18nCatalog{id: catalog; name:"cura"} + } ProgressBar @@ -50,16 +53,17 @@ UM.Dialog { } rightButtons: [ - Button { + Button + { //: USB Printing dialog start print button - text: qsTr("Print"); + text: catalog.i18nc("@action:button","Print"); onClicked: { manager.startPrint() } enabled: manager.progress == 0 ? true : false }, Button { //: USB Printing dialog cancel print button - text: qsTr("Cancel"); + text: catalog.i18nc("@action:button","Cancel"); onClicked: { manager.cancelPrint() } enabled: manager.progress == 0 ? false: true } diff --git a/plugins/USBPrinting/FirmwareUpdateWindow.qml b/plugins/USBPrinting/FirmwareUpdateWindow.qml index 12f4931697..55d3f60c62 100644 --- a/plugins/USBPrinting/FirmwareUpdateWindow.qml +++ b/plugins/USBPrinting/FirmwareUpdateWindow.qml @@ -17,7 +17,7 @@ UM.Dialog visible: true; modality: Qt.ApplicationModal; - title: "Firmware Update"; + title: catalog.i18nc("@title:window","Firmware Update"); Column { @@ -25,7 +25,8 @@ UM.Dialog Text { - anchors { + anchors + { left: parent.left; right: parent.right; } @@ -34,17 +35,17 @@ UM.Dialog if (manager.progress == 0) { //: Firmware update status label - return qsTr("Starting firmware update, this may take a while.") + return catalog.i18nc("@label","Starting firmware update, this may take a while.") } else if (manager.progress > 99) { //: Firmware update status label - return qsTr("Firmware update completed.") + return catalog.i18nc("@label","Firmware update completed.") } else { //: Firmware update status label - return qsTr("Updating firmware.") + return catalog.i18nc("@label","Updating firmware.") } } @@ -57,20 +58,23 @@ UM.Dialog value: manager.progress minimumValue: 0; maximumValue: 100; - anchors { + anchors + { left: parent.left; right: parent.right; } } - SystemPalette { + SystemPalette + { id: palette; } } rightButtons: [ - Button { + Button + { text: "Close"; enabled: manager.progress >= 100; onClicked: base.visible = false; diff --git a/resources/qml/AboutDialog.qml b/resources/qml/AboutDialog.qml index a736a7fbda..b81496f18c 100644 --- a/resources/qml/AboutDialog.qml +++ b/resources/qml/AboutDialog.qml @@ -5,17 +5,21 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Window 2.1 -import UM 1.0 as UM +import UM 1.1 as UM -UM.Dialog { +UM.Dialog +{ id: base //: About dialog title - title: qsTr("About Cura") + title: catalog.i18nc("@title:window","About Cura") minimumWidth: 400 - minimumHeight: 300 + minimumHeight: 300; + //UM.I18nCatalog { id: catalog; } - Image { + + Image + { id: logo width: parent.width * 0.75 height: width * (1/4.25) @@ -26,9 +30,11 @@ UM.Dialog { sourceSize.height: height anchors.centerIn: parent anchors.verticalCenterOffset : -(height * 0.5) + UM.I18nCatalog{id: catalog; name:"cura"} } - Label { + Label + { id: version text: "Cura %1".arg(UM.Application.version) @@ -39,30 +45,33 @@ UM.Dialog { anchors.topMargin : 5 } - Label { + Label + { id: description width: parent.width //: About dialog application description - text: qsTr("End-to-end solution for fused filament 3D printing.") + text: catalog.i18nc("@label","End-to-end solution for fused filament 3D printing.") wrapMode: Text.WordWrap anchors.top: version.bottom anchors.topMargin : 10 } - Label { + Label + { id: author_note width: parent.width //: About dialog application author note - text: qsTr("Cura has been developed by Ultimaker B.V. in cooperation with the community.") + text: catalog.i18nc("@label","Cura has been developed by Ultimaker B.V. in cooperation with the community.") wrapMode: Text.WordWrap anchors.top: description.bottom } - rightButtons: Button { + rightButtons: Button + { //: Close about dialog button - text: qsTr("Close"); + text: catalog.i18nc("@action:button","Close"); onClicked: base.visible = false; } diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 29bd573d12..338868812b 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -3,9 +3,10 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 -import UM 1.0 as UM +import UM 1.1 as UM -Item { +Item +{ property alias open: openAction; property alias save: saveAction; property alias quit: quitAction; @@ -42,60 +43,69 @@ Item { property alias toggleFullScreen: toggleFullScreenAction; + UM.I18nCatalog{id: catalog; name:"cura"} + Action { id:toggleFullScreenAction shortcut: StandardKey.FullScreen; } - Action { + Action + { id: undoAction; //: Undo action - text: qsTr("Undo"); + text: catalog.i18nc("@action","Undo"); iconName: "edit-undo"; shortcut: StandardKey.Undo; } - Action { + Action + { id: redoAction; //: Redo action - text: qsTr("Redo"); + text: catalog.i18nc("@action","Redo"); iconName: "edit-redo"; shortcut: StandardKey.Redo; } - Action { + Action + { id: quitAction; //: Quit action - text: qsTr("Quit"); + text: catalog.i18nc("@action","Quit"); iconName: "application-exit"; shortcut: StandardKey.Quit; } - Action { + Action + { id: preferencesAction; //: Preferences action - text: qsTr("Preferences..."); + text: catalog.i18nc("@action","Preferences..."); iconName: "configure"; } - Action { + Action + { id: addMachineAction; //: Add Printer action - text: qsTr("Add Printer..."); + text: catalog.i18nc("@action","Add Printer..."); } - Action { + Action + { id: settingsAction; //: Configure Printers action - text: qsTr("Configure Printers"); + text: catalog.i18nc("@action","Configure Printers"); iconName: "configure"; } - Action { + Action + { id: documentationAction; //: Show Online Documentation action - text: qsTr("Show Online &Documentation"); + text: catalog.i18nc("@action","Show Online &Documentation"); iconName: "help-contents"; shortcut: StandardKey.Help; } @@ -103,118 +113,131 @@ Item { Action { id: reportBugAction; //: Report a Bug Action - text: qsTr("Report a &Bug"); + text: catalog.i18nc("@action","Report a &Bug"); iconName: "tools-report-bug"; } - Action { + Action + { id: aboutAction; //: About action - text: qsTr("About..."); + text: catalog.i18nc("@action","About..."); iconName: "help-about"; } - Action { + Action + { id: deleteSelectionAction; //: Delete selection action - text: qsTr("Delete Selection"); + text: catalog.i18nc("@action","Delete Selection"); iconName: "edit-delete"; shortcut: StandardKey.Delete; } - Action { + Action + { id: deleteObjectAction; //: Delete object action - text: qsTr("Delete Object"); + text: catalog.i18nc("@action","Delete Object"); iconName: "edit-delete"; shortcut: StandardKey.Backspace; } - Action { + Action + { id: centerObjectAction; //: Center object action - text: qsTr("Center Object on Platform"); + text: catalog.i18nc("@action","Center Object on Platform"); } Action { id: groupObjectsAction - text: qsTr("Group objects"); + text: catalog.i18nc("@action","Group objects"); enabled: UM.Scene.numObjectsSelected > 1 ? true: false } Action { id: unGroupObjectsAction - text: qsTr("Ungroup objects"); + text: catalog.i18nc("@action","Ungroup objects"); enabled: UM.Scene.isGroupSelected } Action { id: mergeObjectsAction - text: qsTr("Merge objects"); + text: catalog.i18nc("@action","Merge objects"); enabled: UM.Scene.numObjectsSelected > 1 ? true: false } - Action { + Action + { id: multiplyObjectAction; //: Duplicate object action - text: qsTr("Duplicate Object"); + text: catalog.i18nc("@action","Duplicate Object"); } - Action { + Action + { id: splitObjectAction; //: Split object action - text: qsTr("Split Object into Parts"); + text: catalog.i18nc("@action","Split Object into Parts"); enabled: false; } - Action { + Action + { id: deleteAllAction; //: Clear build platform action - text: qsTr("Clear Build Platform"); + text: catalog.i18nc("@action","Clear Build Platform"); iconName: "edit-clear"; } - Action { + Action + { id: reloadAllAction; //: Reload all objects action - text: qsTr("Reload All Objects"); + text: catalog.i18nc("@action","Reload All Objects"); } - Action { + Action + { id: resetAllTranslationAction; //: Reset all positions action - text: qsTr("Reset All Object Positions"); + text: catalog.i18nc("@action","Reset All Object Positions"); } - Action { + Action + { id: resetAllAction; //: Reset all positions action - text: qsTr("Reset All Object Transformations"); + text: catalog.i18nc("@action","Reset All Object Transformations"); } - Action { + Action + { id: openAction; //: Open file action - text: qsTr("Load file"); + text: catalog.i18nc("@action","Load file"); iconName: "document-open"; shortcut: StandardKey.Open; } - Action { + Action + { id: saveAction; //: Save file action - text: qsTr("Save..."); + text: catalog.i18nc("@action","Save..."); iconName: "document-save"; shortcut: StandardKey.Save; } - Action { + Action + { id: showEngineLogAction; //: Show engine log action - text: qsTr("Show engine &log..."); + text: catalog.i18nc("@action","Show engine &log..."); iconName: "view-list-text"; } } diff --git a/resources/qml/AddMachineWizard.qml b/resources/qml/AddMachineWizard.qml index c236c6a19d..af200d07c7 100644 --- a/resources/qml/AddMachineWizard.qml +++ b/resources/qml/AddMachineWizard.qml @@ -6,18 +6,22 @@ import QtQuick.Controls 1.1 import QtQuick.Layouts 1.1 import QtQuick.Window 2.1 -import UM 1.0 as UM +import UM 1.1 as UM UM.Wizard { //: Add Printer dialog title - wizardTitle: qsTr("Add Printer") + wizardTitle: catalog.i18nc("@title:wizard","Add Printer") wizardPages: [ { title: "Add Printer", page: "AddMachine.qml" } ] + Item + { + UM.I18nCatalog{id: catalog; name:"cura"} + } // This part is optional // This part checks whether there is a printer -> if not: some of the functions (delete for example) are disabled diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index e54a00d9d0..6c240bcb48 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -9,38 +9,46 @@ import QtQuick.Dialogs 1.1 import UM 1.1 as UM -UM.MainWindow { +UM.MainWindow +{ id: base visible: true //: Cura application window title - title: qsTr("Cura"); + title: catalog.i18nc("@title:window","Cura"); - Item { + Item + { id: backgroundItem; anchors.fill: parent; - - UM.ApplicationMenu { + UM.I18nCatalog{id: catalog; name:"cura"} + UM.ApplicationMenu + { id: menu window: base - Menu { + Menu + { id: fileMenu //: File menu - title: qsTr("&File"); + title: catalog.i18nc("@title:menu","&File"); MenuItem { action: actions.open; } - Menu { + Menu + { id: recentFilesMenu; - title: "Open Recent" + title: catalog.i18nc("@title:menu","Open Recent") iconName: "document-open-recent"; enabled: Printer.recentFiles.length > 0; - Instantiator { + Instantiator + { model: Printer.recentFiles - MenuItem { - text: { + MenuItem + { + text: + { var path = modelData.toString() return (index + 1) + ". " + path.slice(path.lastIndexOf("/") + 1); } @@ -53,22 +61,26 @@ UM.MainWindow { MenuSeparator { } - MenuItem { - text: "Save Selection to File"; + MenuItem + { + text: catalog.i18nc("@action:menu", "Save Selection to File"); enabled: UM.Selection.hasSelection; iconName: "document-save-as"; onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file"); } - Menu { + Menu + { id: saveAllMenu - title: "Save All" + title: catalog.i18nc("@title:menu","Save All") iconName: "document-save"; enabled: devicesModel.count > 0 && UM.Backend.progress > 0.99; - Instantiator { + Instantiator + { model: UM.OutputDevicesModel { id: devicesModel; } - MenuItem { + MenuItem + { text: model.description; onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id); } @@ -82,9 +94,10 @@ UM.MainWindow { MenuItem { action: actions.quit; } } - Menu { + Menu + { //: Edit menu - title: qsTr("&Edit"); + title: catalog.i18nc("@title:menu","&Edit"); MenuItem { action: actions.undo; } MenuItem { action: actions.redo; } @@ -94,7 +107,7 @@ UM.MainWindow { } Menu { - title: qsTr("&View"); + title: catalog.i18nc("@title:menu","&View"); id: top_view_menu Instantiator { @@ -112,14 +125,17 @@ UM.MainWindow { } ExclusiveGroup { id: view_menu_top_group; } } - Menu { + Menu + { id: machineMenu; //: Machine menu - title: qsTr("&Machine"); + title: catalog.i18nc("@title:menu","&Machine"); - Instantiator { + Instantiator + { model: UM.Models.machinesModel - MenuItem { + MenuItem + { text: model.name; checkable: true; checked: model.active; @@ -138,10 +154,11 @@ UM.MainWindow { MenuItem { action: actions.configureMachines; } } - Menu { + Menu + { id: extension_menu //: Extensions menu - title: qsTr("E&xtensions"); + title: catalog.i18nc("@title:menu","E&xtensions"); Instantiator { @@ -170,16 +187,18 @@ UM.MainWindow { } } - Menu { + Menu + { //: Settings menu - title: qsTr("&Settings"); + title: catalog.i18nc("@title:menu","&Settings"); MenuItem { action: actions.preferences; } } - Menu { + Menu + { //: Help menu - title: qsTr("&Help"); + title: catalog.i18nc("@title:menu","&Help"); MenuItem { action: actions.showEngineLog; } MenuItem { action: actions.documentation; } @@ -189,7 +208,8 @@ UM.MainWindow { } } - Item { + Item + { id: contentItem; y: menu.height @@ -198,19 +218,25 @@ UM.MainWindow { Keys.forwardTo: menu - DropArea { + DropArea + { anchors.fill: parent; - onDropped: { - if(drop.urls.length > 0) { - for(var i in drop.urls) { + onDropped: + { + if(drop.urls.length > 0) + { + for(var i in drop.urls) + { UM.MeshFileHandler.readLocalFile(drop.urls[i]); } } } } - UM.MessageStack { - anchors { + UM.MessageStack + { + anchors + { horizontalCenter: parent.horizontalCenter horizontalCenterOffset: -(UM.Theme.sizes.logo.width/ 2) top: parent.verticalCenter; @@ -237,12 +263,14 @@ UM.MainWindow { source: UM.ActiveView.valid ? UM.ActiveView.activeViewPanel : ""; } - Button { + Button + { id: openFileButton; //style: UM.Backend.progress < 0 ? UM.Theme.styles.open_file_button : UM.Theme.styles.tool_button; style: UM.Theme.styles.open_file_button tooltip: ''; - anchors { + anchors + { top: parent.top; topMargin: UM.Theme.sizes.loadfile_margin.height left: parent.left; @@ -251,9 +279,11 @@ UM.MainWindow { action: actions.open; } - Image { + Image + { id: logo - anchors { + anchors + { left: parent.left leftMargin: UM.Theme.sizes.default_margin.width; bottom: parent.bottom @@ -268,24 +298,29 @@ UM.MainWindow { sourceSize.height: height; } - Button { + Button + { id: viewModeButton - anchors { + anchors + { top: parent.top; right: sidebar.left; rightMargin: UM.Theme.sizes.window_margin.width; } //: View Mode toolbar button - text: qsTr("View Mode"); + text: catalog.i18nc("@action:button","View Mode"); iconSource: UM.Theme.icons.viewmode; style: UM.Theme.styles.tool_button; tooltip: ''; - menu: Menu { + menu: Menu + { id: viewMenu; - Instantiator { + Instantiator + { model: UM.Models.viewModel; - MenuItem { + MenuItem + { text: model.name; checkable: true; checked: model.active; @@ -300,20 +335,24 @@ UM.MainWindow { } } - Toolbar { + Toolbar + { id: toolbar; - anchors { + anchors + { horizontalCenter: parent.horizontalCenter horizontalCenterOffset: -(UM.Theme.sizes.panel.width / 2) top: parent.top; } } - Sidebar { + Sidebar + { id: sidebar; - anchors { + anchors + { top: parent.top; bottom: parent.bottom; right: parent.right; @@ -325,13 +364,15 @@ UM.MainWindow { configureMachinesAction: actions.configureMachines; } - Rectangle { + Rectangle + { x: base.mouseX + UM.Theme.sizes.default_margin.width; y: base.mouseY + UM.Theme.sizes.default_margin.height; width: childrenRect.width; height: childrenRect.height; - Label { + Label + { text: UM.ActiveTool.properties.Rotation != undefined ? "%1°".arg(UM.ActiveTool.properties.Rotation) : ""; } @@ -340,23 +381,26 @@ UM.MainWindow { } } - UM.PreferencesDialog { + UM.PreferencesDialog + { id: preferences - Component.onCompleted: { + Component.onCompleted: + { //; Remove & re-add the general page as we want to use our own instead of uranium standard. removePage(0); - insertPage(0, qsTr("General") , "" , Qt.resolvedUrl("./GeneralPage.qml")); + insertPage(0, catalog.i18nc("@title:tab","General") , "" , Qt.resolvedUrl("./GeneralPage.qml")); //: View preferences page title - insertPage(1, qsTr("View"), "view-preview", Qt.resolvedUrl("./ViewPage.qml")); + insertPage(1, catalog.i18nc("@title:tab","View"), "view-preview", Qt.resolvedUrl("./ViewPage.qml")); //Force refresh setPage(0) } } - Actions { + Actions + { id: actions; open.onTriggered: openDialog.open(); @@ -369,28 +413,36 @@ UM.MainWindow { redo.onTriggered: UM.OperationStack.redo(); redo.enabled: UM.OperationStack.canRedo; - deleteSelection.onTriggered: { - if(objectContextMenu.objectId != 0) { + deleteSelection.onTriggered: + { + if(objectContextMenu.objectId != 0) + { Printer.deleteObject(objectContextMenu.objectId); } } - deleteObject.onTriggered: { - if(objectContextMenu.objectId != 0) { + deleteObject.onTriggered: + { + if(objectContextMenu.objectId != 0) + { Printer.deleteObject(objectContextMenu.objectId); objectContextMenu.objectId = 0; } } - multiplyObject.onTriggered: { - if(objectContextMenu.objectId != 0) { + multiplyObject.onTriggered: + { + if(objectContextMenu.objectId != 0) + { Printer.multiplyObject(objectContextMenu.objectId, 1); objectContextMenu.objectId = 0; } } - centerObject.onTriggered: { - if(objectContextMenu.objectId != 0) { + centerObject.onTriggered: + { + if(objectContextMenu.objectId != 0) + { Printer.centerObject(objectContextMenu.objectId); objectContextMenu.objectId = 0; } @@ -429,7 +481,8 @@ UM.MainWindow { } - Menu { + Menu + { id: objectContextMenu; property variant objectId: -1; @@ -448,7 +501,8 @@ UM.MainWindow { MenuItem { action: actions.mergeObjects;} } - Menu { + Menu + { id: contextMenu; MenuItem { action: actions.deleteAll; } MenuItem { action: actions.reloadAll; } @@ -459,23 +513,28 @@ UM.MainWindow { MenuItem { action: actions.mergeObjects;} } - Connections { + Connections + { target: UM.Controller - onContextMenuRequested: { - if(objectId == 0) { + onContextMenuRequested: + { + if(objectId == 0) + { contextMenu.popup(); - } else { + } else + { objectContextMenu.objectId = objectId; objectContextMenu.popup(); } } } - FileDialog { + FileDialog + { id: openDialog; //: File open dialog title - title: qsTr("Open File") + title: catalog.i18nc("@title:window","Open File") modality: UM.Application.platform == "linux" ? Qt.NonModal : Qt.WindowModal; //TODO: Support multiple file selection, workaround bug in KDE file dialog //selectMultiple: true @@ -488,22 +547,27 @@ UM.MainWindow { } } - EngineLog { + EngineLog + { id: engineLog; } - AddMachineWizard { + AddMachineWizard + { id: addMachineWizard } - AboutDialog { + AboutDialog + { id: aboutDialog } - Connections { + Connections + { target: Printer - onRequestAddPrinter: { + onRequestAddPrinter: + { addMachineWizard.visible = true addMachineWizard.printer = false } diff --git a/resources/qml/EngineLog.qml b/resources/qml/EngineLog.qml index 0248ba0ea7..db505bd7ec 100644 --- a/resources/qml/EngineLog.qml +++ b/resources/qml/EngineLog.qml @@ -5,40 +5,48 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Layouts 1.1 -import UM 1.0 as UM +import UM 1.1 as UM -UM.Dialog { +UM.Dialog +{ id: dialog; //: Engine Log dialog title - title: qsTr("Engine Log"); + title: catalog.i18nc("@title:window","Engine Log"); modality: Qt.NonModal; - TextArea { + TextArea + { id: textArea anchors.fill: parent; - Timer { + Timer + { id: updateTimer; interval: 1000; running: false; repeat: true; onTriggered: textArea.text = Printer.getEngineLog(); } + UM.I18nCatalog{id: catalog; name:"cura"} } - rightButtons: Button { + rightButtons: Button + { //: Close engine log button - text: qsTr("Close"); + text: catalog.i18nc("@action:button","Close"); onClicked: dialog.visible = false; } - onVisibleChanged: { - if(visible) { + onVisibleChanged: + { + if(visible) + { textArea.text = Printer.getEngineLog(); updateTimer.start(); - } else { + } else + { updateTimer.stop(); } } diff --git a/resources/qml/GeneralPage.qml b/resources/qml/GeneralPage.qml index 1b12628e92..896da66104 100644 --- a/resources/qml/GeneralPage.qml +++ b/resources/qml/GeneralPage.qml @@ -6,12 +6,12 @@ import QtQuick.Controls 1.1 import QtQuick.Layouts 1.1 import QtQuick.Controls.Styles 1.1 -import UM 1.0 as UM +import UM 1.1 as UM UM.PreferencesPage { //: General configuration page title - title: qsTr("General"); + title: catalog.i18nc("@title:wizard","General"); function reset() { @@ -26,10 +26,11 @@ UM.PreferencesPage { columns: 2; //: Language selection label + UM.I18nCatalog{id: catalog; name:"cura"} Label { id: languageLabel - text: qsTr("Language") + text: catalog.i18nc("@label","Language") } ComboBox @@ -76,7 +77,7 @@ UM.PreferencesPage // Because ListModel is stupid and does not allow using qsTr() for values. for(var i = 0; i < languageList.count; ++i) { - languageList.setProperty(i, "text", qsTr(languageList.get(i).text)); + languageList.setProperty(i, "text", catalog.i18nc("@action:menu",languageList.get(i).text)); } // Glorious hack time. ComboBox does not update the text properly after changing the @@ -92,7 +93,7 @@ UM.PreferencesPage Layout.columnSpan: 2 //: Language change warning - text: qsTr("You will need to restart the application for language changes to have effect.") + text: catalog.i18nc("@label","You will need to restart the application for language changes to have effect.") wrapMode: Text.WordWrap font.italic: true } @@ -108,11 +109,11 @@ UM.PreferencesPage id: pushFreeText //is a button so the user doesn't have te click inconvenientley precise to enable or disable the checkbox //: Display Overhang preference checkbox - text: qsTr("Automatic push free"); + text: catalog.i18nc("@action:checkbox","Automatic push free"); onClicked: pushFreeCheckbox.checked = !pushFreeCheckbox.checked //: Display Overhang preference tooltip - tooltip: "Are objects on the platform automatically moved so they no longer intersect" + tooltip: catalog.i18nc("@info:tooltip","Are objects on the platform automatically moved so they no longer intersect") style: ButtonStyle { @@ -141,11 +142,11 @@ UM.PreferencesPage id: sendDataText //is a button so the user doesn't have te click inconvenientley precise to enable or disable the checkbox //: Display Overhang preference checkbox - text: qsTr("Send (anonymous) slice info"); + text: catalog.i18nc("@action:checkbox","Send (anonymous) slice info"); onClicked: sendDataCheckbox.checked = !sendDataCheckbox.checked //: Display Overhang preference tooltip - tooltip: "Should anonymous data about your slices be sent to Ultimaker. No models or IP's are sent / stored." + tooltip: catalog.i18nc("@info:tooltip","Should anonymous data about your slices be sent to Ultimaker. No models or IP's are sent / stored.") style: ButtonStyle { diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index ec2066713f..50cbdf04b6 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -8,7 +8,8 @@ import QtQuick.Layouts 1.1 import UM 1.1 as UM -Rectangle { +Rectangle +{ id: base; property real progress: UM.Backend.progress; @@ -17,8 +18,9 @@ Rectangle { property variant printDuration: PrintInformation.currentPrintTime; property real printMaterialAmount: PrintInformation.materialAmount; - - Rectangle{ + UM.I18nCatalog { id: catalog; name:"cura"} + Rectangle + { id: background implicitWidth: base.width; implicitHeight: parent.height; @@ -26,7 +28,8 @@ Rectangle { border.width: UM.Theme.sizes.save_button_border.width border.color: UM.Theme.colors.save_button_border - Rectangle { + Rectangle + { id: infoBox width: parent.width - UM.Theme.sizes.default_margin.width * 2; height: UM.Theme.sizes.save_button_slicing_bar.height @@ -39,7 +42,8 @@ Rectangle { border.width: UM.Theme.sizes.save_button_border.width border.color: UM.Theme.colors.save_button_border color: UM.Theme.colors.save_button_estimated_text_background; - Label { + Label + { id: label; anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left @@ -47,24 +51,27 @@ Rectangle { visible: base.progress >= 0 && base.progress < 0.99 ? false : true color: UM.Theme.colors.save_button_estimated_text; font: UM.Theme.fonts.small; - text: { - if(base.activity == false) { - //: Save button label - return qsTr("Please load a 3D model"); - } else if (base.progress < 0.99) { - //: Save button label - return qsTr("Calculating Print-time"); - } else if (base.printDuration.days > 0 || base.progress == null){ - return qsTr(""); + text: + { + if(base.activity == false) + { + return catalog.i18nc("@label","Please load a 3D model"); + } else if (base.progress < 0.99) + { + return catalog.i18nc("@label","Calculating Print-time"); + } else if (base.printDuration.days > 0 || base.progress == null) + { + return ""; } - else if (base.progress > 0.99){ - //: Save button label - return qsTr("Estimated Print-time"); + else if (base.progress > 0.99) + { + return catalog.i18nc("@label","Estimated Print-time"); } return ""; } } - Label { + Label + { id: printDurationLabel anchors.verticalCenter: parent.verticalCenter anchors.left: label.right; @@ -74,7 +81,8 @@ Rectangle { visible: base.activity == false || base.progress < 0.99 ? false : true text: (!base.printDuration || !base.printDuration.valid) ? "" : base.printDuration.getDisplayString(UM.DurationFormat.Long); } - Label { + Label + { id: printMaterialLabel anchors.verticalCenter: parent.verticalCenter anchors.left: printDurationLabel.right; @@ -86,12 +94,14 @@ Rectangle { elide: mediumLengthDuration ? Text.ElideRight : Text.ElideNone visible: base.activity == false || base.progress < 0.99 ? false : true //: Print material amount save button label - text: base.printMaterialAmount < 0 ? "" : qsTr("%1m of Material").arg(base.printMaterialAmount); + text: base.printMaterialAmount < 0 ? "" : catalog.i18nc("@label","%1m of Material").arg(base.printMaterialAmount); } } - Rectangle { + Rectangle + { id: infoBoxOverlay - anchors { + anchors + { left: infoBox.left; top: infoBox.top; bottom: infoBox.bottom; @@ -101,7 +111,8 @@ Rectangle { visible: progress > 0.99 ? false : true } - Button { + Button + { id: saveToButton anchors.top: infoBox.bottom anchors.topMargin: UM.Theme.sizes.save_button_text_margin.height; @@ -115,11 +126,14 @@ Rectangle { text: UM.OutputDeviceManager.activeDeviceShortDescription; - style: ButtonStyle { - background: Rectangle { + style: ButtonStyle + { + background: Rectangle + { color: !control.enabled ? UM.Theme.colors.save_button_inactive : control.hovered ? UM.Theme.colors.save_button_active_hover : UM.Theme.colors.save_button_active; - Label { + Label + { anchors.centerIn: parent color: UM.Theme.colors.save_button_safe_to_text; font: UM.Theme.fonts.sidebar_save_to; @@ -131,14 +145,15 @@ Rectangle { onClicked: UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice) } - Button { + Button + { id: deviceSelectionMenu; anchors.top: infoBox.bottom anchors.topMargin: UM.Theme.sizes.save_button_text_margin.height anchors.right: parent.right anchors.rightMargin: UM.Theme.sizes.default_margin.width; - tooltip: qsTr("Select the active output device"); + tooltip: catalog.i18nc("@info:tooltip","Select the active output device"); width: infoBox.width/6*1.3 - UM.Theme.sizes.save_button_text_margin.height; height: UM.Theme.sizes.save_button_save_to_button.height @@ -146,12 +161,14 @@ Rectangle { iconSource: UM.Theme.icons[UM.OutputDeviceManager.activeDeviceIconName]; style: ButtonStyle { - background: Rectangle { + background: Rectangle + { color: UM.Theme.colors.save_button_background; border.width: control.hovered ? UM.Theme.sizes.save_button_border.width : 0 border.color: UM.Theme.colors.save_button_border - Rectangle { + Rectangle + { id: deviceSelectionIcon color: UM.Theme.colors.save_button_background; anchors.left: parent.left @@ -160,7 +177,8 @@ Rectangle { width: parent.height - UM.Theme.sizes.save_button_text_margin.width ; height: parent.height - UM.Theme.sizes.save_button_text_margin.width; - UM.RecolorImage { + UM.RecolorImage + { anchors.fill: parent; sourceSize.width: width; sourceSize.height: height; @@ -168,7 +186,8 @@ Rectangle { source: control.iconSource; } } - Label { + Label + { id: deviceSelectionArrow anchors.right: parent.right; anchors.rightMargin: UM.Theme.sizes.save_button_text_margin.height @@ -181,18 +200,19 @@ Rectangle { label: Item { } } - menu: Menu { + menu: Menu + { id: devicesMenu; - Instantiator { + Instantiator + { model: devicesModel; - MenuItem { + MenuItem + { text: model.description checkable: true; checked: model.id == UM.OutputDeviceManager.activeDevice; exclusiveGroup: devicesMenuGroup; - onTriggered: { - UM.OutputDeviceManager.setActiveDevice(model.id); - } + onTriggered: UM.OutputDeviceManager.setActiveDevice(model.id); } onObjectAdded: devicesMenu.insertItem(index, object) onObjectRemoved: devicesMenu.removeItem(object) @@ -202,7 +222,8 @@ Rectangle { } } - UM.OutputDevicesModel { + UM.OutputDevicesModel + { id: devicesModel; } } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 0c908fc789..6c10cf6136 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -6,42 +6,50 @@ import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 -import UM 1.0 as UM +import UM 1.1 as UM -Rectangle { +Rectangle +{ id: base; property Action addMachineAction; property Action configureMachinesAction; color: UM.Theme.colors.sidebar; + UM.I18nCatalog { id: catalog; name:"cura"} - function showTooltip(item, position, text) { + function showTooltip(item, position, text) + { tooltip.text = text; position = item.mapToItem(base, position.x, position.y / 2); tooltip.show(position); } - function hideTooltip() { + function hideTooltip() + { tooltip.hide(); } - MouseArea { + MouseArea + { anchors.fill: parent acceptedButtons: Qt.AllButtons; - onWheel: { + onWheel: + { wheel.accepted = true; } } - ColumnLayout { + ColumnLayout + { anchors.fill: parent; anchors.topMargin: UM.Theme.sizes.default_margin.height; spacing: UM.Theme.sizes.default_margin.height; - SidebarHeader { + SidebarHeader + { id: header; Layout.fillWidth: true; @@ -50,9 +58,11 @@ Rectangle { configureMachinesAction: base.configureMachinesAction; modesModel: modesListModel; - currentModeIndex: { + currentModeIndex: + { var index = parseInt(UM.Preferences.getValue("cura/active_mode")) - if(index) { + if(index) + { return index; } return 0; @@ -60,7 +70,8 @@ Rectangle { onCurrentModeIndexChanged: UM.Preferences.setValue("cura/active_mode", currentModeIndex); } - Loader { + Loader + { id: sidebarContents; Layout.fillWidth: true; @@ -87,18 +98,21 @@ Rectangle { } } - SaveButton { + SaveButton + { id: saveButton; implicitWidth: base.width implicitHeight: UM.Theme.sizes.save_button_text_margin.height * 2 + UM.Theme.sizes.save_button_slicing_bar.height + UM.Theme.sizes.save_button_save_to_button.height + UM.Theme.sizes.default_margin.height } } - SidebarTooltip { + SidebarTooltip + { id: tooltip; } - ListModel { + ListModel + { id: modesListModel; //: Simple configuration mode option ListElement { text: QT_TR_NOOP("Simple"); file: "SidebarSimple.qml" } @@ -106,10 +120,11 @@ Rectangle { ListElement { text: QT_TR_NOOP("Advanced"); file: "SidebarAdvanced.qml" } } - Component.onCompleted: { + Component.onCompleted: + { for(var i = 0; i < modesListModel.count; ++i) { - modesListModel.setProperty(i, "text", qsTr(modesListModel.get(i).text)); + modesListModel.setProperty(i, "text", catalog.i18nc("@label", modesListModel.get(i).text)); } } } diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index efc6949668..1223b8ff70 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -6,9 +6,10 @@ import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 -import UM 1.0 as UM +import UM 1.1 as UM -Column { +Column +{ id: base; property variant modesModel; @@ -17,37 +18,43 @@ Column { property Action configureMachinesAction; spacing: UM.Theme.sizes.default_margin.height; - - RowLayout { + UM.I18nCatalog { id: catalog; name:"cura"} + RowLayout + { anchors.horizontalCenter: parent.horizontalCenter; width: parent.width - UM.Theme.sizes.default_margin.width * 2; height: UM.Theme.sizes.line.height; - Label { + Label + { //: Configuration mode label - text: qsTr("Mode:"); + text: catalog.i18nc("@label","Mode:"); font: UM.Theme.fonts.sidebar_header; color: UM.Theme.colors.text_inactive; } - ToolButton { + ToolButton + { text: base.modesModel ? base.modesModel.get(modeMenu.currentIndex).text : ""; style: UM.Theme.styles.sidebar_header_button; Layout.preferredWidth: base.width * 0.25; - menu: Menu { + menu: Menu + { id: modeMenu; property int currentIndex: 0; - Instantiator { + Instantiator + { model: base.modesModel; - MenuItem { + MenuItem + { text: model.text; checkable: true; checked: modeMenu.currentIndex == index; @@ -62,21 +69,24 @@ Column { } } - Rectangle { + Rectangle + { width: 1; height: parent.height; color: UM.Theme.colors.border; } - Label { + Label + { //: Machine selection label - text: qsTr("Machine:"); + text: catalog.i18nc("@label","Machine:"); font: UM.Theme.fonts.sidebar_header; color: UM.Theme.colors.text_inactive; } - ToolButton { + ToolButton + { id: machineButton; text: UM.Application.machineName; tooltip: UM.Application.machineName; @@ -85,11 +95,14 @@ Column { Layout.fillWidth: true; - menu: Menu { + menu: Menu + { id: machineMenu; - Instantiator { + Instantiator + { model: UM.Models.machinesModel - MenuItem { + MenuItem + { text: model.name; checkable: true; checked: model.active; @@ -110,14 +123,15 @@ Column { } } - UM.SidebarCategoryHeader { + UM.SidebarCategoryHeader + { width: parent.width; height: UM.Theme.sizes.section.height; iconSource: UM.Theme.icons.printsetup; //: Sidebar header label - text: qsTr("Print Setup"); + text: catalog.i18nc("@label","Print Setup"); enabled: false; color: UM.Theme.colors.primary; diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index c27f992031..4da532a837 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -6,9 +6,10 @@ import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 -import UM 1.0 as UM +import UM 1.1 as UM -Item { +Item +{ id: base; anchors.fill: parent; @@ -22,44 +23,47 @@ Item { Component.onCompleted: PrintInformation.enabled = true Component.onDestruction: PrintInformation.enabled = false - - ColumnLayout { + UM.I18nCatalog { id: catalog; name:"cura"} + ColumnLayout + { anchors.fill: parent; - Item { + Item + { Layout.fillWidth: true; Layout.preferredHeight: UM.Theme.sizes.section.height; - Label { + Label + { anchors.left: parent.left; anchors.verticalCenter: parent.verticalCenter; text: base.minimumPrintTime.valid ? base.minimumPrintTime.getDisplayString(UM.DurationFormat.Short) : "??:??"; font: UM.Theme.fonts.timeslider_time; color: UM.Theme.colors.primary; } - Label { + Label + { anchors.centerIn: parent; - text: { + text: //: Sidebar configuration label + { if (UM.Backend.progress < 0) { - //: Sidebar configuration label - return qsTr("No Model Loaded"); + return catalog.i18nc("@label","No Model Loaded"); } else if (!base.minimumPrintTime.valid || !base.maximumPrintTime.valid) { - //: Sidebar configuration label - return qsTr("Calculating...") + return catalog.i18nc("@label","Calculating...") } else { - //: Sidebar configuration label - return qsTr("Estimated Print Time"); + return catalog.i18nc("@label","Estimated Print Time"); } } color: UM.Theme.colors.text; font: UM.Theme.fonts.default; } - Label { + Label + { anchors.right: parent.right; anchors.verticalCenter: parent.verticalCenter; text: base.maximumPrintTime.valid ? base.maximumPrintTime.getDisplayString(UM.DurationFormat.Short) : "??:??"; @@ -68,7 +72,8 @@ Item { } } - Slider { + Slider + { Layout.fillWidth: true; Layout.preferredHeight: UM.Theme.sizes.section.height; @@ -81,38 +86,42 @@ Item { style: UM.Theme.styles.slider; } - Item { + Item + { Layout.fillWidth: true; Layout.preferredHeight: UM.Theme.sizes.section.height; - Label { + Label + { anchors.left: parent.left; anchors.verticalCenter: parent.verticalCenter; //: Quality slider label - text: qsTr("Minimum\nDraft"); + text: catalog.i18nc("@label","Minimum\nDraft"); color: UM.Theme.colors.text; font: UM.Theme.fonts.default; } - Label { + Label + { anchors.right: parent.right; anchors.verticalCenter: parent.verticalCenter; //: Quality slider label - text: qsTr("Maximum\nQuality"); + text: catalog.i18nc("@label","Maximum\nQuality"); horizontalAlignment: Text.AlignRight; color: UM.Theme.colors.text; font: UM.Theme.fonts.default; } } - CheckBox { + CheckBox + { Layout.fillWidth: true; Layout.preferredHeight: UM.Theme.sizes.section.height; //: Setting checkbox - text: qsTr("Enable Support"); + text: catalog.i18nc("@action:checkbox","Enable Support"); style: UM.Theme.styles.checkbox; diff --git a/resources/qml/ViewPage.qml b/resources/qml/ViewPage.qml index 952e7a9948..3bab4acd1a 100644 --- a/resources/qml/ViewPage.qml +++ b/resources/qml/ViewPage.qml @@ -6,14 +6,14 @@ import QtQuick.Controls 1.1 import QtQuick.Layouts 1.1 import QtQuick.Controls.Styles 1.1 -import UM 1.0 as UM +import UM 1.1 as UM UM.PreferencesPage { id: preferencesPage //: View configuration page title - title: qsTr("View"); + title: catalog.i18nc("@title:window","View"); function reset() { @@ -26,7 +26,7 @@ UM.PreferencesPage GridLayout { columns: 2; - + UM.I18nCatalog { id: catalog; name:"cura"} CheckBox { id: overhangCheckbox @@ -38,18 +38,21 @@ UM.PreferencesPage id: viewText //is a button so the user doesn't have te click inconvenientley precise to enable or disable the checkbox //: Display Overhang preference checkbox - text: qsTr("Display Overhang"); + text: catalog.i18nc("@action:button","Display Overhang"); onClicked: overhangCheckbox.checked = !overhangCheckbox.checked //: Display Overhang preference tooltip - tooltip: "Highlight unsupported areas of the model in red. Without support these areas will nog print properly." + tooltip: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will nog print properly." - style: ButtonStyle { - background: Rectangle { + style: ButtonStyle + { + background: Rectangle + { border.width: 0 color: "transparent" } - label: Text { + label: Text + { renderType: Text.NativeRendering horizontalAlignment: Text.AlignLeft text: control.text @@ -68,11 +71,11 @@ UM.PreferencesPage id: centerText //is a button so the user doesn't have te click inconvenientley precise to enable or disable the checkbox //: Display Overhang preference checkbox - text: qsTr("Center camera when item is selected"); + text: catalog.i18nc("@action:button","Center camera when item is selected"); onClicked: centerCheckbox.checked = !centerCheckbox.checked //: Display Overhang preference tooltip - tooltip: "Moves the camera so the object is in the center of the view when an object is selected" + 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 { diff --git a/resources/qml/WizardPages/AddMachine.qml b/resources/qml/WizardPages/AddMachine.qml index 5491b5ad0b..3904005f13 100644 --- a/resources/qml/WizardPages/AddMachine.qml +++ b/resources/qml/WizardPages/AddMachine.qml @@ -7,7 +7,7 @@ import QtQuick.Layouts 1.1 import QtQuick.Window 2.1 import QtQuick.Controls.Styles 1.1 -import UM 1.0 as UM +import UM 1.1 as UM import ".." ColumnLayout @@ -19,12 +19,12 @@ ColumnLayout property var manufacturers: wizardPage.lineManufacturers() property int manufacturerIndex: 0 - SystemPalette{id: palette} + SystemPalette {id: palette} signal reloadModel(var newModel) width: wizardPage.pageWidth height: wizardPage.pageHeight - + UM.I18nCatalog { id: catalog; name: "cura"} Connections { target: elementRoot @@ -62,7 +62,7 @@ ColumnLayout anchors.left: parent.left anchors.top: title.bottom //: Add Printer wizard page description - text: qsTr("Please select the type of printer:"); + text: catalog.i18nc("@label","Please select the type of printer:"); } ScrollView @@ -179,7 +179,7 @@ ColumnLayout visible: model.author != "Ultimaker" ? true : false height: wizardPage.manufacturers[wizardPage.manufacturerIndex] == model.manufacturer ? UM.Theme.sizes.standard_list_lineheight.height : 0 //: Printer profile caption meaning: this profile is supported by the community - text: qsTr("community supported profile"); + text: catalog.i18nc("@label","community supported profile"); opacity: wizardPage.manufacturers[wizardPage.manufacturerIndex] == model.manufacturer ? 1 : 0 anchors.left: machineButton.right anchors.leftMargin: UM.Theme.sizes.standard_list_lineheight.height/2 @@ -231,7 +231,7 @@ ColumnLayout { id: insertNameLabel //: Add Printer wizard field label - text: qsTr("Printer Name:"); + text: catalog.i18nc("@label","Printer Name:"); } TextField { diff --git a/resources/qml/WizardPages/SelectUpgradedParts.qml b/resources/qml/WizardPages/SelectUpgradedParts.qml index 46fdd876af..e85c0f50aa 100644 --- a/resources/qml/WizardPages/SelectUpgradedParts.qml +++ b/resources/qml/WizardPages/SelectUpgradedParts.qml @@ -6,7 +6,7 @@ import QtQuick.Controls 1.1 import QtQuick.Layouts 1.1 import QtQuick.Window 2.1 -import UM 1.0 as UM +import UM 1.1 as UM Item { @@ -14,7 +14,7 @@ Item property string title SystemPalette{id: palette} - + UM.I18nCatalog { id: catalog; name:"cura"} ScrollView { height: parent.height @@ -36,7 +36,7 @@ Item //: Add UM Original wizard page description width: parent.width wrapMode: Text.WordWrap - text: qsTr("To assist you in having better default settings for your Ultimaker. Cura would like to know which upgrades you have in your machine:") + text: catalog.i18nc("@label","To assist you in having better default settings for your Ultimaker. Cura would like to know which upgrades you have in your machine:") } Column @@ -46,19 +46,19 @@ Item CheckBox { - text: qsTr("Extruder driver ugrades") + text: catalog.i18nc("@action:checkbox","Extruder driver ugrades") } CheckBox { - text: qsTr("Heated printer bed (kit)") + text: catalog.i18nc("@action:checkbox","Heated printer bed (kit)") } CheckBox { - text: qsTr("Heated printer bed (self built)") + text: catalog.i18nc("@action:checkbox","Heated printer bed (self built)") } CheckBox { - text: qsTr("Dual extrusion (experimental)") + text: catalog.i18nc("@action:checkbox","Dual extrusion (experimental)") checked: true } } @@ -67,14 +67,14 @@ Item { width: parent.width wrapMode: Text.WordWrap - text: qsTr("If you have an Ultimaker bought after october 2012 you will have the Extruder drive upgrade. If you do not have this upgrade, it is highly recommended to improve reliability."); + text: catalog.i18nc("@label","If you have an Ultimaker bought after october 2012 you will have the Extruder drive upgrade. If you do not have this upgrade, it is highly recommended to improve reliability."); } Label { width: parent.width wrapMode: Text.WordWrap - text: qsTr("This upgrade can be bought from the Ultimaker webshop or found on thingiverse as thing:26094"); + text: catalog.i18nc("@label","This upgrade can be bought from the Ultimaker webshop or found on thingiverse as thing:26094"); } } } diff --git a/resources/qml/WizardPages/UltimakerCheckup.qml b/resources/qml/WizardPages/UltimakerCheckup.qml index acfe288e14..1b15afa59a 100644 --- a/resources/qml/WizardPages/UltimakerCheckup.qml +++ b/resources/qml/WizardPages/UltimakerCheckup.qml @@ -6,7 +6,7 @@ import QtQuick.Controls 1.1 import QtQuick.Layouts 1.1 import QtQuick.Window 2.1 -import UM 1.0 as UM +import UM 1.1 as UM Column { @@ -23,7 +23,7 @@ Column Component.onCompleted: printer_connection.startPollEndstop() Component.onDestruction: printer_connection.stopPollEndstop() - + UM.I18nCatalog { id: catalog; name:"cura"} Label { text: parent.title @@ -33,14 +33,14 @@ Column Label { //: Add Printer wizard page description - text: qsTr("It's a good idea to do a few sanity checks on your Ultimaker. \n You can skip these if you know your machine is functional"); + text: catalog.i18nc("@label","It's a good idea to do a few sanity checks on your Ultimaker. \n You can skip these if you know your machine is functional"); } Row { Label { - text: qsTr("Connection: ") + text: catalog.i18nc("@label","Connection: ") } Label { @@ -51,22 +51,22 @@ Column { Label { - text: qsTr("Min endstop X: ") + text: catalog.i18nc("@label","Min endstop X: ") } Label { - text: x_min_pressed ? qsTr("Works") : qsTr("Not checked") + text: x_min_pressed ? catalog.i18nc("@label","Works") : catalog.i18nc("@label","Not checked") } } Row { Label { - text: qsTr("Min endstop Y: ") + text: catalog.i18nc("@label","Min endstop Y: ") } Label { - text: y_min_pressed ? qsTr("Works") : qsTr("Not checked") + text: y_min_pressed ? catalog.i18nc("@label","Works") : catalog.i18nc("@label","Not checked") } } @@ -74,11 +74,11 @@ Column { Label { - text: qsTr("Min endstop Z: ") + text: catalog.i18nc("@label","Min endstop Z: ") } Label { - text: z_min_pressed ? qsTr("Works") : qsTr("Not checked") + text: z_min_pressed ? catalog.i18nc("@label","Works") : catalog.i18nc("@label","Not checked") } } @@ -86,7 +86,7 @@ Column { Label { - text: qsTr("Nozzle temperature check: ") + text: catalog.i18nc("@label","Nozzle temperature check: ") } Label { @@ -94,10 +94,10 @@ Column } Button { - text: "Start heating" + text: catalog.i18nc("@action:button","Start heating") onClicked: { - heater_status_label.text = qsTr("Checking") + heater_status_label.text = catalog.i18nc("@label","Checking") printer_connection.heatupNozzle(190) wizardPage.extruder_target_temp = 190 } @@ -105,7 +105,7 @@ Column Label { id: heater_status_label - text: qsTr("Not checked") + text: catalog.i18nc("@label","Not checked") } } @@ -113,7 +113,7 @@ Column { Label { - text: qsTr("bed temperature check: ") + text: catalog.i18nc("@label","bed temperature check: ") } Label { @@ -121,10 +121,10 @@ Column } Button { - text: "Start heating" + text: catalog.i18nc("@action:button","Start heating") onClicked: { - bed_status_label.text = qsTr("Checking") + bed_status_label.text = catalog.i18nc("@label","Checking") printer_connection.printer.heatupBed(60) wizardPage.bed_target_temp = 60 } @@ -132,7 +132,7 @@ Column Label { id: bed_status_label - text: qsTr("Not checked") + text: catalog.i18nc("@label","Not checked") } } @@ -159,7 +159,7 @@ Column { if(printer_connection.extruderTemperature > wizardPage.extruder_target_temp - 10 && printer_connection.extruderTemperature < wizardPage.extruder_target_temp + 10) { - heater_status_label.text = qsTr("Works") + heater_status_label.text = catalog.i18nc("@label","Works") printer_connection.heatupNozzle(0) } } @@ -167,7 +167,7 @@ Column { if(printer_connection.bedTemperature > wizardPage.bed_target_temp - 5 && printer_connection.bedTemperature < wizardPage.bed_target_temp + 5) { - bed_status_label.text = qsTr("Works") + bed_status_label.text = catalog.i18nc("@label","Works") printer_connection.heatupBed(0) } } From 1b6cfc39c083890b998cee2517b63f56aa4069b8 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 27 Aug 2015 17:17:05 +0200 Subject: [PATCH 39/49] JSON: git diff! removed triangles and grid top/bottom skin options (though they are available) --- resources/settings/fdmprinter.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index 8717871480..1d7f6db0c6 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -391,8 +391,6 @@ "type": "enum", "options": [ "Lines", - "Grid", - "Triangles", "Concentric", "ZigZag" ], From ccd95c2ecf943b6fcc96aa1ecbbfc86fbd51a69e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Aug 2015 17:18:44 +0200 Subject: [PATCH 40/49] Removed font from rectangle --- resources/qml/SaveButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 58d8281555..5f3cb5cd5d 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -40,7 +40,7 @@ Rectangle anchors.left: parent.left anchors.leftMargin: UM.Theme.sizes.default_margin.width; anchors.verticalCenter: parent.verticalCenter - font: UM.Theme.fonts.default; + //font: UM.Theme.fonts.default; color: UM.Theme.colors.text_white } TextField From bd5e85144c38af00c270fd1022660a8353622538 Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Fri, 28 Aug 2015 10:15:17 +0200 Subject: [PATCH 41/49] Merging of mine and Jaimes work --- resources/qml/SaveButton.qml | 106 +++++++++++++---------------------- 1 file changed, 38 insertions(+), 68 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 5f3cb5cd5d..638289932b 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -8,8 +8,7 @@ import QtQuick.Layouts 1.1 import UM 1.1 as UM -Rectangle -{ +Rectangle { id: base; property real progress: UM.Backend.progress; @@ -17,34 +16,27 @@ Rectangle Behavior on progress { NumberAnimation { duration: 250; } } property int totalHeight: childrenRect.height + UM.I18nCatalog { id: catalog; name:"cura"} + property variant printDuration: PrintInformation.currentPrintTime; property real printMaterialAmount: PrintInformation.materialAmount; - UM.I18nCatalog { id: catalog; name:"cura"} - Rectangle - { - id: background + + Rectangle{ + id: printJobRow implicitWidth: base.width; - implicitHeight: parent.height; - color: UM.Theme.colors.save_button_background; - border.width: UM.Theme.sizes.save_button_border.width - border.color: UM.Theme.colors.save_button_border - - Rectangle - { - id: infoBox - width: parent.width - UM.Theme.sizes.default_margin.width * 2; - height: UM.Theme.sizes.save_button_slicing_bar.height - - anchors.top: parent.top - anchors.topMargin: UM.Theme.sizes.default_margin.height; + implicitHeight: UM.Theme.sizes.sidebar_header.height + anchors.top: parent.top + color: UM.Theme.colors.sidebar_header_bar + Label{ + id: printJobTextfieldLabel + text: catalog.i18nc("@label","Printjob name"); anchors.left: parent.left anchors.leftMargin: UM.Theme.sizes.default_margin.width; anchors.verticalCenter: parent.verticalCenter - //font: UM.Theme.fonts.default; + font: UM.Theme.fonts.default; color: UM.Theme.colors.text_white } - TextField - { + TextField { id: printJobTextfield anchors.right: parent.right anchors.rightMargin: UM.Theme.sizes.default_margin.width; @@ -53,23 +45,18 @@ Rectangle height: UM.Theme.sizes.sidebar_inputFields.height property int unremovableSpacing: 5 text: "UM2" + "_" + "filename" ///TODO KOMT NOG - onEditingFinished: - { - if (printJobTextfield.text != '') - { + onEditingFinished: { + if (printJobTextfield.text != ''){ printJobTextfield.focus = false } } - validator: RegExpValidator - { + validator: RegExpValidator { regExp: /^[0-9a-zA-Z\_\-]*$/ } - style: TextFieldStyle - { + style: TextFieldStyle{ textColor: UM.Theme.colors.setting_control_text; font: UM.Theme.fonts.default; - background: Rectangle - { + background: Rectangle { radius: 0 implicitWidth: parent.width implicitHeight: parent.height @@ -80,14 +67,12 @@ Rectangle } } - Rectangle - { + Rectangle { id: specsRow implicitWidth: base.width implicitHeight: UM.Theme.sizes.sidebar_specs_bar.height anchors.top: printJobRow.bottom - Item - { + Item{ id: time width: (parent.width / 100 * 45) - UM.Theme.sizes.default_margin.width * 2 height: parent.height @@ -95,8 +80,7 @@ Rectangle anchors.leftMargin: UM.Theme.sizes.default_margin.width anchors.top: parent.top visible: base.printMaterialAmount > 0 ? true : false - UM.RecolorImage - { + UM.RecolorImage { id: timeIcon anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left @@ -107,26 +91,23 @@ Rectangle color: UM.Theme.colors.text_hover source: UM.Theme.icons.print_time; } - Label - { + Label{ id: timeSpec anchors.verticalCenter: parent.verticalCenter anchors.left: timeIcon.right anchors.leftMargin: UM.Theme.sizes.default_margin.width/2 font: UM.Theme.fonts.default color: UM.Theme.colors.text - text: (!base.printDuration || !base.printDuration.valid) ? "" : catalog.i18nc("@label","%1 h:m").arg(base.printDuration.getDisplayString(UM.DurationFormat.Short)) + text: (!base.printDuration || !base.printDuration.valid) ? "" : catalog.i18nc("@label", "%1 m").arg(base.printDuration.getDisplayString(UM.DurationFormat.Short)) } } - Item - { + Item{ width: parent.width / 100 * 55 height: parent.height anchors.left: time.right anchors.top: parent.top visible: base.printMaterialAmount > 0 ? true : false - UM.RecolorImage - { + UM.RecolorImage { id: lengthIcon anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left @@ -137,8 +118,7 @@ Rectangle color: UM.Theme.colors.text_hover source: UM.Theme.icons.category_material; } - Label - { + Label{ id: lengthSpec anchors.verticalCenter: parent.verticalCenter anchors.left: lengthIcon.right @@ -150,8 +130,7 @@ Rectangle } } - Item - { + Item{ id: saveRow implicitWidth: base.width / 100 * 55 implicitHeight: saveToButton.height + (UM.Theme.sizes.default_margin.height / 2) // height + bottomMargin @@ -159,8 +138,7 @@ Rectangle anchors.right: parent.right anchors.rightMargin: UM.Theme.sizes.default_margin.width - Button - { + Button { id: saveToButton anchors.left: parent.left tooltip: UM.OutputDeviceManager.activeDeviceDescription; @@ -171,15 +149,12 @@ Rectangle text: UM.OutputDeviceManager.activeDeviceShortDescription; - style: ButtonStyle - { - background: Rectangle - { + style: ButtonStyle { + background: Rectangle { color: control.hovered ? UM.Theme.colors.load_save_button_hover : UM.Theme.colors.load_save_button Behavior on color { ColorAnimation { duration: 50; } } - Label - { + Label { anchors.centerIn: parent color: UM.Theme.colors.load_save_button_text font: UM.Theme.fonts.default @@ -191,10 +166,9 @@ Rectangle onClicked: UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice) } - Button - { + Button { id: deviceSelectionMenu; - tooltip: catalog.i18nc("@action:button","Select the active output device"); + tooltip: catalog.i18nc("@info:tooltip","Select the active output device"); anchors.right: parent.right width: UM.Theme.sizes.save_button_save_to_button.height height: UM.Theme.sizes.save_button_save_to_button.height @@ -225,20 +199,16 @@ Rectangle label: Label{ } } - menu: Menu - { + menu: Menu { id: devicesMenu; - Instantiator - { + Instantiator { model: devicesModel; - MenuItem - { + MenuItem { text: model.description checkable: true; checked: model.id == UM.OutputDeviceManager.activeDevice; exclusiveGroup: devicesMenuGroup; - onTriggered: - { + onTriggered: { UM.OutputDeviceManager.setActiveDevice(model.id); } } From 8cbe802881dc2da22f2092892b65bc38eadd22d6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Aug 2015 11:44:19 +0200 Subject: [PATCH 42/49] Added missing ) --- resources/qml/ViewPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/ViewPage.qml b/resources/qml/ViewPage.qml index 3bab4acd1a..66af58eaa6 100644 --- a/resources/qml/ViewPage.qml +++ b/resources/qml/ViewPage.qml @@ -42,7 +42,7 @@ UM.PreferencesPage onClicked: overhangCheckbox.checked = !overhangCheckbox.checked //: 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." + tooltip: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will nog print properly.") style: ButtonStyle { From ff9a22209714b2de61234618379725ee8bab21dd Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Aug 2015 16:24:38 +0200 Subject: [PATCH 43/49] Added changeLog plugin --- plugins/ChangeLogPlugin/ChangeLog.py | 98 +++++++++++++++++++++++++++ plugins/ChangeLogPlugin/ChangeLog.qml | 28 ++++++++ plugins/ChangeLogPlugin/ChangeLog.txt | 41 +++++++++++ plugins/ChangeLogPlugin/__init__.py | 21 ++++++ 4 files changed, 188 insertions(+) create mode 100644 plugins/ChangeLogPlugin/ChangeLog.py create mode 100644 plugins/ChangeLogPlugin/ChangeLog.qml create mode 100644 plugins/ChangeLogPlugin/ChangeLog.txt create mode 100644 plugins/ChangeLogPlugin/__init__.py diff --git a/plugins/ChangeLogPlugin/ChangeLog.py b/plugins/ChangeLogPlugin/ChangeLog.py new file mode 100644 index 0000000000..095f8a5647 --- /dev/null +++ b/plugins/ChangeLogPlugin/ChangeLog.py @@ -0,0 +1,98 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from UM.i18n import i18nCatalog +from UM.Extension import Extension +from UM.Preferences import Preferences +from UM.Application import Application +from UM.PluginRegistry import PluginRegistry +from UM.Version import Version + +from PyQt5.QtQuick import QQuickView +from PyQt5.QtQml import QQmlComponent, QQmlContext +from PyQt5.QtCore import QUrl, pyqtSlot, QObject + +import os.path + +catalog = i18nCatalog("cura") + +class ChangeLog(Extension, QObject,): + def __init__(self, parent = None): + QObject.__init__(self, parent) + Extension.__init__(self) + self._changelog_window = None + self._changelog_context = None + version_string = Application.getInstance().getVersion() + if version_string is not "master": + self._version = Version(version_string) + else: + self._version = None + self._change_logs = None + Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) + Preferences.getInstance().addPreference("general/latest_version_changelog_shown", "15.05.90") #First version of CURA with uranium + #self.showChangelog() + + def getChangeLogs(self): + if not self._change_logs: + self.loadChangeLogs() + return self._change_logs + + @pyqtSlot(result = str) + def getChangeLogString(self): + logs = self.getChangeLogs() + latest_version = Version(Preferences.getInstance().getValue("general/latest_version_changelog_shown")) + result = "" + for version in logs: + result += "

" + str(version) + "


" + result += "" + for change in logs[version]: + result += "" + str(change) + "
" + for line in logs[version][change]: + result += str(line) + "
" + result += "
" + + pass + return result + + def loadChangeLogs(self): + self._change_logs = {} + with open(os.path.join(PluginRegistry.getInstance().getPluginPath("ChangeLogPlugin"), "ChangeLog.txt"), 'r') as f: + open_version = None + open_header = None + for line in f: + line = line.replace("\n","") + if "[" in line and "]" in line: + line = line.replace("[","") + line = line.replace("]","") + open_version = Version(line) + self._change_logs[Version(line)] = {} + elif line.startswith("*"): + open_header = line.replace("*","") + self._change_logs[open_version][open_header] = [] + else: + if line != "": + self._change_logs[open_version][open_header].append(line) + + def _onEngineCreated(self): + if not self._version: + return #We're on dev branch. + if self._version > Preferences.getInstance().getValue("general/latest_version_changelog_shown"): + self.showChangelog() + + def showChangelog(self): + if not self._changelog_window: + self.createChangelogWindow() + self._changelog_window.show() + Preferences.getInstance().setValue("general/latest_version_changelog_shown", Application.getInstance().getVersion()) + + def hideChangelog(self): + if self._changelog_window: + self._changelog_window.hide() + + def createChangelogWindow(self): + path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath("ChangeLogPlugin"), "ChangeLog.qml")) + component = QQmlComponent(Application.getInstance()._engine, path) + self._changelog_context = QQmlContext(Application.getInstance()._engine.rootContext()) + self._changelog_context.setContextProperty("manager", self) + self._changelog_window = component.create(self._changelog_context) + #print(self._changelog_window) diff --git a/plugins/ChangeLogPlugin/ChangeLog.qml b/plugins/ChangeLogPlugin/ChangeLog.qml new file mode 100644 index 0000000000..61400f3d07 --- /dev/null +++ b/plugins/ChangeLogPlugin/ChangeLog.qml @@ -0,0 +1,28 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.1 + +import UM 1.1 as UM + +UM.Dialog +{ + id: base + width: 300 * Screen.devicePixelRatio; + height: 500 * Screen.devicePixelRatio; + title: "Changelog" + ScrollView + { + anchors.fill:parent + Text + { + text: manager.getChangeLogString() + width:base.width - 35 + wrapMode: Text.Wrap; + //Component.onCompleted: console.log() + } + } +} diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt new file mode 100644 index 0000000000..c263b4f112 --- /dev/null +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -0,0 +1,41 @@ +[15.10.0] +*All at Once/One at a Time +Cura’s default mode is set to All At Once. You can print multiple objects faster with the option print objects One At A Time. This can be changed in Advanced Settings. Please note that in One At A Time mode, grouped objects will still be printed as a single object. + +*Setting Profiles +Now you can create preferred setting favourites and share them with others. + + +*Post-Processing Plugin +This plugin supports post-processing on the GCode generated by the engine – allowing for custom scripts. For example, Pause At Height and Tweak At Z. + +*Support for Bed Levelling and other wizards +We have restored the Bed Levelling function and several other wizards that were previously available for the Ultimaker Original. Additionally, these are ready to be used with machines from other vendors (BQ, Rep Rap neo). + +*Third-Party Printer Profiles +We received printer profiles for third-party vendors (BQ, Rep Rap neo) from the community (thanks guys!). These have been included in this release. + + +*3MF File Loading Support (New) +We’re happy to report we now support loading 3MF files. This is a new file format similar to AMF, but freely available. + +*Output Device API for Developers (New) +The Storage Device API has now been replaced with the Output Device API for saving files. It’s designed to make it easier for anyone that wants to write a plugin giving them some form of output device, whether it’s a printer or a web service. + +*Improved Cut-Off Object Bottom (New) +We’ve added a feature than allows you to move objects below the build plate. You can either correct a model with a rough bottom, or print only a part of an object. Please note that the implementation greatly differs from the old one where it was a setting. + +*Improved File Saving (new) +We’re happy to report that the way file saving is handled has received a huge overhaul. Now the default action is to save everything on the build plate to a file. + +*Select Multiple Objects (New) +You now have the freedom to select and manipulate multiple objects at the same time. + +*Grouping (New) +You can now group objects together to make it easier to manipulate multiple objects. + +*Per-Object Settings (New) +You can now select different profiles for different objects and in advance mode override individual settings. + +*64-bit Windows Builds (New) +Cura now allows 64-bit Windows builds in addition to the 32-bit builds. For users running the 64-bit version of Windows, you can now load models in more detail. \ No newline at end of file diff --git a/plugins/ChangeLogPlugin/__init__.py b/plugins/ChangeLogPlugin/__init__.py new file mode 100644 index 0000000000..8f8235bf23 --- /dev/null +++ b/plugins/ChangeLogPlugin/__init__.py @@ -0,0 +1,21 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. +from UM.i18n import i18nCatalog + +from . import ChangeLog + +catalog = i18nCatalog("cura") + +def getMetaData(): + return { + "plugin": { + "name": "Change log", + "author": "Ultimaker", + "version": "1.0", + "description": catalog.i18nc("Change log plugin description", "Shows changes since latest checked version"), + "api": 2 + } + } + +def register(app): + return {"extension": ChangeLog.ChangeLog()} \ No newline at end of file From 709ec79918561a526737cac29a1edef3b01c79e6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Aug 2015 16:31:47 +0200 Subject: [PATCH 44/49] Removed unused import --- cura/PlatformPhysics.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 6416b83e01..c91aaaabde 100644 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -6,7 +6,6 @@ from PyQt5.QtCore import QTimer from UM.Scene.SceneNode import SceneNode from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Operations.TranslateOperation import TranslateOperation -from UM.Operations.ScaleToBoundsOperation import ScaleToBoundsOperation from UM.Math.Float import Float from UM.Math.Vector import Vector from UM.Math.AxisAlignedBox import AxisAlignedBox From dd7e450d1cd9021623370589addd8665b4578389 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Aug 2015 16:42:11 +0200 Subject: [PATCH 45/49] Added preference to disable automatic scale Ultimaker/Cura#142 #CURA-89 --- cura/CuraApplication.py | 1 + resources/qml/GeneralPage.qml | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a23dc61b05..3e892e52a2 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -85,6 +85,7 @@ class CuraApplication(QtApplication): Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") Preferences.getInstance().addPreference("view/center_on_select", True) + Preferences.getInstance().addPreference("mesh/scale_to_fit", True) JobQueue.getInstance().jobFinished.connect(self._onJobFinished) diff --git a/resources/qml/GeneralPage.qml b/resources/qml/GeneralPage.qml index 896da66104..676acbf931 100644 --- a/resources/qml/GeneralPage.qml +++ b/resources/qml/GeneralPage.qml @@ -17,9 +17,11 @@ UM.PreferencesPage { UM.Preferences.resetPreference("general/language") UM.Preferences.resetPreference("physics/automatic_push_free") + UM.Preferences.resetPreference("mesh/scale_to_fit") UM.Preferences.resetPreference("info/send_slice_info") pushFreeCheckbox.checked = UM.Preferences.getValue("physics/automatic_push_free") sendDataCheckbox.checked = UM.Preferences.getValue("info/send_slice_info") + scaleToFitCheckbox.checked = UM.Preferences.getValue("mesh/scale_to_fit") languageComboBox.currentIndex = 0 } GridLayout @@ -163,6 +165,38 @@ UM.PreferencesPage } } } + CheckBox + { + id: scaleToFitCheckbox + checked: UM.Preferences.getValue("mesh/scale_to_fit") + onCheckedChanged: UM.Preferences.setValue("mesh/scale_to_fit", checked) + } + Button + { + id: scaleToFitText //is a button so the user doesn't have te click inconvenientley precise to enable or disable the checkbox + + //: Display Overhang preference checkbox + text: catalog.i18nc("@action:checkbox","Scale loaded meshes when too large"); + onClicked: scaleToFitCheckbox.checked = !scaleToFitCheckbox.checked + + //: Display Overhang preference tooltip + tooltip: catalog.i18nc("@info:tooltip","Should loaded meshes be scaled to the max build volume if they are too large.") + + style: ButtonStyle + { + background: Rectangle + { + border.width: 0 + color: "transparent" + } + label: Text + { + renderType: Text.NativeRendering + horizontalAlignment: Text.AlignLeft + text: control.text + } + } + } Item { Layout.fillHeight: true; Layout.columnSpan: 2 } } } From 2b396814ca1cae5904b04cd00796cdcb88c1c8c6 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 31 Aug 2015 14:31:40 +0200 Subject: [PATCH 46/49] split magic_mesh)surface_mode into Normal, Surface, Both --- resources/settings/fdmprinter.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index 1d7f6db0c6..879a03736f 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -1820,9 +1820,14 @@ }, "magic_mesh_surface_mode": { "label": "Surface Mode", - "description": "Print the surface instead of the volume. No infill, no top/bottom skin, just a single wall of which the middle coincides with the surface of the mesh.", - "type": "boolean", - "default": false, + "description": "Print the surface instead of the volume. No infill, no top/bottom skin, just a single wall of which the middle coincides with the surface of the mesh. It's also possible to do both: print the insides of a closed volume as normal, but print all polygons not part of a closed volume as surface.", + "type": "enum", + "options": [ + "Normal", + "Surface", + "Both" + ], + "default": "Normal", "visible": false }, "magic_spiralize": { From 33aa5f596f41f8cd84bf4d6f502841f957c9ffb6 Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Mon, 31 Aug 2015 17:26:40 +0200 Subject: [PATCH 47/49] 15.10 restyling of the sidebar Contributes to: issue CURA-60 --- resources/qml/Sidebar.qml | 90 ++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 49 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 60ebfb8a81..4ca85ddfd9 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -41,69 +41,61 @@ Rectangle } } - ColumnLayout - { - anchors.fill: parent; - anchors.topMargin: UM.Theme.sizes.default_margin.height; + SidebarHeader { + id: header; - spacing: UM.Theme.sizes.default_margin.height; + width: parent.width + height: totalHeightHeader - SidebarHeader + addMachineAction: base.addMachineAction; + configureMachinesAction: base.configureMachinesAction; + modesModel: modesListModel; + + currentModeIndex: { - id: header; - - Layout.fillWidth: true; - - addMachineAction: base.addMachineAction; - configureMachinesAction: base.configureMachinesAction; - modesModel: modesListModel; - - currentModeIndex: + var index = parseInt(UM.Preferences.getValue("cura/active_mode")) + if(index) { - var index = parseInt(UM.Preferences.getValue("cura/active_mode")) - if(index) - { - return index; - } - return 0; + return index; } - onCurrentModeIndexChanged: UM.Preferences.setValue("cura/active_mode", currentModeIndex); + return 0; } + onCurrentModeIndexChanged: UM.Preferences.setValue("cura/active_mode", currentModeIndex); + } - Loader + Loader{ + id: sidebarContents; + anchors.bottom: saveButton.top + anchors.top: header.bottom + anchors.left: base.left + anchors.right: base.right + + source: modesListModel.get(header.currentModeIndex).file; + + property Item sidebar: base; + + onLoaded: { - id: sidebarContents; - - Layout.fillWidth: true; - Layout.fillHeight: true; - - source: modesListModel.get(header.currentModeIndex).file; - - property Item sidebar: base; - - onLoaded: + if(item) { - if(item) + item.configureSettings = base.configureMachinesAction; + if(item.onShowTooltip != undefined) { - item.configureSettings = base.configureMachinesAction; - if(item.onShowTooltip != undefined) - { - item.showTooltip.connect(base.showTooltip) - } - if(item.onHideTooltip != undefined) - { - item.hideTooltip.connect(base.hideTooltip) - } + item.showTooltip.connect(base.showTooltip) + } + if(item.onHideTooltip != undefined) + { + item.hideTooltip.connect(base.hideTooltip) } } } + } - SaveButton - { - id: saveButton; - implicitWidth: base.width - implicitHeight: totalHeight - } + SaveButton { + id: saveButton; + implicitWidth: base.width + implicitHeight: totalHeight + anchors.bottom: parent.bottom } SidebarTooltip From 9fd5ea4f9f6cd953f937425fa2715d33df7307ef Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Mon, 31 Aug 2015 17:27:53 +0200 Subject: [PATCH 48/49] 15.10 restyling of the sidebar header Not yet finished Contributes to: issue CURA-60 --- resources/themes/cura/styles.qml | 58 ++++++++++++++++++-------------- resources/themes/cura/theme.json | 33 +++++++++--------- 2 files changed, 49 insertions(+), 42 deletions(-) diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index 01267eadb3..228afa3a11 100644 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -235,7 +235,7 @@ QtObject { property Component sidebar_category: Component { ButtonStyle { - background: UM.AngledCornerRectangle { + background: Rectangle { implicitHeight: UM.Theme.sizes.section.height; color: { if(control.color) { @@ -253,37 +253,51 @@ QtObject { } } Behavior on color { ColorAnimation { duration: 50; } } - cornerSize: UM.Theme.sizes.default_margin.width; } label: Item { anchors.fill: parent; - anchors.margins: UM.Theme.sizes.default_margin.width; - - Image { + anchors.left: parent.left + Item{ id: icon; - - anchors.left: parent.left; - anchors.verticalCenter: parent.verticalCenter; - - source: control.iconSource; - width: UM.Theme.sizes.section_icon.width; - height: UM.Theme.sizes.section_icon.height; + anchors.left: parent.left + height: parent.height + width: UM.Theme.sizes.section_icon_column.width + UM.RecolorImage { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + color: UM.Theme.colors.setting_category_text + source: control.iconSource; + width: UM.Theme.sizes.section_icon.width; + height: UM.Theme.sizes.section_icon.height; + sourceSize.width: width + 15 + sourceSize.height: width + 15 + } } Label { anchors { left: icon.right; - leftMargin: UM.Theme.sizes.default_margin.width; right: parent.right; verticalCenter: parent.verticalCenter; } - text: control.text; font: UM.Theme.fonts.setting_category; color: UM.Theme.colors.setting_category_text; fontSizeMode: Text.HorizontalFit; minimumPointSize: 8 } + UM.RecolorImage { + id: lengthIcon + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: UM.Theme.sizes.default_margin.width * 2 + width: UM.Theme.sizes.standard_arrow.width + height: UM.Theme.sizes.standard_arrow.height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.colors.setting_category_text + source: control.checked ? UM.Theme.icons.arrow_top : UM.Theme.icons.arrow_bottom + } } } } @@ -295,20 +309,15 @@ QtObject { transientScrollBars: false - scrollBarBackground: UM.AngledCornerRectangle { - implicitWidth: UM.Theme.sizes.scrollbar.width; - - cornerSize: UM.Theme.sizes.scrollbar.width; - + scrollBarBackground: Rectangle { + implicitWidth: UM.Theme.sizes.scrollbar.width color: UM.Theme.colors.scrollbar_background; } - handle: UM.AngledCornerRectangle { + handle: Rectangle { id: scrollViewHandle implicitWidth: UM.Theme.sizes.scrollbar.width; - cornerSize: UM.Theme.sizes.scrollbar.width; - color: styleData.pressed ? UM.Theme.colors.scrollbar_handle_down : styleData.hovered ? UM.Theme.colors.scrollbar_handle_hover : UM.Theme.colors.scrollbar_handle; Behavior on color { ColorAnimation { duration: 50; } } } @@ -317,14 +326,13 @@ QtObject { property variant setting_item: UM.SettingItemStyle { labelFont: UM.Theme.fonts.default; - labelColor: UM.Theme.colors.setting_label; + labelColor: UM.Theme.colors.setting_control_text; - spacing: UM.Theme.sizes.default_margin.width; + spacing: UM.Theme.sizes.default_lining.height; fixedHeight: UM.Theme.sizes.setting.height; controlWidth: UM.Theme.sizes.setting_control.width; controlRightMargin: UM.Theme.sizes.setting_control_margin.width; - controlBorderWidth: 1; controlColor: UM.Theme.colors.setting_control; controlHighlightColor: UM.Theme.colors.setting_control_highlight; controlBorderColor: UM.Theme.colors.setting_control_border; diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 919abbda6f..13514ffbc8 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -43,7 +43,7 @@ "family": "ProximaNova" }, "setting_category": { - "size": 1.5, + "size": 1.0, "family": "ProximaNova" } }, @@ -80,23 +80,23 @@ "load_save_button_active": [43, 45, 46, 255], "scrollbar_background": [245, 245, 245, 255], - "scrollbar_handle": [205, 202, 201, 255], + "scrollbar_handle": [12, 159, 227, 255], "scrollbar_handle_hover": [174, 174, 174, 255], "scrollbar_handle_down": [12, 159, 227, 255], - "setting_category": [205, 202, 201, 255], - "setting_category_disabled": [245, 245, 245, 255], - "setting_category_hover": [174, 174, 174, 255], - "setting_category_active": [12, 169, 227, 255], - "setting_category_active_hover": [34, 150, 190, 255], - "setting_category_text": [255, 255, 255, 255], + "setting_category": [238, 238, 238, 255], + "setting_category_disabled": [238, 238, 238, 255], + "setting_category_hover": [240, 248, 255, 255], + "setting_category_active": [238, 238, 238, 255], + "setting_category_active_hover": [240, 248, 255, 255], + "setting_category_text": [35, 35, 35, 255], - "setting_label": [140, 144, 154, 255], "setting_control": [255, 255, 255, 255], "setting_control_highlight": [245, 245, 245, 255], "setting_control_border": [174, 174, 174, 255], - "setting_control_text": [35, 35, 35, 255], - "setting_control_hover": [35, 35, 35, 255], + "setting_control_text": [0, 0, 0, 255], + "setting_control_hover": [139, 143, 153, 255], + "setting_control_selected": [35, 35, 35, 255], "setting_unit": [174, 174, 174, 255], "setting_validation_error": [255, 57, 14, 255], "setting_validation_warning": [255, 186, 15, 255], @@ -145,7 +145,6 @@ "toolbar_button": [2.0, 2.0], "toolbar_spacing": [1.0, 1.0], - "loadfile_button": [11.0, 2.4], "loadfile_margin": [0.8, 0.4], @@ -155,11 +154,11 @@ "sidebar_specs_bar": [0.0, 2.2], "sidebar_inputFields": [0.0, 1.9], - "section": [22.0, 3.0], - "section_icon": [2.14, 2.14], - "section_text_margin": [0.33, 0.33], + "section": [0.0, 1.8], + "section_icon": [1.2, 1.2], + "section_icon_column": [2.8, 0.0], - "setting": [21.0, 2.0], + "setting": [21.0, 1.8], "setting_control": [6.0, 2.0], "setting_control_margin": [3.0, 3.0], "setting_unit_margin": [0.5, 0.5], @@ -176,7 +175,7 @@ "progressbar_control": [8.0, 0.8], "progressbar_padding": [0.0, 1.0], - "scrollbar": [0.5, 0.5], + "scrollbar": [0.7, 0.5], "slider_groove": [0.5, 0.5], "slider_handle": [1.5, 1.5], From 3df4d69c37486ea8fab06d092e0e6bc8774a854e Mon Sep 17 00:00:00 2001 From: Tamara Hogenhout Date: Mon, 31 Aug 2015 17:28:36 +0200 Subject: [PATCH 49/49] 15.10 restyling of the sidebar header Not yet finished Contributes to: issue CURA-60 --- resources/qml/SidebarHeader.qml | 182 ++++++++++++++++++++------------ 1 file changed, 116 insertions(+), 66 deletions(-) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 1223b8ff70..5764e3dd52 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -8,96 +8,112 @@ import QtQuick.Layouts 1.1 import UM 1.1 as UM -Column +ColumnLayout { id: base; - + // Machine Setup property variant modesModel; - property alias currentModeIndex: modeMenu.currentIndex; + property alias currentModeIndex: modesList.currentIndex; property Action addMachineAction; property Action configureMachinesAction; - - spacing: UM.Theme.sizes.default_margin.height; UM.I18nCatalog { id: catalog; name:"cura"} - RowLayout - { - anchors.horizontalCenter: parent.horizontalCenter; + property int totalHeightHeader: childrenRect.height + spacing: 0 - width: parent.width - UM.Theme.sizes.default_margin.width * 2; - height: UM.Theme.sizes.line.height; + Rectangle { + id: settingsModeRow + width: base.width + height: UM.Theme.sizes.sidebar_header.height + anchors.top: parent.top + color: UM.Theme.colors.sidebar_header_bar - Label - { - //: Configuration mode label - text: catalog.i18nc("@label","Mode:"); - - font: UM.Theme.fonts.sidebar_header; - color: UM.Theme.colors.text_inactive; + Label{ + id: settingsModeLabel + text: catalog.i18nc("@label","Print setup: "); + anchors.left: parent.left + anchors.leftMargin: UM.Theme.sizes.default_margin.width; + anchors.verticalCenter: parent.verticalCenter + width: parent.width/100*45 + font: UM.Theme.fonts.default; + color: UM.Theme.colors.text_white } - ToolButton - { - text: base.modesModel ? base.modesModel.get(modeMenu.currentIndex).text : ""; - - style: UM.Theme.styles.sidebar_header_button; - - Layout.preferredWidth: base.width * 0.25; - - menu: Menu - { - id: modeMenu; - - property int currentIndex: 0; - - Instantiator - { - model: base.modesModel; - - MenuItem - { - text: model.text; - checkable: true; - checked: modeMenu.currentIndex == index; - exclusiveGroup: modeMenuGroup; - onTriggered: modeMenu.currentIndex = index; + Rectangle{ + id: settingsModeSelection + width: parent.width/100*55 + height: childrenRect.height - UM.Theme.sizes.default_margin.width; + anchors.right: parent.right + anchors.rightMargin: UM.Theme.sizes.default_margin.width; + anchors.verticalCenter: parent.verticalCenter + color: "red" + Component{ + id: wizardDelegate + Button { + id: simpleModeButton + height: settingsModeSelection.height + anchors.left: parent.left + anchors.leftMargin: model.index * (settingsModeSelection.width / 2) + anchors.top: parent.top + width: parent.width / 2 + text: model.text + style: ButtonStyle { + background: Rectangle { + color: control.hovered ? UM.Theme.colors.load_save_button_hover : UM.Theme.colors.load_save_button + Behavior on color { ColorAnimation { duration: 50; } } + Label { + anchors.centerIn: parent + color: UM.Theme.colors.load_save_button_text + font: UM.Theme.fonts.default + text: control.text; + } + } + label: Item { } } - onObjectAdded: modeMenu.insertItem(index, object) - onObjectRemoved: modeMenu.removeItem(object) } + } - ExclusiveGroup { id: modeMenuGroup; } + ListView{ + id: modesList + property var index: 0 + model: base.modesModel + delegate: wizardDelegate + anchors.top: parent.top + anchors.left: parent.left + width: parent.width + height: UM.Theme.sizes.sidebar_header.height } } + } - Rectangle - { - width: 1; - height: parent.height; - color: UM.Theme.colors.border; - } + Rectangle { + id: machineSelectionRow + width: base.width - (UM.Theme.sizes.default_margin.width * 2) + height: UM.Theme.sizes.sidebar_header.height + anchors.top: settingsModeRow.bottom + anchors.horizontalCenter: parent.horizontalCenter - Label - { + Label{ + id: machineSelectionLabel //: Machine selection label text: catalog.i18nc("@label","Machine:"); - - font: UM.Theme.fonts.sidebar_header; - color: UM.Theme.colors.text_inactive; + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + font: UM.Theme.fonts.default; } - ToolButton - { - id: machineButton; + ToolButton { + id: machineSelection text: UM.Application.machineName; + width: parent.width/100*55 + height: UM.Theme.sizes.sidebar_header.height tooltip: UM.Application.machineName; - - style: UM.Theme.styles.sidebar_header_button; - - Layout.fillWidth: true; + //style: UM.Theme.styles.sidebar_header_button; + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter menu: Menu { - id: machineMenu; + id: machineSelectionMenu Instantiator { model: UM.Models.machinesModel @@ -113,7 +129,7 @@ Column onObjectRemoved: machineMenu.removeItem(object) } - ExclusiveGroup { id: machineMenuGroup; } + ExclusiveGroup { id: machineSelectionMenuGroup; } MenuSeparator { } @@ -123,6 +139,40 @@ Column } } + /////////////////tot hier + +// ToolButton +// { +// text: base.modesModel ? base.modesModel.get(modeMenu.currentIndex).text : ""; +// +// style: UM.Theme.styles.sidebar_header_button; +// +// menu: Menu +// { +// id: modeMenu; +// +// property int currentIndex: 0; +// +// Instantiator +// { +// model: base.modesModel; +// +// MenuItem +// { +// text: model.text; +// checkable: true; +// checked: modeMenu.currentIndex == index; +// exclusiveGroup: modeMenuGroup; +// onTriggered: modeMenu.currentIndex = index; +// } +// onObjectAdded: modeMenu.insertItem(index, object) +// onObjectRemoved: modeMenu.removeItem(object) +// } +// +// ExclusiveGroup { id: modeMenuGroup; } +// } +// } +/* UM.SidebarCategoryHeader { width: parent.width; @@ -135,5 +185,5 @@ Column enabled: false; color: UM.Theme.colors.primary; - } + }*/ }