From 406baf49af7183fcc13e5f2279f3f3507e0d3474 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 7 Jun 2016 18:25:03 +0200 Subject: [PATCH 01/69] JSON feat: replaced global_only with four properties settable_per_[mesh|extruder|meshgroup] and settable_globally (CURA-1558) --- resources/definitions/fdmprinter.def.json | 1264 +++++++++++++++++---- 1 file changed, 1016 insertions(+), 248 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ec27abd9f5..f80d5d0d8f 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -32,151 +32,209 @@ "description": "Whether to show the different variants of this machine, which are described in separate json files.", "default_value": false, "type": "bool", - "label": "Show machine variants" + "label": "Show machine variants", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_start_gcode": { "description": "Gcode commands to be executed at the very start - separated by \\n.", "default_value": "G28 ;Home\nG1 Z15.0 F6000 ;Move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0", "label": "Start GCode", - "global_only": true, - "type": "str" + "type": "str", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_end_gcode": { "description": "Gcode commands to be executed at the very end - separated by \\n.", "default_value": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84", "label": "End GCode", - "global_only": true, - "type": "str" + "type": "str", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "material_bed_temp_wait": { "description": "Whether to insert a command to wait until the bed temperature is reached at the start.", "label": "Wait for bed heatup", "default_value": true, - "global_only": true, - "type": "bool" + "type": "bool", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "material_print_temp_prepend": { "description": "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting.", "default_value": true, - "global_only": true, "type": "bool", - "label": "Wait for material heatup" + "label": "Wait for material heatup", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_width": { "description": "The width (X-direction) of the printable area.", "default_value": 100, - "global_only": true, "type": "float", - "label": "Machine width" + "label": "Machine width", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_depth": { "description": "The depth (Y-direction) of the printable area.", "default_value": 100, - "global_only": true, "type": "float", - "label": "Machine depth" + "label": "Machine depth", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_height": { "description": "The height (Z-direction) of the printable area.", "default_value": 100, - "global_only": true, "type": "float", - "label": "Machine height" + "label": "Machine height", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_heated_bed": { "description": "Whether the machine has a heated bed present.", "default_value": false, - "global_only": true, "label": "Has heated bed", - "type": "bool" + "type": "bool", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_center_is_zero": { "description": "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area.", "default_value": false, - "global_only": true, "type": "bool", - "label": "Is center origin" + "label": "Is center origin", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_extruder_count": { "description": "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle.", "default_value": 1, - "global_only": true, "type": "int", - "label": "Number extruders" + "label": "Number extruders", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_nozzle_tip_outer_diameter": { "description": "The outer diameter of the tip of the nozzle.", "label": "Outer nozzle diameter", "default_value": 1, - "global_only": true, - "type": "float" + "type": "float", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false }, "machine_nozzle_head_distance": { "description": "The height difference between the tip of the nozzle and the lowest part of the print head.", "default_value": 3, - "global_only": true, "type": "float", - "label": "Nozzle length" + "label": "Nozzle length", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_nozzle_expansion_angle": { "description": "The angle between the horizontal plane and the conical part right above the tip of the nozzle.", "default_value": 45, - "global_only": true, "type": "int", - "label": "Nozzle angle" + "label": "Nozzle angle", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_heat_zone_length": { "description": "The distance from the tip of the nozzle in which heat from the nozzle is transfered to the filament.", "default_value": 16, - "global_only": true, "type": "float", - "label": "Heat zone length" + "label": "Heat zone length", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_nozzle_heat_up_speed": { "description": "The speed (°C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature.", "default_value": 2.0, - "global_only": true, "type": "float", - "label": "Heat up speed" + "label": "Heat up speed", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "machine_nozzle_cool_down_speed": { "description": "The speed (°C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature.", "default_value": 2.0, - "global_only": true, "type": "float", - "label": "Cool down speed" + "label": "Cool down speed", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "machine_gcode_flavor": { "description": "The type of gcode to be generated.", "default_value": "RepRap", - "global_only": true, "type": "str", - "label": "Gcode flavour" + "label": "Gcode flavour", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_disallowed_areas": { "description": "A list of polygons with areas the print head is not allowed to enter.", "type": "polygons", "default_value": [], - "global_only": true, - "label": "Disallowed areas" + "label": "Disallowed areas", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_head_polygon": { @@ -201,8 +259,11 @@ 1 ] ], - "global_only": true, - "label": "Machine head polygon" + "label": "Machine head polygon", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_head_with_fans_polygon": { @@ -227,16 +288,22 @@ -10 ] ], - "global_only": true, - "label": "Machine head & Fan polygon" + "label": "Machine head & Fan polygon", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "gantry_height": { "description": "The height difference between the tip of the nozzle and the gantry system (X and Y axes).", "default_value": 99999999999, - "global_only": true, "label": "Gantry height", - "type": "float" + "type": "float", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "machine_nozzle_size": { @@ -246,14 +313,22 @@ "type": "float", "default_value": 0.4, "minimum_value": "0.001", - "maximum_value_warning": "10" + "maximum_value_warning": "10", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "machine_use_extruder_offset_to_offset_coords": { "label": "Offset With Extruder", "description": "Apply the extruder offset to the coordinate system.", "type": "bool", - "default_value": true + "default_value": true, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true } } }, @@ -275,7 +350,11 @@ "minimum_value": "0.001", "minimum_value_warning": "0.04", "maximum_value_warning": "0.8 * machine_nozzle_size", - "global_only": "True" + "default_value": true, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "layer_height_0": { @@ -287,7 +366,11 @@ "minimum_value": "0.001", "minimum_value_warning": "0.04", "maximum_value_warning": "0.8 * machine_nozzle_size", - "global_only": "True" + "default_value": true, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "line_width": { @@ -313,6 +396,11 @@ "value":"line_width", "default_value": 0.4, "type": "float", + "default_value": true, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "wall_line_width_0": @@ -325,7 +413,11 @@ "maximum_value_warning": "5", "default_value": 0.4, "value":"wall_line_width", - "type": "float" + "type": "float", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "wall_line_width_x": { @@ -337,7 +429,11 @@ "maximum_value_warning": "5", "default_value": 0.4, "value":"wall_line_width", - "type": "float" + "type": "float", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -351,7 +447,11 @@ "maximum_value_warning": "5", "default_value": 0.4, "type": "float", - "value": "line_width" + "value": "line_width", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "infill_line_width": { @@ -363,7 +463,11 @@ "maximum_value_warning": "5", "default_value": 0.4, "type": "float", - "value": "line_width" + "value": "line_width", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "skirt_line_width": { @@ -375,8 +479,11 @@ "maximum_value_warning": "5", "default_value": 0.4, "type": "float", - "global_only": true, - "value": "line_width" + "value": "line_width", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_line_width": { @@ -389,8 +496,11 @@ "default_value": 0.4, "type": "float", "enabled": "support_enable", - "global_only": true, - "value": "line_width" + "value": "line_width", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_roof_line_width": { @@ -402,8 +512,11 @@ "maximum_value_warning": "machine_nozzle_size * 2", "type": "float", "enabled": "support_roof_enable", - "global_only": true, - "value": "line_width" + "value": "line_width", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "prime_tower_line_width": { @@ -417,7 +530,10 @@ "minimum_value": "0.0001", "minimum_value_warning": "0.2", "maximum_value_warning": "5", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } } @@ -441,6 +557,10 @@ "minimum_value_warning": "line_width", "maximum_value_warning": "5 * line_width", "type": "float", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "wall_line_count": @@ -450,7 +570,11 @@ "default_value": 2, "minimum_value": "0", "type": "int", - "value": "1 if magic_spiralize else max(1, round((wall_thickness - wall_line_width_0) / wall_line_width_x) + 1)" + "value": "1 if magic_spiralize else max(1, round((wall_thickness - wall_line_width_0) / wall_line_width_x) + 1)", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -464,6 +588,10 @@ "maximum_value": "5", "minimum_value_warning": "0.6", "type": "float", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "top_thickness": @@ -476,6 +604,10 @@ "maximum_value_warning": "100", "type": "float", "value": "top_bottom_thickness", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "top_layers": @@ -486,7 +618,11 @@ "minimum_value": "0", "maximum_value_warning": "100", "type": "int", - "value": "0 if infill_sparse_density == 100 else math.ceil(round(top_thickness / layer_height, 4))" + "value": "0 if infill_sparse_density == 100 else math.ceil(round(top_thickness / layer_height, 4))", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -499,6 +635,10 @@ "minimum_value": "0", "type": "float", "value": "top_bottom_thickness", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "bottom_layers": @@ -508,7 +648,11 @@ "minimum_value": "0", "default_value": 6, "type": "int", - "value": "999999 if infill_sparse_density == 100 else math.ceil(round(bottom_thickness / layer_height, 4))" + "value": "999999 if infill_sparse_density == 100 else math.ceil(round(bottom_thickness / layer_height, 4))", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } } @@ -525,7 +669,11 @@ "concentric": "Concentric", "zigzag": "Zig Zag" }, - "default_value": "lines" + "default_value": "lines", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "wall_0_inset": { @@ -536,14 +684,22 @@ "default_value": 0.0, "value": "(machine_nozzle_size - wall_line_width_0) / 2 if wall_line_width_0 < machine_nozzle_size else 0", "minimum_value_warning": "0", - "maximum_value_warning": "machine_nozzle_size" + "maximum_value_warning": "machine_nozzle_size", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "alternate_extra_perimeter": { "label": "Alternate Extra Wall", "description": "Prints an extra wall at every other layer. This way infill gets caught between these extra walls, resulting in stronger prints.", "type": "bool", - "default_value": false + "default_value": false, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "travel_compensate_overlapping_walls_enabled": { @@ -551,6 +707,10 @@ "description": "Compensate the flow for parts of a wall being printed where there is already a wall in place.", "type": "bool", "default_value": true, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "travel_compensate_overlapping_walls_0_enabled": { @@ -558,14 +718,22 @@ "description": "Compensate the flow for parts of an outer wall being printed where there is already a wall in place.", "type": "bool", "default_value": true, - "value": "travel_compensate_overlapping_walls_enabled" + "value": "travel_compensate_overlapping_walls_enabled", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "travel_compensate_overlapping_walls_x_enabled": { "label": "Compensate Inner Wall Overlaps", "description": "Compensate the flow for parts of an inner wall being printed where there is already a wall in place.", "type": "bool", "default_value": true, - "value": "travel_compensate_overlapping_walls_enabled" + "value": "travel_compensate_overlapping_walls_enabled", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -577,7 +745,11 @@ "type": "float", "minimum_value_warning": "-10", "maximum_value_warning": "10", - "default_value": 0 + "default_value": 0, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "z_seam_type": { @@ -590,14 +762,22 @@ "shortest": "Shortest", "random": "Random" }, - "default_value": "shortest" + "default_value": "shortest", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "skin_no_small_gaps_heuristic": { "label": "Ignore Small Z Gaps", "description": "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting.", "type": "bool", - "default_value": true + "default_value": true, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -618,6 +798,10 @@ "default_value": 20, "minimum_value": "0", "maximum_value_warning": "100", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "infill_line_distance": @@ -628,7 +812,11 @@ "type": "float", "default_value": 2, "minimum_value": "0", - "value": "0 if infill_sparse_density == 0 else (infill_line_width * 100) / infill_sparse_density * (2 if infill_pattern == \"grid\" else (3 if infill_pattern == \"triangles\" else 1))" + "value": "0 if infill_sparse_density == 0 else (infill_line_width * 100) / infill_sparse_density * (2 if infill_pattern == \"grid\" else (3 if infill_pattern == \"triangles\" else 1))", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -646,7 +834,11 @@ "zigzag": "Zig Zag" }, "default_value": "grid", - "value": "'lines' if infill_sparse_density > 25 else 'grid'" + "value": "'lines' if infill_sparse_density > 25 else 'grid'", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "infill_overlap": { @@ -659,6 +851,10 @@ "minimum_value_warning": "-50", "maximum_value_warning": "100", "enabled": "infill_pattern != 'concentric'", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "infill_overlap_mm": @@ -671,7 +867,11 @@ "minimum_value_warning": "-0.5 * machine_nozzle_size", "maximum_value_warning": "machine_nozzle_size", "value": "infill_line_width * infill_overlap / 100 if infill_sparse_density < 95 and infill_pattern != 'concentric' else 0", - "enabled": "infill_pattern != 'concentric'" + "enabled": "infill_pattern != 'concentric'", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -685,6 +885,10 @@ "maximum_value_warning": "100", "value": "5 if top_bottom_pattern != 'concentric' else 0", "enabled": "top_bottom_pattern != 'concentric'", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "skin_overlap_mm": { "label": "Skin Overlap", @@ -695,7 +899,11 @@ "minimum_value_warning": "-0.5 * machine_nozzle_size", "maximum_value_warning": "machine_nozzle_size", "value": "skin_line_width * skin_overlap / 100 if top_bottom_pattern != 'concentric' else 0", - "enabled": "top_bottom_pattern != 'concentric'" + "enabled": "top_bottom_pattern != 'concentric'", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -708,7 +916,11 @@ "default_value": 0.04, "value": "wall_line_width_0 / 4 if wall_line_count == 1 else wall_line_width_x / 4", "minimum_value_warning": "0", - "maximum_value_warning": "machine_nozzle_size" + "maximum_value_warning": "machine_nozzle_size", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "infill_sparse_thickness": { @@ -720,14 +932,22 @@ "minimum_value": "0.0001", "maximum_value_warning": "0.32", "maximum_value": "layer_height * 8", - "value": "layer_height" + "value": "layer_height", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "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": "bool", - "default_value": true + "default_value": true, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -746,7 +966,10 @@ "type": "bool", "default_value": false, "enabled": "False", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "material_print_temperature": { @@ -757,7 +980,11 @@ "default_value": 210, "minimum_value": "0", "maximum_value_warning": "260", - "enabled": "not (material_flow_dependent_temperature)" + "enabled": "not (material_flow_dependent_temperature)", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "material_flow_temp_graph": { @@ -768,7 +995,10 @@ "default_value": "[[3.5,200],[7.0,240]]", "enabled": "False", "comments": "old enabled function: material_flow_dependent_temperature", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "material_extrusion_cool_down_speed": { "label": "Extrusion Cool Down Speed Modifier", @@ -778,9 +1008,12 @@ "default_value": 0.5, "minimum_value": "0", "maximum_value_warning": "10.0", - "global_only": "True", "enabled": "False", - "comments": "old enabled function: material_flow_dependent_temperature or machine_extruder_count > 1" + "comments": "old enabled function: material_flow_dependent_temperature or machine_extruder_count > 1", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "material_bed_temperature": { "label": "Bed Temperature", @@ -791,7 +1024,10 @@ "minimum_value": "0", "maximum_value_warning": "260", "enabled": "machine_heated_bed", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "material_diameter": { "label": "Diameter", @@ -802,7 +1038,10 @@ "minimum_value": "0.0001", "minimum_value_warning": "0.4", "maximum_value_warning": "3.5", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "material_flow": { "label": "Flow", @@ -812,13 +1051,21 @@ "type": "float", "minimum_value": "5", "minimum_value_warning": "50", - "maximum_value_warning": "150" + "maximum_value_warning": "150", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "retraction_enable": { "label": "Enable Retraction", "description": "Retract the filament when the nozzle is moving over a non-printed area. ", "type": "bool", - "default_value": true + "default_value": true, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "retraction_amount": { "label": "Retraction Distance", @@ -828,7 +1075,11 @@ "default_value": 6.5, "minimum_value_warning": "-0.0001", "maximum_value_warning": "10.0", - "enabled": "retraction_enable" + "enabled": "retraction_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "retraction_speed": { "label": "Retraction Speed", @@ -840,6 +1091,10 @@ "maximum_value": "299792458000", "maximum_value_warning": "100", "enabled": "retraction_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "retraction_retract_speed": { "label": "Retraction Retract Speed", @@ -851,7 +1106,11 @@ "maximum_value": "299792458000", "maximum_value_warning": "100", "enabled": "retraction_enable", - "value": "retraction_speed" + "value": "retraction_speed", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "retraction_prime_speed": { "label": "Retraction Prime Speed", @@ -863,7 +1122,11 @@ "maximum_value": "299792458000", "maximum_value_warning": "100", "enabled": "retraction_enable", - "value": "retraction_speed" + "value": "retraction_speed", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -875,7 +1138,11 @@ "default_value": 0, "minimum_value_warning": "-0.0001", "maximum_value_warning": "5.0", - "enabled": "retraction_enable" + "enabled": "retraction_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "retraction_min_travel": { "label": "Retraction Minimum Travel", @@ -886,7 +1153,11 @@ "value": "line_width * 2", "minimum_value": "0", "maximum_value_warning": "10", - "enabled": "retraction_enable" + "enabled": "retraction_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "retraction_count_max": { "label": "Maximum Retraction Count", @@ -895,7 +1166,11 @@ "minimum_value": "0", "maximum_value_warning": "100", "type": "int", - "enabled": "retraction_enable" + "enabled": "retraction_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "retraction_extrusion_window": { "label": "Minimum Extrusion Distance Window", @@ -906,7 +1181,11 @@ "minimum_value": "0", "maximum_value_warning": "retraction_amount * 2", "value": "retraction_amount", - "enabled": "retraction_enable" + "enabled": "retraction_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "retraction_hop": { "label": "Z Hop when Retracting", @@ -916,7 +1195,11 @@ "default_value": 0, "minimum_value_warning": "-0.0001", "maximum_value_warning": "10", - "enabled": "retraction_enable" + "enabled": "retraction_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "material_standby_temperature": { @@ -927,7 +1210,10 @@ "default_value": 150, "minimum_value": "0", "maximum_value_warning": "260", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "switch_extruder_retraction_amount": { @@ -940,7 +1226,10 @@ "value": "machine_heat_zone_length", "minimum_value_warning": "0", "maximum_value_warning": "100", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "switch_extruder_retraction_speeds": { @@ -952,7 +1241,10 @@ "default_value": 20, "minimum_value": "0.1", "maximum_value_warning": "300", - "global_only": "True", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "switch_extruder_retraction_speed": @@ -966,7 +1258,10 @@ "value": "switch_extruder_retraction_speeds", "minimum_value": "0.1", "maximum_value_warning": "300", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "switch_extruder_prime_speed": { @@ -979,7 +1274,10 @@ "value": "switch_extruder_retraction_speeds", "minimum_value": "0.1", "maximum_value_warning": "300", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -992,7 +1290,11 @@ "default_value": 1, "minimum_value_warning": "-0.0001", "maximum_value_warning": "10", - "enabled": "retraction_enable" + "enabled": "retraction_enable", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1014,6 +1316,10 @@ "maximum_value_warning": "150", "maximum_value": "299792458000", "default_value": 60, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "speed_infill": @@ -1026,7 +1332,11 @@ "maximum_value": "299792458000", "maximum_value_warning": "150", "default_value": 60, - "value": "speed_print" + "value": "speed_print", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "speed_wall": { @@ -1039,6 +1349,10 @@ "maximum_value_warning": "150", "default_value": 30, "value": "speed_print / 2", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "speed_wall_0": @@ -1051,7 +1365,11 @@ "maximum_value": "299792458000", "maximum_value_warning": "150", "default_value": 30, - "value": "speed_wall" + "value": "speed_wall", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "speed_wall_x": { @@ -1063,7 +1381,11 @@ "maximum_value": "299792458000", "maximum_value_warning": "150", "default_value": 60, - "value": "speed_wall * 2" + "value": "speed_wall * 2", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1077,7 +1399,11 @@ "maximum_value": "299792458000", "maximum_value_warning": "150", "default_value": 30, - "value": "speed_print / 2" + "value": "speed_print / 2", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "speed_support": { @@ -1091,6 +1417,10 @@ "default_value": 60, "value": "speed_print", "enabled": "support_roof_enable", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "speed_support_infill": @@ -1105,7 +1435,10 @@ "maximum_value_warning": "150", "value": "speed_support", "enabled": "support_enable", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "speed_support_roof": { @@ -1119,7 +1452,10 @@ "maximum_value_warning": "150", "enabled": "support_roof_enable and support_enable", "value": "speed_support / 1.5", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1134,7 +1470,10 @@ "value": "speed_print", "minimum_value": "0.1", "maximum_value_warning": "150", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1149,7 +1488,10 @@ "maximum_value": "299792458000", "maximum_value_warning": "300", "value": "speed_print if magic_spiralize else 120", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "speed_layer_0": { "label": "Initial Layer Speed", @@ -1159,7 +1501,11 @@ "default_value": 30, "minimum_value": "0.1", "maximum_value": "299792458000", - "maximum_value_warning": "300" + "maximum_value_warning": "300", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "skirt_speed": { "label": "Skirt Speed", @@ -1171,7 +1517,10 @@ "maximum_value": "299792458000", "maximum_value_warning": "300", "value": "speed_layer_0", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "speed_slowdown_layers": { @@ -1182,7 +1531,10 @@ "minimum_value": "0", "maximum_value": "299792458000", "maximum_value_warning": "300", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1206,7 +1558,10 @@ "noskin": "No Skin" }, "default_value": "all", - "global_only": true + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "travel_avoid_other_parts": { @@ -1215,7 +1570,10 @@ "type": "bool", "default_value": true, "enabled": "retraction_combing != \"off\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "travel_avoid_distance": { @@ -1228,7 +1586,10 @@ "minimum_value": "0", "maximum_value_warning": "machine_nozzle_tip_outer_diameter * 5", "enabled": "retraction_combing != \"off\" and travel_avoid_other_parts", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1246,7 +1607,10 @@ "description": "Enables the cooling fans while printing. The fans improve print quality on layers with short layer times and bridging / overhangs.", "type": "bool", "default_value": true, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "cool_fan_speed": { @@ -1259,7 +1623,10 @@ "default_value": 100, "value": "100.0 if cool_fan_enabled else 0.0", "enabled": "cool_fan_enabled", - "global_only": "True", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "cool_fan_speed_min": @@ -1273,7 +1640,10 @@ "value": "cool_fan_speed", "default_value": 100, "enabled": "cool_fan_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "cool_fan_speed_max": { @@ -1285,8 +1655,11 @@ "maximum_value": "100", "default_value": 100, "enabled": "cool_fan_enabled", - "global_only": "True", - "value": "cool_fan_speed" + "value": "cool_fan_speed", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1299,7 +1672,10 @@ "default_value": 10, "minimum_value": "cool_min_layer_time", "maximum_value_warning": "600", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "cool_fan_full_at_height": { @@ -1311,7 +1687,10 @@ "value": "layer_height_0", "minimum_value": "0", "maximum_value_warning": "10.0", - "global_only": "True", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "cool_fan_full_layer": @@ -1323,7 +1702,10 @@ "minimum_value": "0", "maximum_value_warning": "100", "value": "max(0, int(round((cool_fan_full_at_height - layer_height_0) / layer_height, 0)))", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1336,7 +1718,10 @@ "default_value": 5, "minimum_value": "0", "maximum_value_warning": "600", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "cool_min_speed": { @@ -1347,7 +1732,10 @@ "default_value": 10, "minimum_value": "0", "maximum_value_warning": "100", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "cool_lift_head": { @@ -1355,7 +1743,10 @@ "description": "When the minimum speed is hit because of minimum layer time, lift the head away from the print and wait the extra time until the minimum layer time is reached.", "type": "bool", "default_value": false, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1372,7 +1763,11 @@ "label": "Enable Support", "description": "Enable support structures. These structures support parts of the model with severe overhangs.", "type": "bool", - "default_value": false + "default_value": false, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_type": { @@ -1385,7 +1780,11 @@ "everywhere": "Everywhere" }, "default_value": "everywhere", - "enabled": "support_enable" + "enabled": "support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_angle": { @@ -1396,7 +1795,11 @@ "minimum_value": "0", "maximum_value": "90", "default_value": 50, - "enabled": "support_enable" + "enabled": "support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_pattern": { @@ -1413,7 +1816,10 @@ }, "default_value": "zigzag", "enabled": "support_enable", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_connect_zigzags": { @@ -1422,7 +1828,10 @@ "type": "bool", "default_value": true, "enabled": "support_enable and (support_pattern == \"zigzag\")", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_infill_rate": { @@ -1434,7 +1843,10 @@ "maximum_value_warning": "100", "default_value": 15, "enabled": "support_enable", - "global_only": true, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "support_line_distance": { @@ -1446,7 +1858,10 @@ "default_value": 2.66, "enabled": "support_enable", "value": "(support_line_width * 100) / support_infill_rate * (2 if support_pattern == \"grid\" else (3 if support_pattern == \"triangles\" else 1))", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1460,7 +1875,10 @@ "maximum_value_warning": "10", "default_value": 0.15, "enabled": "support_enable", - + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "support_top_distance": @@ -1473,7 +1891,11 @@ "default_value": 0.15, "type": "float", "enabled": "support_enable", - "value": "support_z_distance" + "value": "support_z_distance", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_bottom_distance": { @@ -1485,7 +1907,11 @@ "default_value": 0.1, "value": "0.1 if support_type == 'everywhere' else 0", "type": "float", - "enabled": "support_enable and support_type == 'everywhere'" + "enabled": "support_enable and support_type == 'everywhere'", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1498,7 +1924,11 @@ "minimum_value": "0", "maximum_value_warning": "10", "default_value": 0.7, - "enabled": "support_enable" + "enabled": "support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_xy_overrides_z": { "label": "Support Distance Priority", @@ -1509,7 +1939,11 @@ "z_overrides_xy": "Z overrides X/Y" }, "default_value": "z_overrides_xy", - "enabled": "support_enable" + "enabled": "support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_xy_distance_overhang": { "label": "Minimum Support X/Y Distance", @@ -1520,7 +1954,11 @@ "maximum_value_warning": "10", "default_value": 0.2, "value": "machine_nozzle_size / 2", - "enabled": "support_enable and support_xy_overrides_z=='z_overrides_xy'" + "enabled": "support_enable and support_xy_overrides_z=='z_overrides_xy'", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_bottom_stair_step_height": { @@ -1531,7 +1969,11 @@ "default_value": 0.3, "minimum_value": "0", "maximum_value_warning": "1.0", - "enabled": "support_enable" + "enabled": "support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_join_distance": { @@ -1542,7 +1984,11 @@ "default_value": 2.0, "minimum_value_warning": "0", "maximum_value_warning": "10", - "enabled": "support_enable" + "enabled": "support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_offset": { @@ -1553,7 +1999,11 @@ "default_value": 0.2, "minimum_value_warning": "-0.5", "maximum_value_warning": "5.0", - "enabled": "support_enable" + "enabled": "support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_area_smoothing": { @@ -1564,7 +2014,11 @@ "default_value": 0.6, "minimum_value": "0", "maximum_value_warning": "1.0", - "enabled": "support_enable" + "enabled": "support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_roof_enable": { @@ -1572,7 +2026,11 @@ "description": "Generate a dense top skin at the top of the support on which the model is printed.", "type": "bool", "default_value": false, - "enabled": "support_enable" + "enabled": "support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_roof_height": { @@ -1583,7 +2041,11 @@ "default_value": 1, "minimum_value": "0", "maximum_value_warning": "10", - "enabled": "support_roof_enable" + "enabled": "support_roof_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_roof_density": { @@ -1595,7 +2057,10 @@ "minimum_value": "0", "maximum_value_warning": "100", "enabled":"support_roof_enable", - "global_only": true, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "support_roof_line_distance": @@ -1608,7 +2073,10 @@ "minimum_value": "0", "value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_roof_pattern == \"grid\" else (3 if support_roof_pattern == \"triangles\" else 1))", "enabled": "support_roof_enable", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1627,7 +2095,10 @@ }, "default_value": "concentric", "enabled": "support_roof_enable", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_use_towers": { @@ -1635,7 +2106,11 @@ "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.", "type": "bool", "default_value": true, - "enabled": "support_enable" + "enabled": "support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_tower_diameter": { @@ -1646,7 +2121,11 @@ "default_value": 3.0, "minimum_value": "0", "maximum_value_warning": "10", - "enabled": "support_enable and support_use_towers" + "enabled": "support_enable and support_use_towers", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_minimal_diameter": { @@ -1658,7 +2137,11 @@ "minimum_value": "0", "maximum_value_warning": "10", "maximum_value": "support_tower_diameter", - "enabled": "support_enable and support_use_towers" + "enabled": "support_enable and support_use_towers", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_tower_roof_angle": { @@ -1669,7 +2152,11 @@ "minimum_value": "0", "maximum_value": "90", "default_value": 65, - "enabled": "support_enable and support_use_towers" + "enabled": "support_enable and support_use_towers", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1693,7 +2180,10 @@ "raft": "Raft" }, "default_value": "brim", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "skirt_line_count": { @@ -1704,7 +2194,10 @@ "minimum_value": "0", "maximum_value_warning": "10", "enabled": "adhesion_type == \"skirt\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "skirt_gap": { @@ -1716,7 +2209,10 @@ "minimum_value_warning": "0", "maximum_value_warning": "100", "enabled": "adhesion_type == \"skirt\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "skirt_minimal_length": { @@ -1729,7 +2225,10 @@ "minimum_value_warning": "25", "maximum_value_warning": "2500", "enabled": "adhesion_type == \"skirt\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "brim_width": { @@ -1741,7 +2240,10 @@ "minimum_value": "0.0", "maximum_value_warning": "100.0", "enabled": "adhesion_type == \"brim\"", - "global_only": "True", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "brim_line_count": @@ -1754,7 +2256,10 @@ "maximum_value_warning": "300", "value": "math.ceil(brim_width / skirt_line_width)", "enabled": "adhesion_type == \"brim\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1767,8 +2272,7 @@ "default_value": 5, "minimum_value_warning": "0", "maximum_value_warning": "10", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" + "enabled": "adhesion_type == \"raft\"" }, "raft_airgap": { @@ -1780,7 +2284,10 @@ "minimum_value": "0", "maximum_value_warning": "1.0", "enabled": "adhesion_type == \"raft\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "layer_0_z_overlap": { "label": "Initial Layer Z Overlap", @@ -1792,7 +2299,10 @@ "minimum_value": "0", "maximum_value_warning": "layer_height", "enabled": "adhesion_type == 'raft'", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_surface_layers": { @@ -1803,7 +2313,10 @@ "minimum_value": "0", "maximum_value_warning": "20", "enabled": "adhesion_type == \"raft\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_surface_thickness": { @@ -1815,7 +2328,10 @@ "minimum_value": "0", "maximum_value_warning": "2.0", "enabled": "adhesion_type == \"raft\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_surface_line_width": { @@ -1827,7 +2343,10 @@ "minimum_value": "0.0001", "maximum_value_warning": "machine_nozzle_size * 2", "enabled": "adhesion_type == \"raft\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_surface_line_spacing": { @@ -1840,7 +2359,10 @@ "maximum_value_warning": "5.0", "enabled": "adhesion_type == \"raft\"", "value": "raft_surface_line_width", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_interface_thickness": { @@ -1852,7 +2374,10 @@ "minimum_value": "0", "maximum_value_warning": "5.0", "enabled": "adhesion_type == \"raft\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_interface_line_width": { @@ -1865,7 +2390,10 @@ "minimum_value": "0.0001", "maximum_value_warning": "machine_nozzle_size * 2", "enabled": "adhesion_type == \"raft\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_interface_line_spacing": { @@ -1877,7 +2405,10 @@ "minimum_value": "0", "maximum_value_warning": "15.0", "enabled": "adhesion_type == \"raft\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_base_thickness": { @@ -1889,7 +2420,10 @@ "minimum_value": "0", "maximum_value_warning": "5.0", "enabled": "adhesion_type == \"raft\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_base_line_width": { @@ -1902,7 +2436,10 @@ "value": "line_width", "maximum_value_warning": "machine_nozzle_size * 2", "enabled": "adhesion_type == \"raft\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_base_line_spacing": { @@ -1914,7 +2451,10 @@ "minimum_value": "0.0001", "maximum_value_warning": "100", "enabled": "adhesion_type == \"raft\"", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_speed": { @@ -1928,7 +2468,10 @@ "maximum_value_warning": "200", "enabled": "adhesion_type == \"raft\"", "value": "speed_print / 60 * 30", - "global_only": "True", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "raft_surface_speed": @@ -1943,7 +2486,10 @@ "maximum_value_warning": "100", "enabled": "adhesion_type == \"raft\"", "value": "raft_speed", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_interface_speed": { @@ -1957,7 +2503,10 @@ "maximum_value_warning": "150", "enabled": "adhesion_type == \"raft\"", "value": "0.5 * raft_speed", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_base_speed": { @@ -1971,7 +2520,10 @@ "maximum_value_warning": "200", "enabled": "adhesion_type == \"raft\"", "value": "0.5 * raft_speed", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -1984,7 +2536,10 @@ "minimum_value": "0", "maximum_value": "100", "default_value": 0, - "global_only": "True", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "enabled": "adhesion_type == \"raft\"", "children": { @@ -1997,9 +2552,12 @@ "minimum_value": "0", "maximum_value": "100", "default_value": 0, - "global_only": "True", "value": "raft_fan_speed", - "enabled": "adhesion_type == \"raft\"" + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_interface_fan_speed": { @@ -2010,9 +2568,12 @@ "minimum_value": "0", "maximum_value": "100", "default_value": 0, - "global_only": "True", "value": "raft_fan_speed", - "enabled": "adhesion_type == \"raft\"" + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "raft_base_fan_speed": { @@ -2023,9 +2584,12 @@ "minimum_value": "0", "maximum_value": "100", "default_value": 0, - "global_only": "True", "value": "raft_fan_speed", - "enabled": "adhesion_type == \"raft\"" + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } } @@ -2044,28 +2608,44 @@ "label": "Union Overlapping Volumes", "description": "Ignore the internal geometry arising from overlapping volumes and print the volumes as one. This may cause internal cavities to disappear.", "type": "bool", - "default_value": true + "default_value": true, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "meshfix_union_all_remove_holes": { "label": "Remove All Holes", "description": "Remove the holes in each layer and keep only the outside shape. This will ignore any invisible internal geometry. However, it also ignores layer holes which can be viewed from above or below.", "type": "bool", - "default_value": false + "default_value": false, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "meshfix_extensive_stitching": { "label": "Extensive Stitching", "description": "Extensive stitching tries to stitch up open holes in the mesh by closing the hole with touching polygons. This option can introduce a lot of processing time.", "type": "bool", - "default_value": false + "default_value": false, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "meshfix_keep_open_polygons": { "label": "Keep Disconnected Faces", "description": "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode.", "type": "bool", - "default_value": false + "default_value": false, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -2088,7 +2668,10 @@ "one_at_a_time": "One at a Time" }, "default_value": "all_at_once", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "magic_mesh_surface_mode": { @@ -2101,7 +2684,11 @@ "surface": "Surface", "both": "Both" }, - "default_value": "normal" + "default_value": "normal", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "magic_spiralize": { @@ -2109,7 +2696,10 @@ "description": "Spiralize smooths out the Z move of the outer edge. This will create a steady Z increase over the whole print. This feature turns a solid object into a single walled print with a solid bottom. This feature used to be called Joris in older versions.", "type": "bool", "default_value": false, - "global_only": "True" + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -2129,7 +2719,10 @@ "default_value": 0, "minimum_value": "0", "maximum_value": "machine_extruder_count - 1", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_extruder_nr": { @@ -2139,7 +2732,10 @@ "default_value": 0, "minimum_value": "0", "maximum_value": "machine_extruder_count - 1", - "global_only": "True", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "support_infill_extruder_nr": { @@ -2150,7 +2746,10 @@ "value": "support_extruder_nr", "minimum_value": "0", "maximum_value": "machine_extruder_count - 1", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_extruder_nr_layer_0": { @@ -2161,7 +2760,10 @@ "value": "support_extruder_nr", "minimum_value": "0", "maximum_value": "machine_extruder_count - 1", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_roof_extruder_nr": { @@ -2172,7 +2774,10 @@ "value": "support_extruder_nr", "minimum_value": "0", "maximum_value": "machine_extruder_count - 1", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -2182,7 +2787,10 @@ "description": "Print a tower next to the print which serves to prime the material after each nozzle switch.", "type": "bool", "default_value": false, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "prime_tower_size": { @@ -2195,7 +2803,10 @@ "value": "15 if prime_tower_enable else 0", "minimum_value": "0", "maximum_value_warning": "20", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "prime_tower_position_x": { @@ -2207,7 +2818,10 @@ "default_value": 200, "minimum_value_warning": "-1000", "maximum_value_warning": "1000", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "prime_tower_position_y": { @@ -2219,7 +2833,10 @@ "default_value": 200, "minimum_value_warning": "-1000", "maximum_value_warning": "1000", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "prime_tower_flow": { @@ -2232,7 +2849,10 @@ "minimum_value": "0.0001", "minimum_value_warning": "50", "maximum_value_warning": "150", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "prime_tower_wipe_enabled": { @@ -2241,7 +2861,10 @@ "type": "bool", "enabled": "prime_tower_enable", "default_value": false, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "multiple_mesh_overlap": { @@ -2251,7 +2874,11 @@ "unit": "mm", "default_value": 0.15, "minimum_value": "0", - "maximum_value_warning": "1.0" + "maximum_value_warning": "1.0", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "ooze_shield_enabled": { @@ -2259,7 +2886,10 @@ "description": "Enable exterior ooze shield. This will create a shell around the object which is likely to wipe a second nozzle if it's at the same height as the first nozzle.", "type": "bool", "default_value": false, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "ooze_shield_angle": { @@ -2271,7 +2901,10 @@ "default_value": 60, "minimum_value": "0", "maximum_value": "90", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "ooze_shield_dist": { @@ -2283,7 +2916,10 @@ "default_value": 2, "minimum_value": "0", "maximum_value_warning": "30", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -2301,7 +2937,10 @@ "description": "This will create a wall around the object, which traps (hot) air and shields against exterior airflow. Especially useful for materials which warp easily.", "type": "bool", "default_value": false, - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "draft_shield_dist": { @@ -2313,7 +2952,10 @@ "maximum_value_warning": "100", "default_value": 10, "enabled": "draft_shield_enabled", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "draft_shield_height_limitation": { @@ -2327,7 +2969,10 @@ }, "default_value": "full", "enabled": "draft_shield_enabled", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "draft_shield_height": { @@ -2340,7 +2985,10 @@ "default_value": 0, "value": "9999 if draft_shield_height_limitation == 'full' and draft_shield_enabled else 0.0", "enabled": "draft_shield_height_limitation == \"limited\"", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true }, "conical_overhang_enabled": { "label": "Make Overhang Printable", @@ -2364,7 +3012,10 @@ "description": "Coasting replaces the last part of an extrusion path with a travel path. The oozed material is used to print the last piece of the extrusion path in order to reduce stringing.", "type": "bool", "default_value": false, - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "coasting_volume": { @@ -2376,7 +3027,10 @@ "minimum_value": "0", "maximum_value_warning": "2.0", "enabled": "coasting_enable", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "coasting_min_volume": { @@ -2388,7 +3042,10 @@ "minimum_value": "0", "maximum_value_warning": "10.0", "enabled": "coasting_enable", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "coasting_speed": { @@ -2400,7 +3057,10 @@ "minimum_value": "0.0001", "maximum_value_warning": "100", "enabled": "coasting_enable", - "global_only": true + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "skin_outline_count": { @@ -2409,7 +3069,11 @@ "default_value": 0, "minimum_value": "0", "maximum_value_warning": "10", - "type": "int" + "type": "int", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "skin_alternate_rotation": { @@ -2417,7 +3081,11 @@ "description": "Alternate the direction in which the top/bottom layers are printed. Normally they are printed diagonally only. This setting adds the X-only and Y-only directions.", "type": "bool", "default_value": false, - "enabled": "top_bottom_pattern != \"concentric\"" + "enabled": "top_bottom_pattern != \"concentric\"", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_conical_enabled": { @@ -2425,7 +3093,11 @@ "description": "Experimental feature: Make support areas smaller at the bottom than at the overhang.", "type": "bool", "default_value": false, - "enabled": "support_enable" + "enabled": "support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_conical_angle": { @@ -2438,7 +3110,11 @@ "maximum_value_warning": "45", "maximum_value": "90", "default_value": 30, - "enabled": "support_conical_enabled and support_enable" + "enabled": "support_conical_enabled and support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "support_conical_min_width": { @@ -2450,14 +3126,22 @@ "minimum_value_warning": "machine_nozzle_size * 3", "maximum_value_warning": "100.0", "type": "float", - "enabled": "support_conical_enabled and support_enable" + "enabled": "support_conical_enabled and support_enable", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "magic_fuzzy_skin_enabled": { "label": "Fuzzy Skin", "description": "Randomly jitter while printing the outer wall, so that the surface has a rough and fuzzy look.", "type": "bool", - "default_value": false + "default_value": false, + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "magic_fuzzy_skin_thickness": { @@ -2468,7 +3152,11 @@ "default_value": 0.3, "minimum_value": "0.001", "maximum_value_warning": "wall_line_width_0", - "enabled": "magic_fuzzy_skin_enabled" + "enabled": "magic_fuzzy_skin_enabled", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true }, "magic_fuzzy_skin_point_density": { @@ -2482,6 +3170,10 @@ "maximum_value_warning": "10", "maximum_value": "2 / magic_fuzzy_skin_thickness", "enabled": "magic_fuzzy_skin_enabled", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true, "children": { "magic_fuzzy_skin_point_dist": @@ -2495,7 +3187,11 @@ "minimum_value_warning": "0.1", "maximum_value_warning": "10", "value": "10000 if magic_fuzzy_skin_point_density == 0 else 1 / magic_fuzzy_skin_point_density", - "enabled": "magic_fuzzy_skin_enabled" + "enabled": "magic_fuzzy_skin_enabled", + "settable_per_mesh": true, + "settable_per_extruder": true, + "settable_per_meshgroup": true, + "settable_globally": true } } }, @@ -2505,7 +3201,10 @@ "description": "Print only the outside surface with a sparse webbed structure, printing 'in thin air'. This is realized by horizontally printing the contours of the model at given Z intervals which are connected via upward and diagonally downward lines.", "type": "bool", "default_value": false, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_height": { @@ -2517,7 +3216,10 @@ "minimum_value": "0.0001", "maximum_value_warning": "20", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_roof_inset": { @@ -2531,7 +3233,10 @@ "maximum_value_warning": "20", "enabled": "wireframe_enabled", "value": "wireframe_height", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_printspeed": { @@ -2544,7 +3249,10 @@ "maximum_value": "299792458000", "maximum_value_warning": "50", "enabled": "wireframe_enabled", - "global_only": "True", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true, "children": { "wireframe_printspeed_bottom": @@ -2558,8 +3266,11 @@ "maximum_value": "299792458000", "maximum_value_warning": "50", "enabled": "wireframe_enabled", - "global_only": "True", - "value": "wireframe_printspeed" + "value": "wireframe_printspeed", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_printspeed_up": { @@ -2572,8 +3283,11 @@ "maximum_value": "299792458000", "maximum_value_warning": "50", "enabled": "wireframe_enabled", - "global_only": "True", - "value": "wireframe_printspeed" + "value": "wireframe_printspeed", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_printspeed_down": { @@ -2586,8 +3300,11 @@ "maximum_value": "299792458000", "maximum_value_warning": "50", "enabled": "wireframe_enabled", - "global_only": "True", - "value": "wireframe_printspeed" + "value": "wireframe_printspeed", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_printspeed_flat": { @@ -2601,7 +3318,10 @@ "maximum_value_warning": "100", "value": "wireframe_printspeed", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true } } }, @@ -2615,7 +3335,10 @@ "maximum_value_warning": "100", "type": "float", "enabled": "wireframe_enabled", - "global_only": "True", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true, "children": { "wireframe_flow_connection": @@ -2628,8 +3351,11 @@ "maximum_value_warning": "100", "type": "float", "enabled": "wireframe_enabled", - "global_only": "True", - "value": "wireframe_flow" + "value": "wireframe_flow", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_flow_flat": { @@ -2641,8 +3367,11 @@ "maximum_value_warning": "100", "type": "float", "enabled": "wireframe_enabled", - "global_only": "True", - "value": "wireframe_flow" + "value": "wireframe_flow", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true } } }, @@ -2656,7 +3385,10 @@ "minimum_value": "0", "maximum_value_warning": "1", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_bottom_delay": { @@ -2668,7 +3400,10 @@ "minimum_value": "0", "maximum_value_warning": "1", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_flat_delay": { @@ -2680,7 +3415,10 @@ "minimum_value": "0", "maximum_value_warning": "0.5", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_up_half_speed": { @@ -2692,7 +3430,10 @@ "minimum_value": "0", "maximum_value_warning": "5.0", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_top_jump": { @@ -2704,7 +3445,10 @@ "minimum_value": "0", "maximum_value_warning": "2.0", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_fall_down": { @@ -2716,7 +3460,10 @@ "minimum_value": "0", "maximum_value_warning": "wireframe_height", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_drag_along": { @@ -2728,7 +3475,10 @@ "minimum_value": "0", "maximum_value_warning": "wireframe_height", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_strategy": { @@ -2743,7 +3493,10 @@ }, "default_value": "compensate", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_straight_before_down": { @@ -2755,7 +3508,10 @@ "minimum_value": "0", "maximum_value": "100", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_roof_fall_down": { @@ -2767,7 +3523,10 @@ "minimum_value_warning": "0", "maximum_value_warning": "wireframe_roof_inset", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_roof_drag_along": { @@ -2779,7 +3538,10 @@ "minimum_value": "0", "maximum_value_warning": "10", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_roof_outer_delay": { @@ -2791,7 +3553,10 @@ "minimum_value": "0", "maximum_value_warning": "2.0", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true }, "wireframe_nozzle_clearance": { @@ -2803,7 +3568,10 @@ "minimum_value_warning": "0", "maximum_value_warning": "10.0", "enabled": "wireframe_enabled", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": true } } } From fc0a3c83472e77b0fa0ff7484361c4a92a665ca2 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 7 Jun 2016 18:30:30 +0200 Subject: [PATCH 02/69] JSON feat: replaced global_only with four properties settable_per_[mesh|extruder|meshgroup] and settable_globally for fdmextruder settings (CURA-1558) --- resources/definitions/fdmextruder.def.json | 56 +++++++++++++++++----- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json index 69797385a1..940b0bb3ed 100644 --- a/resources/definitions/fdmextruder.def.json +++ b/resources/definitions/fdmextruder.def.json @@ -24,7 +24,11 @@ "description": "The extruder train used for printing. This is used in multi-extrusion.", "type": "extruder", "default_value": 0, - "minimum_value": "0" + "minimum_value": "0", + "settable_per_mesh": true, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": false }, "machine_nozzle_offset_x": { @@ -33,7 +37,10 @@ "type": "float", "unit": "mm", "default_value": 0, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false }, "machine_nozzle_offset_y": { @@ -42,7 +49,10 @@ "type": "float", "unit": "mm", "default_value": 0, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false }, "machine_extruder_start_code": { @@ -50,7 +60,10 @@ "description": "Start g-code to execute whenever turning the extruder on.", "type": "str", "default_value": "", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false }, "machine_extruder_start_pos_abs": { @@ -58,7 +71,10 @@ "description": "Make the extruder starting position absolute rather than relative to the last-known location of the head.", "type": "bool", "default_value": false, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false }, "machine_extruder_start_pos_x": { @@ -67,7 +83,10 @@ "type": "float", "unit": "mm", "default_value": 0, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false }, "machine_extruder_start_pos_y": { @@ -76,7 +95,10 @@ "type": "float", "unit": "mm", "default_value": 0, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false }, "machine_extruder_end_code": { @@ -84,7 +106,10 @@ "description": "End g-code to execute whenever turning the extruder off.", "type": "str", "default_value": "", - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false }, "machine_extruder_end_pos_abs": { @@ -92,7 +117,10 @@ "description": "Make the extruder ending position absolute rather than relative to the last-known location of the head.", "type": "bool", "default_value": false, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false }, "machine_extruder_end_pos_x": { @@ -101,7 +129,10 @@ "type": "float", "unit": "mm", "default_value": 0, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false }, "machine_extruder_end_pos_y": { @@ -110,7 +141,10 @@ "type": "float", "unit": "mm", "default_value": 0, - "global_only": "True" + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false } } } From 2e2437d1632250aa1588b9b24faebbdcb38b50f9 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 8 Jun 2016 10:50:40 +0200 Subject: [PATCH 03/69] feat: use settable_per_[mesh|extruder|meshgroup|globally] instead of global_only (CURA-1560) --- cura/CuraApplication.py | 5 ++++- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7edb0bf8bd..646e257ff3 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -91,7 +91,10 @@ class CuraApplication(QtApplication): self._open_file_queue = [] # Files to open when plug-ins are loaded. # Need to do this before ContainerRegistry tries to load the machines - SettingDefinition.addSupportedProperty("global_only", DefinitionPropertyType.Function, default = False) + SettingDefinition.addSupportedProperty("settable_per_mesh", DefinitionPropertyType.Function, default = True) + SettingDefinition.addSupportedProperty("settable_per_extruder", DefinitionPropertyType.Function, default = True) + SettingDefinition.addSupportedProperty("settable_per_meshgroup", DefinitionPropertyType.Function, default = True) + SettingDefinition.addSupportedProperty("settable_globally", DefinitionPropertyType.Function, default = True) SettingDefinition.addSettingType("extruder", int, str, UM.Settings.Validator) super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index c89485517e..bc721782ae 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -190,11 +190,11 @@ Item { { if(text != "") { - listview.model.filter = {"global_only": false, "label": "*" + text} + listview.model.filter = {"settable_per_mesh": true, "label": "*" + text} } else { - listview.model.filter = {"global_only": false} + listview.model.filter = {"settable_per_mesh": true} } } } @@ -219,7 +219,7 @@ Item { containerId: Cura.MachineManager.activeDefinitionId filter: { - "global_only": false + "settable_per_mesh": true } visibilityHandler: UM.SettingPreferenceVisibilityHandler {} } From 56b00ad4250b276c69eceee517d90c9c3c8dfde4 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 8 Jun 2016 11:54:25 +0200 Subject: [PATCH 04/69] JSON cleanup: removed settable_per_x when they were obvious and default (CURA-1560) removed:settable_globally: true settable_per_meshgroup: true settable_per_extruder: true when settable_per_mesh was also true --- cura/CuraApplication.py | 8 +- resources/definitions/fdmprinter.def.json | 886 +++++----------------- 2 files changed, 203 insertions(+), 691 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 646e257ff3..da2b38ade7 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -91,10 +91,10 @@ class CuraApplication(QtApplication): self._open_file_queue = [] # Files to open when plug-ins are loaded. # Need to do this before ContainerRegistry tries to load the machines - SettingDefinition.addSupportedProperty("settable_per_mesh", DefinitionPropertyType.Function, default = True) - SettingDefinition.addSupportedProperty("settable_per_extruder", DefinitionPropertyType.Function, default = True) - SettingDefinition.addSupportedProperty("settable_per_meshgroup", DefinitionPropertyType.Function, default = True) - SettingDefinition.addSupportedProperty("settable_globally", DefinitionPropertyType.Function, default = True) + SettingDefinition.addSupportedProperty("settable_per_mesh", DefinitionPropertyType.Any, default = True) + SettingDefinition.addSupportedProperty("settable_per_extruder", DefinitionPropertyType.Any, default = True) + SettingDefinition.addSupportedProperty("settable_per_meshgroup", DefinitionPropertyType.Any, default = True) + SettingDefinition.addSupportedProperty("settable_globally", DefinitionPropertyType.Any, default = True) SettingDefinition.addSettingType("extruder", int, str, UM.Settings.Validator) super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index f80d5d0d8f..504a0eac83 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -35,8 +35,7 @@ "label": "Show machine variants", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_start_gcode": { @@ -46,8 +45,7 @@ "type": "str", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_end_gcode": { @@ -57,8 +55,7 @@ "type": "str", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "material_bed_temp_wait": { @@ -68,8 +65,7 @@ "type": "bool", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "material_print_temp_prepend": { @@ -79,8 +75,7 @@ "label": "Wait for material heatup", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_width": { @@ -90,8 +85,7 @@ "label": "Machine width", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_depth": { @@ -101,8 +95,7 @@ "label": "Machine depth", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_height": { @@ -112,8 +105,7 @@ "label": "Machine height", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_heated_bed": { @@ -123,8 +115,7 @@ "type": "bool", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_center_is_zero": { @@ -134,8 +125,7 @@ "label": "Is center origin", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_extruder_count": { @@ -145,8 +135,7 @@ "label": "Number extruders", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_nozzle_tip_outer_diameter": { @@ -167,8 +156,7 @@ "label": "Nozzle length", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_nozzle_expansion_angle": { @@ -178,8 +166,7 @@ "label": "Nozzle angle", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_heat_zone_length": { @@ -189,8 +176,7 @@ "label": "Heat zone length", "settable_per_mesh": false, "settable_per_extruder": true, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_nozzle_heat_up_speed": { @@ -199,9 +185,7 @@ "type": "float", "label": "Heat up speed", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "machine_nozzle_cool_down_speed": { @@ -210,9 +194,7 @@ "type": "float", "label": "Cool down speed", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "machine_gcode_flavor": { @@ -222,8 +204,7 @@ "label": "Gcode flavour", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_disallowed_areas": { @@ -233,8 +214,7 @@ "label": "Disallowed areas", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_head_polygon": { @@ -262,8 +242,7 @@ "label": "Machine head polygon", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_head_with_fans_polygon": { @@ -291,8 +270,7 @@ "label": "Machine head & Fan polygon", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "gantry_height": { @@ -302,8 +280,7 @@ "type": "float", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "machine_nozzle_size": { @@ -315,9 +292,7 @@ "minimum_value": "0.001", "maximum_value_warning": "10", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "machine_use_extruder_offset_to_offset_coords": { @@ -327,8 +302,7 @@ "default_value": true, "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false } } }, @@ -352,9 +326,7 @@ "maximum_value_warning": "0.8 * machine_nozzle_size", "default_value": true, "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "layer_height_0": { @@ -368,9 +340,7 @@ "maximum_value_warning": "0.8 * machine_nozzle_size", "default_value": true, "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "line_width": { @@ -398,9 +368,6 @@ "type": "float", "default_value": true, "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "wall_line_width_0": @@ -414,10 +381,7 @@ "default_value": 0.4, "value":"wall_line_width", "type": "float", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "wall_line_width_x": { @@ -430,10 +394,7 @@ "default_value": 0.4, "value":"wall_line_width", "type": "float", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -448,10 +409,7 @@ "default_value": 0.4, "type": "float", "value": "line_width", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "infill_line_width": { @@ -464,10 +422,7 @@ "default_value": 0.4, "type": "float", "value": "line_width", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "skirt_line_width": { @@ -481,9 +436,7 @@ "type": "float", "value": "line_width", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "support_line_width": { @@ -498,9 +451,7 @@ "enabled": "support_enable", "value": "line_width", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "support_roof_line_width": { @@ -514,9 +465,7 @@ "enabled": "support_roof_enable", "value": "line_width", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "prime_tower_line_width": { @@ -531,9 +480,7 @@ "minimum_value_warning": "0.2", "maximum_value_warning": "5", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true } } } @@ -558,9 +505,6 @@ "maximum_value_warning": "5 * line_width", "type": "float", "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "wall_line_count": @@ -571,10 +515,7 @@ "minimum_value": "0", "type": "int", "value": "1 if magic_spiralize else max(1, round((wall_thickness - wall_line_width_0) / wall_line_width_x) + 1)", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -589,9 +530,6 @@ "minimum_value_warning": "0.6", "type": "float", "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "top_thickness": @@ -605,9 +543,6 @@ "type": "float", "value": "top_bottom_thickness", "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "top_layers": @@ -619,10 +554,7 @@ "maximum_value_warning": "100", "type": "int", "value": "0 if infill_sparse_density == 100 else math.ceil(round(top_thickness / layer_height, 4))", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -636,9 +568,6 @@ "type": "float", "value": "top_bottom_thickness", "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "bottom_layers": @@ -649,10 +578,7 @@ "default_value": 6, "type": "int", "value": "999999 if infill_sparse_density == 100 else math.ceil(round(bottom_thickness / layer_height, 4))", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } } @@ -670,10 +596,7 @@ "zigzag": "Zig Zag" }, "default_value": "lines", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "wall_0_inset": { @@ -685,10 +608,7 @@ "value": "(machine_nozzle_size - wall_line_width_0) / 2 if wall_line_width_0 < machine_nozzle_size else 0", "minimum_value_warning": "0", "maximum_value_warning": "machine_nozzle_size", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "alternate_extra_perimeter": { @@ -696,10 +616,7 @@ "description": "Prints an extra wall at every other layer. This way infill gets caught between these extra walls, resulting in stronger prints.", "type": "bool", "default_value": false, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "travel_compensate_overlapping_walls_enabled": { @@ -708,9 +625,6 @@ "type": "bool", "default_value": true, "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "travel_compensate_overlapping_walls_0_enabled": { @@ -719,10 +633,7 @@ "type": "bool", "default_value": true, "value": "travel_compensate_overlapping_walls_enabled", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "travel_compensate_overlapping_walls_x_enabled": { "label": "Compensate Inner Wall Overlaps", @@ -730,10 +641,7 @@ "type": "bool", "default_value": true, "value": "travel_compensate_overlapping_walls_enabled", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -746,10 +654,7 @@ "minimum_value_warning": "-10", "maximum_value_warning": "10", "default_value": 0, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "z_seam_type": { @@ -763,10 +668,7 @@ "random": "Random" }, "default_value": "shortest", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "skin_no_small_gaps_heuristic": { @@ -774,10 +676,7 @@ "description": "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting.", "type": "bool", "default_value": true, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -799,9 +698,6 @@ "minimum_value": "0", "maximum_value_warning": "100", "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "infill_line_distance": @@ -813,10 +709,7 @@ "default_value": 2, "minimum_value": "0", "value": "0 if infill_sparse_density == 0 else (infill_line_width * 100) / infill_sparse_density * (2 if infill_pattern == \"grid\" else (3 if infill_pattern == \"triangles\" else 1))", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -835,10 +728,7 @@ }, "default_value": "grid", "value": "'lines' if infill_sparse_density > 25 else 'grid'", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "infill_overlap": { @@ -852,9 +742,6 @@ "maximum_value_warning": "100", "enabled": "infill_pattern != 'concentric'", "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "infill_overlap_mm": @@ -868,10 +755,7 @@ "maximum_value_warning": "machine_nozzle_size", "value": "infill_line_width * infill_overlap / 100 if infill_sparse_density < 95 and infill_pattern != 'concentric' else 0", "enabled": "infill_pattern != 'concentric'", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -886,9 +770,6 @@ "value": "5 if top_bottom_pattern != 'concentric' else 0", "enabled": "top_bottom_pattern != 'concentric'", "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "skin_overlap_mm": { "label": "Skin Overlap", @@ -900,10 +781,7 @@ "maximum_value_warning": "machine_nozzle_size", "value": "skin_line_width * skin_overlap / 100 if top_bottom_pattern != 'concentric' else 0", "enabled": "top_bottom_pattern != 'concentric'", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -917,10 +795,7 @@ "value": "wall_line_width_0 / 4 if wall_line_count == 1 else wall_line_width_x / 4", "minimum_value_warning": "0", "maximum_value_warning": "machine_nozzle_size", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "infill_sparse_thickness": { @@ -933,10 +808,7 @@ "maximum_value_warning": "0.32", "maximum_value": "layer_height * 8", "value": "layer_height", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "infill_before_walls": { @@ -944,10 +816,7 @@ "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": "bool", "default_value": true, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -967,9 +836,7 @@ "default_value": false, "enabled": "False", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "material_print_temperature": { @@ -982,9 +849,7 @@ "maximum_value_warning": "260", "enabled": "not (material_flow_dependent_temperature)", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "material_flow_temp_graph": { @@ -996,9 +861,7 @@ "enabled": "False", "comments": "old enabled function: material_flow_dependent_temperature", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "material_extrusion_cool_down_speed": { "label": "Extrusion Cool Down Speed Modifier", @@ -1011,9 +874,7 @@ "enabled": "False", "comments": "old enabled function: material_flow_dependent_temperature or machine_extruder_count > 1", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "material_bed_temperature": { "label": "Bed Temperature", @@ -1026,8 +887,7 @@ "enabled": "machine_heated_bed", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "material_diameter": { "label": "Diameter", @@ -1039,9 +899,7 @@ "minimum_value_warning": "0.4", "maximum_value_warning": "3.5", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "material_flow": { "label": "Flow", @@ -1052,20 +910,14 @@ "minimum_value": "5", "minimum_value_warning": "50", "maximum_value_warning": "150", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "retraction_enable": { "label": "Enable Retraction", "description": "Retract the filament when the nozzle is moving over a non-printed area. ", "type": "bool", "default_value": true, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "retraction_amount": { "label": "Retraction Distance", @@ -1076,10 +928,7 @@ "minimum_value_warning": "-0.0001", "maximum_value_warning": "10.0", "enabled": "retraction_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "retraction_speed": { "label": "Retraction Speed", @@ -1092,9 +941,6 @@ "maximum_value_warning": "100", "enabled": "retraction_enable", "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "retraction_retract_speed": { "label": "Retraction Retract Speed", @@ -1107,10 +953,7 @@ "maximum_value_warning": "100", "enabled": "retraction_enable", "value": "retraction_speed", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "retraction_prime_speed": { "label": "Retraction Prime Speed", @@ -1123,10 +966,7 @@ "maximum_value_warning": "100", "enabled": "retraction_enable", "value": "retraction_speed", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -1139,10 +979,7 @@ "minimum_value_warning": "-0.0001", "maximum_value_warning": "5.0", "enabled": "retraction_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "retraction_min_travel": { "label": "Retraction Minimum Travel", @@ -1154,10 +991,7 @@ "minimum_value": "0", "maximum_value_warning": "10", "enabled": "retraction_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "retraction_count_max": { "label": "Maximum Retraction Count", @@ -1167,10 +1001,7 @@ "maximum_value_warning": "100", "type": "int", "enabled": "retraction_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "retraction_extrusion_window": { "label": "Minimum Extrusion Distance Window", @@ -1182,10 +1013,7 @@ "maximum_value_warning": "retraction_amount * 2", "value": "retraction_amount", "enabled": "retraction_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "retraction_hop": { "label": "Z Hop when Retracting", @@ -1196,10 +1024,7 @@ "minimum_value_warning": "-0.0001", "maximum_value_warning": "10", "enabled": "retraction_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "material_standby_temperature": { @@ -1211,9 +1036,7 @@ "minimum_value": "0", "maximum_value_warning": "260", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "switch_extruder_retraction_amount": { @@ -1227,9 +1050,7 @@ "minimum_value_warning": "0", "maximum_value_warning": "100", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "switch_extruder_retraction_speeds": { @@ -1243,8 +1064,6 @@ "maximum_value_warning": "300", "settable_per_mesh": false, "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "switch_extruder_retraction_speed": @@ -1259,9 +1078,7 @@ "minimum_value": "0.1", "maximum_value_warning": "300", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "switch_extruder_prime_speed": { @@ -1275,9 +1092,7 @@ "minimum_value": "0.1", "maximum_value_warning": "300", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true } } }, @@ -1292,9 +1107,7 @@ "maximum_value_warning": "10", "enabled": "retraction_enable", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true } } }, @@ -1317,9 +1130,6 @@ "maximum_value": "299792458000", "default_value": 60, "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "speed_infill": @@ -1333,10 +1143,7 @@ "maximum_value_warning": "150", "default_value": 60, "value": "speed_print", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "speed_wall": { @@ -1350,9 +1157,6 @@ "default_value": 30, "value": "speed_print / 2", "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "speed_wall_0": @@ -1366,10 +1170,7 @@ "maximum_value_warning": "150", "default_value": 30, "value": "speed_wall", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "speed_wall_x": { @@ -1382,10 +1183,7 @@ "maximum_value_warning": "150", "default_value": 60, "value": "speed_wall * 2", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -1400,10 +1198,7 @@ "maximum_value_warning": "150", "default_value": 30, "value": "speed_print / 2", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "speed_support": { @@ -1419,8 +1214,6 @@ "enabled": "support_roof_enable", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "speed_support_infill": @@ -1436,9 +1229,7 @@ "value": "speed_support", "enabled": "support_enable", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "speed_support_roof": { @@ -1453,9 +1244,7 @@ "enabled": "support_roof_enable and support_enable", "value": "speed_support / 1.5", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false } } }, @@ -1471,9 +1260,7 @@ "minimum_value": "0.1", "maximum_value_warning": "150", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true } } }, @@ -1489,9 +1276,7 @@ "maximum_value_warning": "300", "value": "speed_print if magic_spiralize else 120", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "speed_layer_0": { "label": "Initial Layer Speed", @@ -1502,10 +1287,7 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "300", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "skirt_speed": { "label": "Skirt Speed", @@ -1518,9 +1300,7 @@ "maximum_value_warning": "300", "value": "speed_layer_0", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "speed_slowdown_layers": { @@ -1532,9 +1312,7 @@ "maximum_value": "299792458000", "maximum_value_warning": "300", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false } } }, @@ -1558,10 +1336,7 @@ "noskin": "No Skin" }, "default_value": "all", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "travel_avoid_other_parts": { @@ -1571,9 +1346,7 @@ "default_value": true, "enabled": "retraction_combing != \"off\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "travel_avoid_distance": { @@ -1587,9 +1360,7 @@ "maximum_value_warning": "machine_nozzle_tip_outer_diameter * 5", "enabled": "retraction_combing != \"off\" and travel_avoid_other_parts", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true } } }, @@ -1608,9 +1379,7 @@ "type": "bool", "default_value": true, "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "cool_fan_speed": { @@ -1625,8 +1394,6 @@ "enabled": "cool_fan_enabled", "settable_per_mesh": false, "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "cool_fan_speed_min": @@ -1641,9 +1408,7 @@ "default_value": 100, "enabled": "cool_fan_enabled", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "cool_fan_speed_max": { @@ -1657,9 +1422,7 @@ "enabled": "cool_fan_enabled", "value": "cool_fan_speed", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true } } }, @@ -1673,9 +1436,7 @@ "minimum_value": "cool_min_layer_time", "maximum_value_warning": "600", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "cool_fan_full_at_height": { @@ -1689,8 +1450,6 @@ "maximum_value_warning": "10.0", "settable_per_mesh": false, "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "cool_fan_full_layer": @@ -1703,9 +1462,7 @@ "maximum_value_warning": "100", "value": "max(0, int(round((cool_fan_full_at_height - layer_height_0) / layer_height, 0)))", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true } } }, @@ -1719,9 +1476,7 @@ "minimum_value": "0", "maximum_value_warning": "600", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "cool_min_speed": { @@ -1733,9 +1488,7 @@ "minimum_value": "0", "maximum_value_warning": "100", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "cool_lift_head": { @@ -1744,9 +1497,7 @@ "type": "bool", "default_value": false, "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true } } }, @@ -1764,10 +1515,7 @@ "description": "Enable support structures. These structures support parts of the model with severe overhangs.", "type": "bool", "default_value": false, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_type": { @@ -1782,9 +1530,7 @@ "default_value": "everywhere", "enabled": "support_enable", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "support_angle": { @@ -1796,10 +1542,7 @@ "maximum_value": "90", "default_value": 50, "enabled": "support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_pattern": { @@ -1817,9 +1560,7 @@ "default_value": "zigzag", "enabled": "support_enable", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "support_connect_zigzags": { @@ -1829,9 +1570,7 @@ "default_value": true, "enabled": "support_enable and (support_pattern == \"zigzag\")", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "support_infill_rate": { @@ -1845,8 +1584,6 @@ "enabled": "support_enable", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "support_line_distance": { @@ -1859,9 +1596,7 @@ "enabled": "support_enable", "value": "(support_line_width * 100) / support_infill_rate * (2 if support_pattern == \"grid\" else (3 if support_pattern == \"triangles\" else 1))", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false } } }, @@ -1876,9 +1611,6 @@ "default_value": 0.15, "enabled": "support_enable", "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "support_top_distance": @@ -1892,10 +1624,7 @@ "type": "float", "enabled": "support_enable", "value": "support_z_distance", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_bottom_distance": { @@ -1908,10 +1637,7 @@ "value": "0.1 if support_type == 'everywhere' else 0", "type": "float", "enabled": "support_enable and support_type == 'everywhere'", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -1925,10 +1651,7 @@ "maximum_value_warning": "10", "default_value": 0.7, "enabled": "support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_xy_overrides_z": { "label": "Support Distance Priority", @@ -1940,10 +1663,7 @@ }, "default_value": "z_overrides_xy", "enabled": "support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_xy_distance_overhang": { "label": "Minimum Support X/Y Distance", @@ -1955,10 +1675,7 @@ "default_value": 0.2, "value": "machine_nozzle_size / 2", "enabled": "support_enable and support_xy_overrides_z=='z_overrides_xy'", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_bottom_stair_step_height": { @@ -1970,10 +1687,7 @@ "minimum_value": "0", "maximum_value_warning": "1.0", "enabled": "support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_join_distance": { @@ -1985,10 +1699,7 @@ "minimum_value_warning": "0", "maximum_value_warning": "10", "enabled": "support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_offset": { @@ -2000,10 +1711,7 @@ "minimum_value_warning": "-0.5", "maximum_value_warning": "5.0", "enabled": "support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_area_smoothing": { @@ -2015,10 +1723,7 @@ "minimum_value": "0", "maximum_value_warning": "1.0", "enabled": "support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_roof_enable": { @@ -2027,10 +1732,7 @@ "type": "bool", "default_value": false, "enabled": "support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_roof_height": { @@ -2042,10 +1744,7 @@ "minimum_value": "0", "maximum_value_warning": "10", "enabled": "support_roof_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_roof_density": { @@ -2059,8 +1758,6 @@ "enabled":"support_roof_enable", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "support_roof_line_distance": @@ -2074,9 +1771,7 @@ "value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_roof_pattern == \"grid\" else (3 if support_roof_pattern == \"triangles\" else 1))", "enabled": "support_roof_enable", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false } } }, @@ -2096,9 +1791,7 @@ "default_value": "concentric", "enabled": "support_roof_enable", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "support_use_towers": { @@ -2107,10 +1800,7 @@ "type": "bool", "default_value": true, "enabled": "support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_tower_diameter": { @@ -2122,10 +1812,7 @@ "minimum_value": "0", "maximum_value_warning": "10", "enabled": "support_enable and support_use_towers", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_minimal_diameter": { @@ -2138,10 +1825,7 @@ "maximum_value_warning": "10", "maximum_value": "support_tower_diameter", "enabled": "support_enable and support_use_towers", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_tower_roof_angle": { @@ -2153,10 +1837,7 @@ "maximum_value": "90", "default_value": 65, "enabled": "support_enable and support_use_towers", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -2181,9 +1862,7 @@ }, "default_value": "brim", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "skirt_line_count": { @@ -2195,9 +1874,7 @@ "maximum_value_warning": "10", "enabled": "adhesion_type == \"skirt\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "skirt_gap": { @@ -2210,9 +1887,7 @@ "maximum_value_warning": "100", "enabled": "adhesion_type == \"skirt\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "skirt_minimal_length": { @@ -2226,9 +1901,7 @@ "maximum_value_warning": "2500", "enabled": "adhesion_type == \"skirt\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "brim_width": { @@ -2242,8 +1915,6 @@ "enabled": "adhesion_type == \"brim\"", "settable_per_mesh": false, "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "brim_line_count": @@ -2257,9 +1928,7 @@ "value": "math.ceil(brim_width / skirt_line_width)", "enabled": "adhesion_type == \"brim\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true } } }, @@ -2285,9 +1954,7 @@ "maximum_value_warning": "1.0", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "layer_0_z_overlap": { "label": "Initial Layer Z Overlap", @@ -2300,9 +1967,7 @@ "maximum_value_warning": "layer_height", "enabled": "adhesion_type == 'raft'", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_surface_layers": { @@ -2314,9 +1979,7 @@ "maximum_value_warning": "20", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_surface_thickness": { @@ -2329,9 +1992,7 @@ "maximum_value_warning": "2.0", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_surface_line_width": { @@ -2344,9 +2005,7 @@ "maximum_value_warning": "machine_nozzle_size * 2", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_surface_line_spacing": { @@ -2360,9 +2019,7 @@ "enabled": "adhesion_type == \"raft\"", "value": "raft_surface_line_width", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_interface_thickness": { @@ -2375,9 +2032,7 @@ "maximum_value_warning": "5.0", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_interface_line_width": { @@ -2391,9 +2046,7 @@ "maximum_value_warning": "machine_nozzle_size * 2", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_interface_line_spacing": { @@ -2406,9 +2059,7 @@ "maximum_value_warning": "15.0", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_base_thickness": { @@ -2421,9 +2072,7 @@ "maximum_value_warning": "5.0", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_base_line_width": { @@ -2437,9 +2086,7 @@ "maximum_value_warning": "machine_nozzle_size * 2", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_base_line_spacing": { @@ -2452,9 +2099,7 @@ "maximum_value_warning": "100", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_speed": { @@ -2470,8 +2115,6 @@ "value": "speed_print / 60 * 30", "settable_per_mesh": false, "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "raft_surface_speed": @@ -2487,9 +2130,7 @@ "enabled": "adhesion_type == \"raft\"", "value": "raft_speed", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_interface_speed": { @@ -2504,9 +2145,7 @@ "enabled": "adhesion_type == \"raft\"", "value": "0.5 * raft_speed", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_base_speed": { @@ -2521,9 +2160,7 @@ "enabled": "adhesion_type == \"raft\"", "value": "0.5 * raft_speed", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true } } }, @@ -2538,8 +2175,6 @@ "default_value": 0, "settable_per_mesh": false, "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "enabled": "adhesion_type == \"raft\"", "children": { @@ -2555,9 +2190,7 @@ "value": "raft_fan_speed", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_interface_fan_speed": { @@ -2571,9 +2204,7 @@ "value": "raft_fan_speed", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "raft_base_fan_speed": { @@ -2587,9 +2218,7 @@ "value": "raft_fan_speed", "enabled": "adhesion_type == \"raft\"", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true } } } @@ -2609,10 +2238,7 @@ "description": "Ignore the internal geometry arising from overlapping volumes and print the volumes as one. This may cause internal cavities to disappear.", "type": "bool", "default_value": true, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "meshfix_union_all_remove_holes": { @@ -2620,10 +2246,7 @@ "description": "Remove the holes in each layer and keep only the outside shape. This will ignore any invisible internal geometry. However, it also ignores layer holes which can be viewed from above or below.", "type": "bool", "default_value": false, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "meshfix_extensive_stitching": { @@ -2631,10 +2254,7 @@ "description": "Extensive stitching tries to stitch up open holes in the mesh by closing the hole with touching polygons. This option can introduce a lot of processing time.", "type": "bool", "default_value": false, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "meshfix_keep_open_polygons": { @@ -2642,10 +2262,7 @@ "description": "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode.", "type": "bool", "default_value": false, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -2670,8 +2287,7 @@ "default_value": "all_at_once", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "magic_mesh_surface_mode": { @@ -2685,10 +2301,7 @@ "both": "Both" }, "default_value": "normal", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "magic_spiralize": { @@ -2696,10 +2309,7 @@ "description": "Spiralize smooths out the Z move of the outer edge. This will create a steady Z increase over the whole print. This feature turns a solid object into a single walled print with a solid bottom. This feature used to be called Joris in older versions.", "type": "bool", "default_value": false, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -2720,9 +2330,7 @@ "minimum_value": "0", "maximum_value": "machine_extruder_count - 1", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "support_extruder_nr": { @@ -2734,8 +2342,6 @@ "maximum_value": "machine_extruder_count - 1", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "support_infill_extruder_nr": { @@ -2747,9 +2353,7 @@ "minimum_value": "0", "maximum_value": "machine_extruder_count - 1", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "support_extruder_nr_layer_0": { @@ -2761,9 +2365,7 @@ "minimum_value": "0", "maximum_value": "machine_extruder_count - 1", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "support_roof_extruder_nr": { @@ -2775,9 +2377,7 @@ "minimum_value": "0", "maximum_value": "machine_extruder_count - 1", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false } } }, @@ -2788,9 +2388,7 @@ "type": "bool", "default_value": false, "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "prime_tower_size": { @@ -2804,9 +2402,7 @@ "minimum_value": "0", "maximum_value_warning": "20", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "prime_tower_position_x": { @@ -2819,9 +2415,7 @@ "minimum_value_warning": "-1000", "maximum_value_warning": "1000", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "prime_tower_position_y": { @@ -2834,9 +2428,7 @@ "minimum_value_warning": "-1000", "maximum_value_warning": "1000", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "prime_tower_flow": { @@ -2850,9 +2442,7 @@ "minimum_value_warning": "50", "maximum_value_warning": "150", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "prime_tower_wipe_enabled": { @@ -2862,9 +2452,7 @@ "enabled": "prime_tower_enable", "default_value": false, "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "multiple_mesh_overlap": { @@ -2875,10 +2463,7 @@ "default_value": 0.15, "minimum_value": "0", "maximum_value_warning": "1.0", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "ooze_shield_enabled": { @@ -2887,9 +2472,7 @@ "type": "bool", "default_value": false, "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "ooze_shield_angle": { @@ -2902,9 +2485,7 @@ "minimum_value": "0", "maximum_value": "90", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "ooze_shield_dist": { @@ -2917,9 +2498,7 @@ "minimum_value": "0", "maximum_value_warning": "30", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false } } }, @@ -2938,9 +2517,7 @@ "type": "bool", "default_value": false, "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "draft_shield_dist": { @@ -2953,9 +2530,7 @@ "default_value": 10, "enabled": "draft_shield_enabled", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "draft_shield_height_limitation": { @@ -2970,9 +2545,7 @@ "default_value": "full", "enabled": "draft_shield_enabled", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "draft_shield_height": { @@ -2986,9 +2559,7 @@ "value": "9999 if draft_shield_height_limitation == 'full' and draft_shield_enabled else 0.0", "enabled": "draft_shield_height_limitation == \"limited\"", "settable_per_mesh": false, - "settable_per_extruder": false, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": false }, "conical_overhang_enabled": { "label": "Make Overhang Printable", @@ -3013,9 +2584,7 @@ "type": "bool", "default_value": false, "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "coasting_volume": { @@ -3028,9 +2597,7 @@ "maximum_value_warning": "2.0", "enabled": "coasting_enable", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "coasting_min_volume": { @@ -3043,9 +2610,7 @@ "maximum_value_warning": "10.0", "enabled": "coasting_enable", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "coasting_speed": { @@ -3058,9 +2623,7 @@ "maximum_value_warning": "100", "enabled": "coasting_enable", "settable_per_mesh": false, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_extruder": true }, "skin_outline_count": { @@ -3070,10 +2633,7 @@ "minimum_value": "0", "maximum_value_warning": "10", "type": "int", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "skin_alternate_rotation": { @@ -3082,10 +2642,7 @@ "type": "bool", "default_value": false, "enabled": "top_bottom_pattern != \"concentric\"", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_conical_enabled": { @@ -3094,10 +2651,7 @@ "type": "bool", "default_value": false, "enabled": "support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_conical_angle": { @@ -3111,10 +2665,7 @@ "maximum_value": "90", "default_value": 30, "enabled": "support_conical_enabled and support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "support_conical_min_width": { @@ -3127,10 +2678,7 @@ "maximum_value_warning": "100.0", "type": "float", "enabled": "support_conical_enabled and support_enable", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "magic_fuzzy_skin_enabled": { @@ -3138,10 +2686,7 @@ "description": "Randomly jitter while printing the outer wall, so that the surface has a rough and fuzzy look.", "type": "bool", "default_value": false, - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "magic_fuzzy_skin_thickness": { @@ -3153,10 +2698,7 @@ "minimum_value": "0.001", "maximum_value_warning": "wall_line_width_0", "enabled": "magic_fuzzy_skin_enabled", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true }, "magic_fuzzy_skin_point_density": { @@ -3171,9 +2713,6 @@ "maximum_value": "2 / magic_fuzzy_skin_thickness", "enabled": "magic_fuzzy_skin_enabled", "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true, "children": { "magic_fuzzy_skin_point_dist": @@ -3188,10 +2727,7 @@ "maximum_value_warning": "10", "value": "10000 if magic_fuzzy_skin_point_density == 0 else 1 / magic_fuzzy_skin_point_density", "enabled": "magic_fuzzy_skin_enabled", - "settable_per_mesh": true, - "settable_per_extruder": true, - "settable_per_meshgroup": true, - "settable_globally": true + "settable_per_mesh": true } } }, @@ -3203,8 +2739,7 @@ "default_value": false, "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_height": { @@ -3218,8 +2753,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_roof_inset": { @@ -3235,8 +2769,7 @@ "value": "wireframe_height", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_printspeed": { @@ -3252,7 +2785,6 @@ "settable_per_mesh": false, "settable_per_extruder": false, "settable_per_meshgroup": false, - "settable_globally": true, "children": { "wireframe_printspeed_bottom": @@ -3269,8 +2801,7 @@ "value": "wireframe_printspeed", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_printspeed_up": { @@ -3286,8 +2817,7 @@ "value": "wireframe_printspeed", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_printspeed_down": { @@ -3303,8 +2833,7 @@ "value": "wireframe_printspeed", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_printspeed_flat": { @@ -3320,8 +2849,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false } } }, @@ -3338,7 +2866,6 @@ "settable_per_mesh": false, "settable_per_extruder": false, "settable_per_meshgroup": false, - "settable_globally": true, "children": { "wireframe_flow_connection": @@ -3354,8 +2881,7 @@ "value": "wireframe_flow", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_flow_flat": { @@ -3370,8 +2896,7 @@ "value": "wireframe_flow", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false } } }, @@ -3387,8 +2912,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_bottom_delay": { @@ -3402,8 +2926,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_flat_delay": { @@ -3417,8 +2940,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_up_half_speed": { @@ -3432,8 +2954,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_top_jump": { @@ -3447,8 +2968,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_fall_down": { @@ -3462,8 +2982,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_drag_along": { @@ -3477,8 +2996,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_strategy": { @@ -3495,8 +3013,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_straight_before_down": { @@ -3510,8 +3027,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_roof_fall_down": { @@ -3525,8 +3041,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_roof_drag_along": { @@ -3540,8 +3055,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_roof_outer_delay": { @@ -3555,8 +3069,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false }, "wireframe_nozzle_clearance": { @@ -3570,8 +3083,7 @@ "enabled": "wireframe_enabled", "settable_per_mesh": false, "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": true + "settable_per_meshgroup": false } } } From e702fef44b185f51da79112aeedeffcb85cbf0cb Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 8 Jun 2016 22:07:57 +0200 Subject: [PATCH 05/69] Add header to profile settings table --- resources/qml/Preferences/ProfilesPage.qml | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index 97dd2c5d77..3ca8d77461 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -155,7 +155,7 @@ UM.ManagementPage model: Cura.ContainerSettingsModel{ containers: (currentItem.id == Cura.MachineManager.activeQualityId) ? [base.currentItem.id, Cura.MachineManager.activeUserProfileId] : [base.currentItem.id] } delegate: Row { property variant setting: model - spacing: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("default_margin").width/2 Label { text: model.label elide: Text.ElideMiddle @@ -165,7 +165,8 @@ UM.ManagementPage model: setting.values.length Label { text: setting.values[index].toString() - width: scrollView.width / 100 * 10 + width: scrollView.width / 100 * 15 + elide: Text.ElideRight font.strikeout: index < setting.values.length - 1 && setting.values[index + 1] != "" opacity: font.strikeout ? 0.5 : 1 } @@ -174,6 +175,21 @@ UM.ManagementPage text: model.unit } } + header: Row { + visible: currentItem.id == Cura.MachineManager.activeQualityId + spacing: UM.Theme.getSize("default_margin").width + Label { + text: catalog.i18nc("@action:label", "Profile value") + width: scrollView.width / 100 * 55 + horizontalAlignment: Text.AlignRight + font.bold: true + } + Label { + text: catalog.i18nc("@action:label", "Current setting") + visible: currentItem.id == Cura.MachineManager.activeQualityId + font.bold: true + } + } section.property: "category" section.criteria: ViewSection.FullString section.delegate: Label { From b85a8ca404a59e09def6b0e901b7b6374a221308 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 07:54:13 +0200 Subject: [PATCH 06/69] Update ContainerSettingsModel when its containers have property changes CURA-1668 --- cura/ContainerSettingsModel.py | 52 ++++++++++++---------------------- 1 file changed, 18 insertions(+), 34 deletions(-) diff --git a/cura/ContainerSettingsModel.py b/cura/ContainerSettingsModel.py index 23d20cd6e2..1dea88cac3 100644 --- a/cura/ContainerSettingsModel.py +++ b/cura/ContainerSettingsModel.py @@ -22,31 +22,10 @@ class ContainerSettingsModel(ListModel): self._container_ids = [] self._container = None - self._global_container_stack = None - Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) - self._update() - - def _onGlobalContainerChanged(self): - if self._global_container_stack: - self._global_container_stack.containersChanged.disconnect(self._onInstanceContainersChanged) - self._global_container_stack.propertyChanged.disconnect(self._onGlobalPropertyChanged) - - self._global_container_stack = Application.getInstance().getGlobalContainerStack() - - if self._global_container_stack: - Preferences.getInstance().setValue("cura/active_machine", self._global_container_stack.getId()) - self._global_container_stack.containersChanged.connect(self._onInstanceContainersChanged) - self._global_container_stack.propertyChanged.connect(self._onGlobalPropertyChanged) - - self._update() - - def _onGlobalPropertyChanged(self, key, property_name): + def _onPropertyChanged(self, key, property_name): if property_name == "value": self._update() - def _onInstanceContainersChanged(self, container): - self._update() - def _update(self): self.clear() @@ -54,24 +33,17 @@ class ContainerSettingsModel(ListModel): return keys = [] - containers = [] - for container_id in self._container_ids: - container = ContainerRegistry.getInstance().findContainers(id = container_id) - if not container: - return + for container in self._containers: + keys = keys + list(container.getAllKeys()) - keys = keys + list(container[0].getAllKeys()) - containers.append(container[0]) - - keys = list(set(keys)) + keys = list(set(keys)) # remove duplicate keys keys.sort() for key in keys: definition = None category = None values = [] - for container in containers: - + for container in self._containers: instance = container.getInstance(key) if instance: definition = instance.definition @@ -93,9 +65,21 @@ class ContainerSettingsModel(ListModel): "category": category.label }) - ## Set the id of the container which has the settings this model should list. + ## Set the ids of the containers which have the settings this model should list. + # Also makes sure the model updates when the containers have property changes def setContainers(self, container_ids): + for container in self._containers: + container.propertyChanged.disconnect(self._onPropertyChanged) + self._container_ids = container_ids + self._containers = [] + + for container_id in self._container_ids: + containers = ContainerRegistry.getInstance().findContainers(id = container_id) + if containers: + containers[0].propertyChanged.connect(self._onPropertyChanged) + self._containers.append(containers[0]) + self._update() containersChanged = pyqtSignal() From a6dd9e74158e3fad24a2ef0d0740318b8fb0cbf4 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 08:14:06 +0200 Subject: [PATCH 07/69] Fix initialization of ContainerSettingsModel CURA-1668 --- cura/ContainerSettingsModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/ContainerSettingsModel.py b/cura/ContainerSettingsModel.py index 1dea88cac3..83a1f3ccd4 100644 --- a/cura/ContainerSettingsModel.py +++ b/cura/ContainerSettingsModel.py @@ -20,7 +20,7 @@ class ContainerSettingsModel(ListModel): self.addRoleName(self.ValuesRole, "values") self._container_ids = [] - self._container = None + self._containers = [] def _onPropertyChanged(self, key, property_name): if property_name == "value": From ecfd7e599356a6f84ef8a3983fa25f9680f5c91c Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 08:21:18 +0200 Subject: [PATCH 08/69] Move InstanceContainersModel has_settings into metadata to clean up the model CURA-1668 --- resources/qml/Preferences/ProfilesPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index 3ca8d77461..faf72bfc7a 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -128,7 +128,7 @@ UM.ManagementPage Label { id: defaultsMessage - visible: !currentItem.hasSettings + visible: !currentItem.metadata.has_settings text: catalog.i18nc("@action:label", "This profile has no settings and uses the defaults specified by the printer.") wrapMode: Text.WordWrap width: parent.width From a21498c37536fead27f63e91a9adfd94d504e9c1 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 08:29:05 +0200 Subject: [PATCH 09/69] Add weights to generic quality profiles CURA-1278 --- resources/quality/high.inst.cfg | 1 + resources/quality/low.inst.cfg | 1 + resources/quality/normal.inst.cfg | 1 + 3 files changed, 3 insertions(+) diff --git a/resources/quality/high.inst.cfg b/resources/quality/high.inst.cfg index 86df9dab92..b2413bba23 100644 --- a/resources/quality/high.inst.cfg +++ b/resources/quality/high.inst.cfg @@ -5,6 +5,7 @@ definition = fdmprinter [metadata] type = quality +weight = -3 read_only = True [values] diff --git a/resources/quality/low.inst.cfg b/resources/quality/low.inst.cfg index 6cebc46dd5..43ac4ac02d 100644 --- a/resources/quality/low.inst.cfg +++ b/resources/quality/low.inst.cfg @@ -5,6 +5,7 @@ definition = fdmprinter [metadata] type = quality +weight = -1 read_only = True [values] diff --git a/resources/quality/normal.inst.cfg b/resources/quality/normal.inst.cfg index b12603f921..df9448097b 100644 --- a/resources/quality/normal.inst.cfg +++ b/resources/quality/normal.inst.cfg @@ -5,6 +5,7 @@ definition = fdmprinter [metadata] type = quality +weight = -2 read_only = True [values] From a070684ade3e89f6dbb18e2ba5d7692d07eafb4c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 09:59:06 +0200 Subject: [PATCH 10/69] Fixed minor issue for inheritance button It didn't always reset to correct value. CURA-1278 --- resources/qml/Settings/SettingItem.qml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 0cb1c169df..6095ab10d1 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -185,12 +185,22 @@ Item { // Get the deepest entry of this setting that we can find. TODO: This is a bit naive, in some cases // there might be multiple profiles saying something about the same setting. There is no strategy // how to handle this as of yet. - var last_entry = propertyProvider.stackLevels.slice(-1)[0] + var last_entry = propertyProvider.stackLevels[propertyProvider.stackLevels.length] + + for (var i = 1; i < base.stackLevels.length; i++) + { + var has_setting_function = typeof(propertyProvider.getPropertyValue("value", base.stackLevels[i])) == "object"; + if(has_setting_function) + { + last_entry = propertyProvider.stackLevels[i] + break; + } + } // Put that entry into the "top" instance container. // This ensures that the value in any of the deeper containers need not be removed, which is // needed for the reset button (which deletes the top value) to correctly go back to profile // defaults. - if(last_entry == 4 && base.stackLevel == 0) + if(last_entry == 4 && base.stackLevel == 0 && base.stackLevels.length == 2) { // Special case of the inherit reset. If only the definition (4th container) and the first // entry (user container) are set, we can simply remove the container. From e4e307cd2a08f8024ebc4237857b41317be08578 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 10:25:01 +0200 Subject: [PATCH 11/69] Inheritance button now works if instance containers contain functions CURA-1686 --- resources/qml/Settings/SettingItem.qml | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 6095ab10d1..4fd84759fd 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -174,7 +174,7 @@ Item { break; } } - return state && base.showInheritButton && has_setting_function + return state && base.showInheritButton && has_setting_function && typeof(propertyProvider.getPropertyValue("value", base.stackLevels[0])) != "object" } height: parent.height; @@ -182,11 +182,9 @@ Item { onClicked: { focus = true; - // Get the deepest entry of this setting that we can find. TODO: This is a bit naive, in some cases - // there might be multiple profiles saying something about the same setting. There is no strategy - // how to handle this as of yet. - var last_entry = propertyProvider.stackLevels[propertyProvider.stackLevels.length] + // Get the most shallow function value (eg not a number) that we can find. + var last_entry = propertyProvider.stackLevels[propertyProvider.stackLevels.length] for (var i = 1; i < base.stackLevels.length; i++) { var has_setting_function = typeof(propertyProvider.getPropertyValue("value", base.stackLevels[i])) == "object"; @@ -196,18 +194,25 @@ Item { break; } } - // Put that entry into the "top" instance container. - // This ensures that the value in any of the deeper containers need not be removed, which is - // needed for the reset button (which deletes the top value) to correctly go back to profile - // defaults. + if(last_entry == 4 && base.stackLevel == 0 && base.stackLevels.length == 2) { // Special case of the inherit reset. If only the definition (4th container) and the first // entry (user container) are set, we can simply remove the container. propertyProvider.removeFromContainer(0) } + else if(last_entry - 1 == base.stackLevel) + { + // Another special case. The setting that is overriden is only 1 instance container deeper, + // so we can remove it. + propertyProvider.removeFromContainer(0) + } else { + // Put that entry into the "top" instance container. + // This ensures that the value in any of the deeper containers need not be removed, which is + // needed for the reset button (which deletes the top value) to correctly go back to profile + // defaults. propertyProvider.setPropertyValue("value", propertyProvider.getPropertyValue("value", last_entry)) propertyProvider.setPropertyValue("state", "InstanceState.Calculated") } From 20f657af888692f4f8620c974d3781429d2f4c6c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 10:40:28 +0200 Subject: [PATCH 12/69] Updated proto file Objects & global settings are now sent in one message. Also added support for extruder settings CURA-1681 --- plugins/CuraEngineBackend/Cura.proto | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index 0d4975aca4..c51829aeff 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -11,6 +11,8 @@ message ObjectList message Slice { repeated ObjectList object_lists = 1; + SettingList global_settings = 2; + repeated SettingsList extruder_settings = 3; } message Object From 14b9294a3944196eef01401741807e279570969a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 8 Jun 2016 17:02:00 +0200 Subject: [PATCH 13/69] Document setActiveExtruderIndex Contributes to issues CURA-340 and CURA-1278. --- cura/ExtruderManager.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/ExtruderManager.py b/cura/ExtruderManager.py index c8a07a4000..bd0c3956d3 100644 --- a/cura/ExtruderManager.py +++ b/cura/ExtruderManager.py @@ -58,6 +58,9 @@ class ExtruderManager(QObject): cls.__instance = ExtruderManager() return cls.__instance + ## Changes the active extruder by index. + # + # \param index The index of the new active extruder. @pyqtSlot(int) def setActiveExtruderIndex(self, index): self._active_extruder_index = index From 1149a96d70c2ff44167d6c607e95ee4636605ea4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 10:45:20 +0200 Subject: [PATCH 14/69] Fix spelling --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8be258c79e..2bb1f6acff 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1043,7 +1043,7 @@ "speed_wall_0": { "label": "Outer Wall Speed", - "description": "The speed at which the outermost walls are printed. Printing the outer wall at a lower speed improves the final skin quality. However, having a large difference between the inner wall speed and the outer wall speed will effect quality in a negative way.", + "description": "The speed at which the outermost walls are printed. Printing the outer wall at a lower speed improves the final skin quality. However, having a large difference between the inner wall speed and the outer wall speed will affect quality in a negative way.", "unit": "mm/s", "type": "float", "minimum_value": "0.1", From ce9d8b6dd0ea1b6147913dd317a1b8ca6cb8ae97 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 9 Jun 2016 10:48:44 +0200 Subject: [PATCH 15/69] proto file typo fix (CURA-1681 CURA-1682) --- plugins/CuraEngineBackend/Cura.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index c51829aeff..c2b6a142b4 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -12,7 +12,7 @@ message Slice { repeated ObjectList object_lists = 1; SettingList global_settings = 2; - repeated SettingsList extruder_settings = 3; + repeated SettingList extruder_settings = 3; } message Object From 5da366583273b4a9fe1061d1ed1c3f104276f630 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 11:22:33 +0200 Subject: [PATCH 16/69] Fix duplicating the first item on the Profiles page CURA-1585 --- resources/qml/Preferences/ProfilesPage.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index faf72bfc7a..ac57dbba35 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -49,8 +49,7 @@ UM.ManagementPage onActivateObject: Cura.MachineManager.setActiveQuality(currentItem.id) onAddObject: { var selectedContainer; - if (objectList.currentIndex == 0) { - // Current settings + if (objectList.currentItem.id == Cura.MachineManager.activeQualityId) { selectedContainer = Cura.MachineManager.convertUserContainerToQuality(); } else { selectedContainer = Cura.MachineManager.duplicateContainer(base.currentItem.id); From 123c2f5c85148bb74b5e510f5d7cc06d2ba31cc9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 11:33:15 +0200 Subject: [PATCH 17/69] Moved global settings into slice message (as per API changes) CURA-1681 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 4 +--- plugins/CuraEngineBackend/StartSliceJob.py | 8 ++------ 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 9607ba407b..3e22f8f6fb 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -145,8 +145,7 @@ class CuraEngineBackend(Backend): self.slicingStarted.emit() slice_message = self._socket.createMessage("cura.proto.Slice") - settings_message = self._socket.createMessage("cura.proto.SettingList") - self._start_slice_job = StartSliceJob.StartSliceJob(slice_message, settings_message) + self._start_slice_job = StartSliceJob.StartSliceJob(slice_message) self._start_slice_job.start() self._start_slice_job.finished.connect(self._onStartSliceCompleted) @@ -205,7 +204,6 @@ class CuraEngineBackend(Backend): return # Preparation completed, send it to the backend. - self._socket.sendMessage(job.getSettingsMessage()) self._socket.sendMessage(job.getSliceMessage()) ## Listener for when the scene has changed. diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index dee6f2b64c..75bbd4073f 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -37,17 +37,13 @@ class GcodeStartEndFormatter(Formatter): ## Job class that builds up the message of scene data to send to CuraEngine. class StartSliceJob(Job): - def __init__(self, slice_message, settings_message): + def __init__(self, slice_message): super().__init__() self._scene = Application.getInstance().getController().getScene() self._slice_message = slice_message - self._settings_message = settings_message self._is_cancelled = False - def getSettingsMessage(self): - return self._settings_message - def getSliceMessage(self): return self._slice_message @@ -185,7 +181,7 @@ class StartSliceJob(Job): settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode for key, value in settings.items(): #Add all submessages for each individual setting. - setting_message = self._settings_message.addRepeatedMessage("settings") + setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") setting_message.name = key if key == "machine_start_gcode" or key == "machine_end_gcode": #If it's a g-code message, use special formatting. setting_message.value = self._expandGcodeTokens(key, value, settings) From 899e4cc175ff8b78ccea35be29e163805c53ea20 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 11:46:52 +0200 Subject: [PATCH 18/69] Fixed sending of per-object settings to engine CURA-1681 --- plugins/CuraEngineBackend/StartSliceJob.py | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 75bbd4073f..9a3dc3a263 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -189,21 +189,10 @@ class StartSliceJob(Job): setting_message.value = str(value).encode("utf-8") def _handlePerObjectSettings(self, node, message): - profile = node.callDecoration("getProfile") - if profile: - for key, value in profile.getAllSettingValues().items(): + stack = node.callDecoration("getStack") + if stack: + for key in stack.getAllKeys(): setting = message.addRepeatedMessage("settings") setting.name = key - setting.value = str(value).encode() - - Job.yieldThread() - - object_settings = node.callDecoration("getAllSettingValues") - if not object_settings: - return - for key, value in object_settings.items(): - setting = message.addRepeatedMessage("settings") - setting.name = key - setting.value = str(value).encode() - - Job.yieldThread() + setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + Job.yieldThread() \ No newline at end of file From 4bdd5713f19e2d8a7c2c656dec5d2ee24fe6b105 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 11:35:23 +0200 Subject: [PATCH 19/69] Fix extruder number attached to extruders It reads that from position in the extruder definition file. Contributes to issues CURA-1278 and CURA-340. --- cura/ExtrudersModel.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cura/ExtrudersModel.py b/cura/ExtrudersModel.py index 60bd60abab..37487f838c 100644 --- a/cura/ExtrudersModel.py +++ b/cura/ExtrudersModel.py @@ -51,13 +51,18 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): global_container_stack = UM.Application.getInstance().getGlobalContainerStack() if not global_container_stack: return #There is no machine to get the extruders of. - for index, extruder in enumerate(manager.getMachineExtruders(global_container_stack.getBottom())): + for extruder in manager.getMachineExtruders(global_container_stack.getBottom()): material = extruder.findContainer({ "type": "material" }) colour = material.getMetaDataEntry("color_code", default = "#FFFF00") if material else "#FFFF00" + position = extruder.getBottom().getMetaDataEntry("position", default = "0") #Position in the definition. + try: + position = int(position) + except ValueError: #Not a proper int. + position = -1 item = { #Construct an item with only the relevant information. "name": extruder.getName(), "colour": colour, - "index": index + "index": position } self.appendItem(item) self.sort(lambda item: item["index"]) \ No newline at end of file From 6a520cad47c547b896db6dc02c4125e760faff6d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 11:48:21 +0200 Subject: [PATCH 20/69] Change focus upon extruder switch This applies a setting that is currently being typed by the user. Otherwise it would take the currently being typed value along to the next tab, since it can't update a setting value while it is in focus. Contributes to issues CURA-340 and CURA-1278. --- resources/qml/SidebarHeader.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 75f5393d57..60f5af2e73 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -110,8 +110,9 @@ Item checked: base.currentExtruderIndex == index onClicked: { - base.currentExtruderIndex = index - ExtruderManager.setActiveExtruderIndex(index) + extruderSelection.focus = true; //Changing focus applies the currently-being-typed values so it can change the displayed setting values. + base.currentExtruderIndex = index; + ExtruderManager.setActiveExtruderIndex(index); } style: ButtonStyle { From a01b554ee3320a148753417df8ebcaa933a097ce Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 11:56:41 +0200 Subject: [PATCH 21/69] Added extruder to proto message CURA-1681 --- plugins/CuraEngineBackend/Cura.proto | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index c2b6a142b4..aa42ed989a 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -12,7 +12,13 @@ message Slice { repeated ObjectList object_lists = 1; SettingList global_settings = 2; - repeated SettingList extruder_settings = 3; + repeated Extruder extruders = 3; +} + +message Extruder +{ + int32 id = 1; + SettingList settings = 2; } message Object From b6649eab3aef1dbd72058618dfd441d56c65f8a4 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 9 Jun 2016 12:08:10 +0200 Subject: [PATCH 22/69] dox: documented proto file (CURA-1681 CURA-1682) --- plugins/CuraEngineBackend/Cura.proto | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index aa42ed989a..38753fd804 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -5,14 +5,14 @@ package cura.proto; message ObjectList { repeated Object objects = 1; - repeated Setting settings = 2; + repeated Setting settings = 2; // meshgroup settings (for one-at-a-time printing) } message Slice { - repeated ObjectList object_lists = 1; - SettingList global_settings = 2; - repeated Extruder extruders = 3; + repeated ObjectList object_lists = 1; // The meshgroups to be printed one after another + SettingList global_settings = 2; // The global settings used for the whole print job + repeated Extruder extruders = 3; // The settings sent to each extruder object } message Extruder @@ -37,10 +37,10 @@ message Progress message Layer { int32 id = 1; - float height = 2; - float thickness = 3; + float height = 2; // Z position + float thickness = 3; // height of a single layer - repeated Polygon polygons = 4; + repeated Polygon polygons = 4; // layer data } message Polygon { @@ -56,19 +56,19 @@ message Polygon { MoveCombingType = 8; MoveRetractionType = 9; } - Type type = 1; - bytes points = 2; - float line_width = 3; + Type type = 1; // Type of move + bytes points = 2; // The points of the polygon, or two points if only a line segment (Currently only line segments are used) + float line_width = 3; // The width of the line being laid down } message GCodeLayer { bytes data = 2; } -message ObjectPrintTime { +message ObjectPrintTime { // The print time for the whole print and material estimates for the first extruder int64 id = 1; - float time = 2; - float material_amount = 3; + float time = 2; // Total time estimate + float material_amount = 3; // material used in the first extruder } message SettingList { @@ -76,13 +76,13 @@ message SettingList { } message Setting { - string name = 1; + string name = 1; // Internal key to signify a setting - bytes value = 2; + bytes value = 2; // The value of the setting } message GCodePrefix { - bytes data = 2; + bytes data = 2; // Header string to be prenpended before the rest of the gcode sent from the engine } message SlicingFinished { From d93044a338cc2e9603c6a027c2c29d9813935a52 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 13:04:07 +0200 Subject: [PATCH 23/69] Added setting sending per extruder CURA-1681 --- cura/ExtruderManager.py | 13 ++++++------- cura/ExtrudersModel.py | 2 +- plugins/CuraEngineBackend/StartSliceJob.py | 13 +++++++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/cura/ExtruderManager.py b/cura/ExtruderManager.py index c8a07a4000..102f7d7fc0 100644 --- a/cura/ExtruderManager.py +++ b/cura/ExtruderManager.py @@ -187,19 +187,18 @@ class ExtruderManager(QObject): container_registry.addContainer(container_stack) - ## Generates extruders for a specific machine. - def getMachineExtruders(self, machine_definition): + ## Gets extruders for a specific machine. + def getMachineExtruders(self, machine_definition_id): container_registry = UM.Settings.ContainerRegistry.getInstance() - machine_id = machine_definition.getId() - if not machine_id in self._extruder_trains: - UM.Logger.log("w", "Tried to get the extruder trains for machine %s, which doesn't exist.", machine_id) + if not machine_definition_id in self._extruder_trains: + UM.Logger.log("w", "Tried to get the extruder trains for machine %s, which doesn't exist.", machine_definition_id) return - for _,extruder_train_id in self._extruder_trains[machine_id].items(): + for _,extruder_train_id in self._extruder_trains[machine_definition_id].items(): extruder_train = container_registry.findContainerStacks(id = extruder_train_id) if extruder_train: yield extruder_train[0] else: - UM.Logger.log("w", "Machine %s refers to an extruder train with ID %s, which doesn't exist.", machine_id, extruder_train_id) + UM.Logger.log("w", "Machine %s refers to an extruder train with ID %s, which doesn't exist.", machine_definition_id, extruder_train_id) ## Adds the extruders of the currently active machine. def _addCurrentMachineExtruders(self): diff --git a/cura/ExtrudersModel.py b/cura/ExtrudersModel.py index 60bd60abab..1efc86d9c5 100644 --- a/cura/ExtrudersModel.py +++ b/cura/ExtrudersModel.py @@ -51,7 +51,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): global_container_stack = UM.Application.getInstance().getGlobalContainerStack() if not global_container_stack: return #There is no machine to get the extruders of. - for index, extruder in enumerate(manager.getMachineExtruders(global_container_stack.getBottom())): + for index, extruder in enumerate(manager.getMachineExtruders(global_container_stack.getBottom().getId())): material = extruder.findContainer({ "type": "material" }) colour = material.getMetaDataEntry("color_code", default = "#FFFF00") if material else "#FFFF00" item = { #Construct an item with only the relevant information. diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 9a3dc3a263..259750d098 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -15,6 +15,7 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Settings.Validator import ValidatorState from cura.OneAtATimeIterator import OneAtATimeIterator +from cura.ExtruderManager import ExtruderManager class StartJobResult(IntEnum): Finished = 1 @@ -127,6 +128,9 @@ class StartSliceJob(Job): self._buildGlobalSettingsMessage(stack) + for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getBottom().getId()): + self._buildExtruderMessage(extruder_stack) + for group in object_groups: group_message = self._slice_message.addRepeatedMessage("object_lists") if group[0].getParent().callDecoration("isGroup"): @@ -166,6 +170,15 @@ class StartSliceJob(Job): Logger.logException("w", "Unable to do token replacement on start/end gcode") return str(value).encode("utf-8") + def _buildExtruderMessage(self, stack): + message = self._slice_message.addRepeatedMessage("extruders") + message.id = int(stack.getMetaDataEntry("position")) + for key in stack.getAllKeys(): + setting = message.addRepeatedMessage("settings") + setting.name = key + setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + Job.yieldThread() + ## Sends all global settings to the engine. # # The settings are taken from the global stack. This does not include any From cd803bc36ecbf85ea1846c780dd054fb56362b11 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 13:16:23 +0200 Subject: [PATCH 24/69] Determine readonly state from location in filesystem instead of a metadata property CURA-1684 --- cura/MachineManagerModel.py | 6 +++--- resources/qml/Cura.qml | 4 ++-- resources/qml/Preferences/ProfilesPage.qml | 4 ++-- resources/qml/ProfileSetup.qml | 4 ++-- resources/quality/high.inst.cfg | 1 - resources/quality/low.inst.cfg | 1 - resources/quality/normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_abs_0.25_normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_abs_0.4_fast.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_abs_0.4_high.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_abs_0.4_normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_abs_0.6_normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_abs_0.8_normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_cpe_0.25_normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_cpe_0.4_fast.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_cpe_0.4_high.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_cpe_0.4_normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_cpe_0.6_normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_cpe_0.8_normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_pla_0.25_normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_pla_0.4_fast.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_pla_0.4_high.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_pla_0.4_normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_pla_0.6_normal.inst.cfg | 1 - .../ultimaker2_extended_plus/um2ep_pla_0.8_normal.inst.cfg | 1 - resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg | 1 - resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg | 1 - resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg | 1 - resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg | 1 - resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg | 1 - resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg | 1 - .../quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg | 1 - 43 files changed, 9 insertions(+), 48 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index e719c05743..816dbc4600 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -266,7 +266,7 @@ class MachineManagerModel(QObject): containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=container_id) if not containers or not self._global_container_stack: return True - return containers[0].getMetaDataEntry("read_only", False) == "True" + return containers[0].isReadOnly() @pyqtSlot(result = str) def convertUserContainerToQuality(self): @@ -288,7 +288,7 @@ class MachineManagerModel(QObject): ## Change type / id / name new_quality_container.setMetaDataEntry("type", "quality") - new_quality_container.setMetaDataEntry("read_only", False) + new_quality_container.setReadOnly(False) new_quality_container.setName(name) new_quality_container._id = name @@ -310,7 +310,7 @@ class MachineManagerModel(QObject): ## Copy all values new_container.deserialize(containers[0].serialize()) - new_container.setMetaDataEntry("read_only", False) + new_container.setReadOnly(False) new_container.setName(new_name) new_container._id = new_name UM.Settings.ContainerRegistry.getInstance().addContainer(new_container) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 46ebc25369..74f5e8bdd8 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -258,13 +258,13 @@ UM.MainWindow { //Insert a separator between readonly and custom profiles if(separatorIndex < 0 && index > 0) { - if(model.getItem(index-1).metadata.read_only != model.getItem(index).metadata.read_only) { + if(model.getItem(index-1).readOnly != model.getItem(index).readOnly) { profileMenu.insertSeparator(index); separatorIndex = index; } } //Because of the separator, custom profiles move one index lower - profileMenu.insertItem((model.getItem(index).metadata.read_only) ? index : index + 1, object.item); + profileMenu.insertItem((model.getItem(index).readOnly) ? index : index + 1, object.item); } onObjectRemoved: { diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index ac57dbba35..a5992a3f8c 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -65,8 +65,8 @@ UM.ManagementPage activateEnabled: currentItem != null ? currentItem.id != Cura.MachineManager.activeQualityId : false; addEnabled: currentItem != null; - removeEnabled: currentItem != null ? !currentItem.metadata.read_only : false; - renameEnabled: currentItem != null ? !currentItem.metadata.read_only : false; + removeEnabled: currentItem != null ? !currentItem.readOnly : false; + renameEnabled: currentItem != null ? !currentItem.readOnly : false; scrollviewCaption: catalog.i18nc("@label %1 is printer name","Printer: %1").arg(Cura.MachineManager.activeMachineName) diff --git a/resources/qml/ProfileSetup.qml b/resources/qml/ProfileSetup.qml index 48d52c539a..a168d87ff1 100644 --- a/resources/qml/ProfileSetup.qml +++ b/resources/qml/ProfileSetup.qml @@ -88,13 +88,13 @@ Item{ { //Insert a separator between readonly and custom profiles if(separatorIndex < 0 && index > 0) { - if(model.getItem(index-1).metadata.read_only != model.getItem(index).metadata.read_only) { + if(model.getItem(index-1).readOnly != model.getItem(index).readOnly) { profileSelectionMenu.insertSeparator(index); separatorIndex = index; } } //Because of the separator, custom profiles move one index lower - profileSelectionMenu.insertItem((model.getItem(index).metadata.read_only) ? index : index + 1, object.item); + profileSelectionMenu.insertItem((model.getItem(index).readOnly) ? index : index + 1, object.item); } onObjectRemoved: { diff --git a/resources/quality/high.inst.cfg b/resources/quality/high.inst.cfg index b2413bba23..b4498c6c8b 100644 --- a/resources/quality/high.inst.cfg +++ b/resources/quality/high.inst.cfg @@ -6,7 +6,6 @@ definition = fdmprinter [metadata] type = quality weight = -3 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/low.inst.cfg b/resources/quality/low.inst.cfg index 43ac4ac02d..d34a7c6461 100644 --- a/resources/quality/low.inst.cfg +++ b/resources/quality/low.inst.cfg @@ -6,7 +6,6 @@ definition = fdmprinter [metadata] type = quality weight = -1 -read_only = True [values] infill_sparse_density = 10 diff --git a/resources/quality/normal.inst.cfg b/resources/quality/normal.inst.cfg index df9448097b..417c7c700f 100644 --- a/resources/quality/normal.inst.cfg +++ b/resources/quality/normal.inst.cfg @@ -6,6 +6,5 @@ definition = fdmprinter [metadata] type = quality weight = -2 -read_only = True [values] diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.25_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.25_normal.inst.cfg index 07d3fae601..11b926378d 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.25_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_abs_ultimaker2_extended_plus_0.25_mm weight = -2 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_fast.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_fast.inst.cfg index 139c8cb976..bdeeb935f4 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_fast.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_abs_ultimaker2_extended_plus_0.4_mm weight = -1 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_high.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_high.inst.cfg index 8d021f4d91..d658ee5bb5 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_high.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_abs_ultimaker2_extended_plus_0.4_mm weight = -3 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_normal.inst.cfg index 3f89bdeee6..ff024ccc69 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_abs_ultimaker2_extended_plus_0.4_mm weight = -2 -read_only = True [values] layer_height = 0.1 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.6_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.6_normal.inst.cfg index ea67bcc0b2..c2f4daa86f 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.6_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_abs_ultimaker2_extended_plus_0.6_mm weight = -2 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.8_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.8_normal.inst.cfg index 8857db6cc1..362e844214 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.8_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_abs_ultimaker2_extended_plus_0.8_mm weight = -2 -read_only = True [values] layer_height = 0.2 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.25_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.25_normal.inst.cfg index d34ea88798..f4d9264d3e 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.25_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_cpe_ultimaker2_extended_plus_0.25_mm weight = -2 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_fast.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_fast.inst.cfg index 5f402d50aa..f514f22294 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_fast.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_cpe_ultimaker2_extended_plus_0.4_mm weight = -1 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_high.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_high.inst.cfg index 2b35097f66..0c68be2f5f 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_high.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_cpe_ultimaker2_extended_plus_0.4_mm weight = -3 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_normal.inst.cfg index 41e9fab6d3..26ea8ce9bc 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_cpe_ultimaker2_extended_plus_0.4_mm weight = -2 -read_only = True [values] layer_height = 0.1 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.6_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.6_normal.inst.cfg index 675c949364..d6d10dbe1a 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.6_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_cpe_ultimaker2_extended_plus_0.6_mm weight = -2 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.8_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.8_normal.inst.cfg index b631baea42..53d5e0bc8c 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.8_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_cpe_ultimaker2_extended_plus_0.8_mm weight = -2 -read_only = True [values] layer_height = 0.2 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.25_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.25_normal.inst.cfg index 142ee42b71..5e54b3194a 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.25_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_pla_ultimaker2_extended_plus_0.25_mm weight = -2 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_fast.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_fast.inst.cfg index 8fd8fedf4c..893256bb33 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_fast.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_pla_ultimaker2_extended_plus_0.4_mm weight = -1 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_high.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_high.inst.cfg index 3fc5cb39a0..844e2b3eac 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_high.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_pla_ultimaker2_extended_plus_0.4_mm weight = -3 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_normal.inst.cfg index 94816b233c..47d511446a 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus type = quality material = generic_pla_ultimaker2_extended_plus_0.4_mm weight = -2 -read_only = True [values] layer_height = 0.1 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.6_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.6_normal.inst.cfg index 2de9b6a482..a2b15b6f16 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.6_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus material = generic_pla_ultimaker2_extended_plus_0.6_mm type = quality weight = -2 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.8_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.8_normal.inst.cfg index f3a1a14f73..08b5bec667 100644 --- a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.8_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_extended_plus material = generic_pla_ultimaker2_extended_plus_0.8_mm type = quality weight = -2 -read_only = True [values] layer_height = 0.2 diff --git a/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg index 7a1da403ff..9a44582610 100644 --- a/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_pla_ultimaker2_plus_0.25_mm weight = -2 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg index 48fa105f80..0df882e418 100644 --- a/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_pla_ultimaker2_plus_0.4_mm weight = -1 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg index 8024ebe8d9..a8abdb081f 100644 --- a/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_pla_ultimaker2_plus_0.4_mm weight = -3 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg index 5205a4d057..c29b017bbe 100644 --- a/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_pla_ultimaker2_plus_0.4_mm weight = -2 -read_only = True [values] layer_height = 0.1 diff --git a/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg index db3e208c8d..5a0a840ae7 100644 --- a/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus material = generic_pla_ultimaker2_plus_0.6_mm type = quality weight = -2 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg index 4a52e0ff2c..bd90b8c059 100644 --- a/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus material = generic_pla_ultimaker2_plus_0.8_mm type = quality weight = -2 -read_only = True [values] layer_height = 0.2 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg index 0b7a371ff1..05a9bce71c 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_abs_ultimaker2_plus_0.25_mm weight = -2 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg index 71f93ffe6f..cd0a25981a 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_abs_ultimaker2_plus_0.4_mm weight = -1 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg index 3ceb8ce198..4b1ece31ef 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_abs_ultimaker2_plus_0.4_mm weight = -3 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg index 762ad08eca..f1b01fd408 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_abs_ultimaker2_plus_0.4_mm weight = -2 -read_only = True [values] layer_height = 0.1 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg index ea88fe3616..89e73dda38 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_abs_ultimaker2_plus_0.6_mm weight = -2 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg index d5b9557ebb..2171fd3837 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_abs_ultimaker2_plus_0.8_mm weight = -2 -read_only = True [values] layer_height = 0.2 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg index eaab2ff2b6..6a300ba27d 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_cpe_ultimaker2_plus_0.25_mm weight = -2 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg index 25e96fd948..e76c5205f5 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_cpe_ultimaker2_plus_0.4_mm weight = -1 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg index 6680d78195..60f171dc17 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_cpe_ultimaker2_plus_0.4_mm weight = -3 -read_only = True [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg index acaedff20a..04116dbe21 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_cpe_ultimaker2_plus_0.4_mm weight = -2 -read_only = True [values] layer_height = 0.1 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg index f19032a95e..35e666e6d9 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_cpe_ultimaker2_plus_0.6_mm weight = -2 -read_only = True [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg index 45372fdf39..c36d1714a0 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg @@ -7,7 +7,6 @@ definition = ultimaker2_plus type = quality material = generic_cpe_ultimaker2_plus_0.8_mm weight = -2 -read_only = True [values] layer_height = 0.2 From 3df1bc4e62c302721d89974838104c948cea6a0e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 13:23:09 +0200 Subject: [PATCH 25/69] Fixed minor issue in buildExtruderMessage CURA-1681 --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 259750d098..3d2eb0ed4a 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -174,7 +174,7 @@ class StartSliceJob(Job): message = self._slice_message.addRepeatedMessage("extruders") message.id = int(stack.getMetaDataEntry("position")) for key in stack.getAllKeys(): - setting = message.addRepeatedMessage("settings") + setting = message.getMessage("settings").addRepeatedMessage("settings") setting.name = key setting.value = str(stack.getProperty(key, "value")).encode("utf-8") Job.yieldThread() From 8729dce531e4b2f8ba655ff03491e2339e4fc9ab Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 9 Jun 2016 13:30:17 +0200 Subject: [PATCH 26/69] Store the actual extruder stack in ExtruderManager instead of just the ID Contributes to CURA-340 --- cura/ExtruderManager.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/cura/ExtruderManager.py b/cura/ExtruderManager.py index c8a07a4000..5c695de1f1 100644 --- a/cura/ExtruderManager.py +++ b/cura/ExtruderManager.py @@ -36,7 +36,7 @@ class ExtruderManager(QObject): if not UM.Application.getInstance().getGlobalContainerStack(): return None #No active machine, so no active extruder. try: - return self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getBottom().getId()][str(self._active_extruder_index)] + return self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getBottom().getId()][str(self._active_extruder_index)].getId() except KeyError: #Extruder index could be -1 if the global tab is selected, or the entry doesn't exist if the machine definition is wrong. return None @@ -87,7 +87,7 @@ class ExtruderManager(QObject): #Gets the extruder trains that we just created as well as any that still existed. extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_definition.getId()) for extruder_train in extruder_trains: - self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train.getId() + self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train if extruder_trains: self.extrudersChanged.emit(machine_definition) @@ -194,15 +194,11 @@ class ExtruderManager(QObject): if not machine_id in self._extruder_trains: UM.Logger.log("w", "Tried to get the extruder trains for machine %s, which doesn't exist.", machine_id) return - for _,extruder_train_id in self._extruder_trains[machine_id].items(): - extruder_train = container_registry.findContainerStacks(id = extruder_train_id) - if extruder_train: - yield extruder_train[0] - else: - UM.Logger.log("w", "Machine %s refers to an extruder train with ID %s, which doesn't exist.", machine_id, extruder_train_id) + for name in self._extruder_trains[machine_id]: + yield self._extruder_trains[machine_id][name] ## Adds the extruders of the currently active machine. def _addCurrentMachineExtruders(self): global_stack = UM.Application.getInstance().getGlobalContainerStack() if global_stack and global_stack.getBottom(): - self.addMachineExtruders(global_stack.getBottom()) \ No newline at end of file + self.addMachineExtruders(global_stack.getBottom()) From 8f4f67d552f2b6993137e9429c4ea53f2949bc78 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 13:41:33 +0200 Subject: [PATCH 27/69] Show "Protected profiles" / "Custom profiles" section on profiles page CURA-855 --- resources/qml/Preferences/ProfilesPage.qml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index a5992a3f8c..2030ced505 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -36,6 +36,22 @@ UM.ManagementPage } } + section.property: "readOnly" + section.delegate: Rectangle + { + width: objectListContainer.viewport.width; + height: childrenRect.height; + color: palette.light + + Label + { + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.getSize("default_lining").width; + text: section == "true" ? catalog.i18nc("@label", "Protected profiles") : catalog.i18nc("@label", "Custom profiles") + font.bold: true + } + } + activeId: Cura.MachineManager.activeQualityId activeIndex: { for(var i = 0; i < model.rowCount(); i++) { From d57e2b2e225fbe851cc0e26d166078df6ae417c3 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 9 Jun 2016 13:46:39 +0200 Subject: [PATCH 28/69] Add an ID role and addGlobal property to ExtrudersModel Contributes to CURA-340 --- cura/ExtrudersModel.py | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/cura/ExtrudersModel.py b/cura/ExtrudersModel.py index 37487f838c..3265667dc6 100644 --- a/cura/ExtrudersModel.py +++ b/cura/ExtrudersModel.py @@ -1,7 +1,7 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -from PyQt5.QtCore import Qt +from PyQt5.QtCore import Qt, pyqtSignal, pyqtProperty import cura.ExtruderManager import UM.Qt.ListModel @@ -12,18 +12,21 @@ import UM.Qt.ListModel # intended for drop-down lists of the current machine's extruders in place of # settings. class ExtrudersModel(UM.Qt.ListModel.ListModel): + # The ID of the container stack for the extruder. + IdRole = Qt.UserRole + 1 + ## Human-readable name of the extruder. - NameRole = Qt.UserRole + 1 + NameRole = Qt.UserRole + 2 ## Colour of the material loaded in the extruder. - ColourRole = Qt.UserRole + 2 + ColourRole = Qt.UserRole + 3 ## Index of the extruder, which is also the value of the setting itself. # # An index of 0 indicates the first extruder, an index of 1 the second # one, and so on. This is the value that will be saved in instance # containers. - IndexRole = Qt.UserRole + 3 + IndexRole = Qt.UserRole + 4 ## Initialises the extruders model, defining the roles and listening for # changes in the data. @@ -32,16 +35,30 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): def __init__(self, parent = None): super().__init__(parent) + self.addRoleName(self.IdRole, "id") self.addRoleName(self.NameRole, "name") self.addRoleName(self.ColourRole, "colour") self.addRoleName(self.IndexRole, "index") + self._add_global = False + #Listen to changes. manager = cura.ExtruderManager.ExtruderManager.getInstance() manager.extrudersChanged.connect(self._updateExtruders) #When the list of extruders changes in general. UM.Application.globalContainerStackChanged.connect(self._updateExtruders) #When the current machine changes. self._updateExtruders() + def setAddGlobal(self, add): + if add != self._add_global: + self._add_global = add + self._updateExtruders() + self.addGlobalChanged.emit() + + addGlobalChanged = pyqtSignal() + @pyqtProperty(bool, fset = setAddGlobal, notify = addGlobalChanged) + def addGlobal(self): + return self._add_global + ## Update the list of extruders. # # This should be called whenever the list of extruders changes. @@ -51,6 +68,18 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): global_container_stack = UM.Application.getInstance().getGlobalContainerStack() if not global_container_stack: return #There is no machine to get the extruders of. + + if self._add_global: + material = global_container_stack.findContainer({ "type": "material" }) + colour = material.getMetaDataEntry("color_code", default = "#FFFF00") if material else "#FFFF00" + item = { + "id": global_container_stack.getId(), + "name": "Global", + "colour": colour, + "index": -1 + } + self.appendItem(item) + for extruder in manager.getMachineExtruders(global_container_stack.getBottom()): material = extruder.findContainer({ "type": "material" }) colour = material.getMetaDataEntry("color_code", default = "#FFFF00") if material else "#FFFF00" @@ -60,9 +89,11 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): except ValueError: #Not a proper int. position = -1 item = { #Construct an item with only the relevant information. + "id": extruder.getId(), "name": extruder.getName(), "colour": colour, "index": position } self.appendItem(item) - self.sort(lambda item: item["index"]) \ No newline at end of file + + self.sort(lambda item: item["index"]) From c03588c6e576f3e164f5b28baf848b8072e2e78c Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Wed, 8 Jun 2016 14:40:10 +0200 Subject: [PATCH 29/69] Profile export now goes via the plugin system, and does the same filename checks as before. Contributed to CURA-1667 Profile import/export --- cura/CuraApplication.py | 4 ++++ plugins/CuraProfileReader/CuraProfileReader.py | 1 - plugins/CuraProfileReader/__init__.py | 2 +- plugins/CuraProfileWriter/CuraProfileWriter.py | 4 ++-- plugins/CuraProfileWriter/__init__.py | 2 +- resources/qml/Preferences/ProfilesPage.qml | 2 +- 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a2415478a4..12828971cd 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -294,6 +294,7 @@ class CuraApplication(QtApplication): # \sa PluginRegistery def _loadPlugins(self): self._plugin_registry.addType("profile_reader", self._addProfileReader) + self._plugin_registry.addType("profile_writer", self._addProfileWriter) self._plugin_registry.addPluginLocation(os.path.join(QtApplication.getInstallPrefix(), "lib", "cura")) if not hasattr(sys, "frozen"): self._plugin_registry.addPluginLocation(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "plugins")) @@ -788,3 +789,6 @@ class CuraApplication(QtApplication): def _addProfileReader(self, profile_reader): # TODO: Add the profile reader to the list of plug-ins that can be used when importing profiles. pass + + def _addProfileWriter(self, profile_writer): + pass diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index 1d27649498..c9b4e60046 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -3,7 +3,6 @@ from UM.Application import Application #To get the machine manager to create the new profile in. from UM.Logger import Logger -from UM.Settings.Profile import Profile from UM.Settings.ProfileReader import ProfileReader diff --git a/plugins/CuraProfileReader/__init__.py b/plugins/CuraProfileReader/__init__.py index bfaa16ed5e..c4206ab763 100644 --- a/plugins/CuraProfileReader/__init__.py +++ b/plugins/CuraProfileReader/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Provides support for importing Cura profiles."), - "api": 2 + "api": 3 }, "profile_reader": [ { diff --git a/plugins/CuraProfileWriter/CuraProfileWriter.py b/plugins/CuraProfileWriter/CuraProfileWriter.py index 82df446b8a..c6c4244948 100644 --- a/plugins/CuraProfileWriter/CuraProfileWriter.py +++ b/plugins/CuraProfileWriter/CuraProfileWriter.py @@ -16,10 +16,10 @@ class CuraProfileWriter(ProfileWriter): # \return \code True \endcode if the writing was successful, or \code # False \endcode if it wasn't. def write(self, path, profile): - serialised = profile.serialise() + serialized = profile.serialize() try: with SaveFile(path, "wt", -1, "utf-8") as f: # Open the specified file. - f.write(serialised) + f.write(serialized) except Exception as e: Logger.log("e", "Failed to write profile to %s: %s", path, str(e)) return False diff --git a/plugins/CuraProfileWriter/__init__.py b/plugins/CuraProfileWriter/__init__.py index 43890de469..30528b8167 100644 --- a/plugins/CuraProfileWriter/__init__.py +++ b/plugins/CuraProfileWriter/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Provides support for exporting Cura profiles."), - "api": 2 + "api": 3 }, "profile_writer": [ { diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index 2030ced505..b382065a7e 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -299,7 +299,7 @@ UM.ManagementPage folder: base.model.getDefaultPath() onAccepted: { - var result = base.model.exportProfile(base.currentItem.id, fileUrl) + var result = base.model.exportProfile(base.currentItem.id, fileUrl, selectedNameFilter) if(result && result.status == "error") { messageDialog.icon = StandardIcon.Critical From 97d64a0749633606e57ed2d566bbadcc96d4dc00 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Wed, 8 Jun 2016 15:36:26 +0200 Subject: [PATCH 30/69] Move ProfileReader and ProfileWriter over to Cura itself. Contributes to CURA-1667 Profile import/export --- cura/ProfileWriter.py | 25 +++++++++++++++++++ .../CuraProfileReader/CuraProfileReader.py | 7 +++--- .../CuraProfileWriter/CuraProfileWriter.py | 2 +- 3 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 cura/ProfileWriter.py diff --git a/cura/ProfileWriter.py b/cura/ProfileWriter.py new file mode 100644 index 0000000000..6c719205ec --- /dev/null +++ b/cura/ProfileWriter.py @@ -0,0 +1,25 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Uranium is released under the terms of the AGPLv3 or higher. + +from UM.PluginObject import PluginObject + +## Base class for profile writer plugins. +# +# This class defines a write() function to write profiles to files with. +class ProfileWriter(PluginObject): + ## Initialises the profile writer. + # + # This currently doesn't do anything since the writer is basically static. + def __init__(self): + super().__init__() + + ## Writes a profile to the specified file path. + # + # The profile writer may write its own file format to the specified file. + # + # \param path \type{string} The file to output to. + # \param profile \type{Profile} The profile to write to the file. + # \return \code True \endcode if the writing was successful, or \code + # False \endcode if it wasn't. + def write(self, path, node): + raise NotImplementedError("Profile writer plugin was not correctly implemented. No write was specified.") diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index c9b4e60046..9ff2955b22 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -3,7 +3,7 @@ from UM.Application import Application #To get the machine manager to create the new profile in. from UM.Logger import Logger -from UM.Settings.ProfileReader import ProfileReader +from cura.ProfileReader import ProfileReader ## A plugin that reads profile data from Cura profile files. @@ -25,16 +25,15 @@ class CuraProfileReader(ProfileReader): def read(self, file_name): # Create an empty profile. profile = Profile(machine_manager = Application.getInstance().getMachineManager(), read_only = False) - serialised = "" try: with open(file_name) as f: # Open file for reading. - serialised = f.read() + serialized = f.read() except IOError as e: Logger.log("e", "Unable to open file %s for reading: %s", file_name, str(e)) return None try: - profile.unserialise(serialised) + profile.deserialize(serialized) except Exception as e: # Parsing error. This is not a (valid) Cura profile then. Logger.log("e", "Error while trying to parse profile: %s", str(e)) return None diff --git a/plugins/CuraProfileWriter/CuraProfileWriter.py b/plugins/CuraProfileWriter/CuraProfileWriter.py index c6c4244948..86b4f7dc89 100644 --- a/plugins/CuraProfileWriter/CuraProfileWriter.py +++ b/plugins/CuraProfileWriter/CuraProfileWriter.py @@ -4,7 +4,7 @@ from UM.Logger import Logger from UM.SaveFile import SaveFile -from UM.Settings.ProfileWriter import ProfileWriter +from cura.ProfileWriter import ProfileWriter ## Writes profiles to Cura's own profile format with config files. From b93137545f8db44383985ddf02c7b2a8500afd04 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Thu, 9 Jun 2016 14:14:09 +0200 Subject: [PATCH 31/69] Support for importing a profile. Contributes to CURA-1667 Profile import/export --- plugins/CuraProfileReader/CuraProfileReader.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index 9ff2955b22..b9c1f208ea 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -1,11 +1,13 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. +import os.path + from UM.Application import Application #To get the machine manager to create the new profile in. from UM.Logger import Logger +from UM.Settings.InstanceContainer import InstanceContainer #The new profile to make. from cura.ProfileReader import ProfileReader - ## A plugin that reads profile data from Cura profile files. # # It reads a profile from a .curaprofile file, and returns it as a profile @@ -24,7 +26,8 @@ class CuraProfileReader(ProfileReader): # returned. def read(self, file_name): # Create an empty profile. - profile = Profile(machine_manager = Application.getInstance().getMachineManager(), read_only = False) + profile = InstanceContainer(os.path.basename(os.path.splitext(file_name)[0])) + profile.addMetaDataEntry("type", "quality") try: with open(file_name) as f: # Open file for reading. serialized = f.read() From 725086b0dd10085ab9f25e5b1aa6814cb28ad6be Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 9 Jun 2016 14:31:32 +0200 Subject: [PATCH 32/69] Remove ProfileSetup and move its contents to SidebaarHeader Contributes to CURA-340 --- resources/qml/ProfileSetup.qml | 166 -------------------------------- resources/qml/Sidebar.qml | 16 +-- resources/qml/SidebarHeader.qml | 153 +++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+), 180 deletions(-) delete mode 100644 resources/qml/ProfileSetup.qml diff --git a/resources/qml/ProfileSetup.qml b/resources/qml/ProfileSetup.qml deleted file mode 100644 index a168d87ff1..0000000000 --- a/resources/qml/ProfileSetup.qml +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) 2015 Ultimaker B.V. -// Cura is released under the terms of the AGPLv3 or higher. - -import QtQuick 2.2 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.1 -import QtQuick.Layouts 1.1 - -import UM 1.2 as UM -import Cura 1.0 as Cura - -Item{ - id: base; - UM.I18nCatalog { id: catalog; name:"cura"} - property int totalHeightProfileSetup: childrenRect.height - property Action manageProfilesAction - property Action addProfileAction - property Action updateProfileAction - property Action resetProfileAction - - signal showTooltip(Item item, point location, string text) - signal hideTooltip() - - Rectangle{ - id: globalProfileRow - anchors.top: base.top - height: UM.Theme.getSize("sidebar_setup").height - width: base.width - - Label{ - id: globalProfileLabel - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width; - anchors.verticalCenter: parent.verticalCenter - text: catalog.i18nc("@label","Profile:"); - width: parent.width/100*45 - font: UM.Theme.getFont("default"); - color: UM.Theme.getColor("text"); - } - - ToolButton { - property int rightMargin: customisedSettings.visible ? customisedSettings.width + UM.Theme.getSize("default_margin").width / 2 : 0 - - id: globalProfileSelection - text: Cura.MachineManager.activeQualityName - width: parent.width/100*55 - height: UM.Theme.getSize("setting_control").height - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: parent.verticalCenter - tooltip: Cura.MachineManager.activeQualityName - style: UM.Theme.styles.sidebar_header_button - - menu: Menu - { - id: profileSelectionMenu - Instantiator - { - id: profileSelectionInstantiator - model: UM.InstanceContainersModel - { - filter: - { - var result = { "type": "quality" }; - if(Cura.MachineManager.filterQualityByMachine) - { - result.definition = Cura.MachineManager.activeDefinitionId; - if(Cura.MachineManager.hasMaterials) - { - result.material = Cura.MachineManager.activeMaterialId; - } - } - else - { - result.definition = "fdmprinter" - } - return result - } - } - property int separatorIndex: -1 - - Loader { - property QtObject model_data: model - property int model_index: index - sourceComponent: menuItemDelegate - } - onObjectAdded: - { - //Insert a separator between readonly and custom profiles - if(separatorIndex < 0 && index > 0) { - if(model.getItem(index-1).readOnly != model.getItem(index).readOnly) { - profileSelectionMenu.insertSeparator(index); - separatorIndex = index; - } - } - //Because of the separator, custom profiles move one index lower - profileSelectionMenu.insertItem((model.getItem(index).readOnly) ? index : index + 1, object.item); - } - onObjectRemoved: - { - //When adding a profile, the menu is rebuild by removing all items. - //If a separator was added, we need to remove that too. - if(separatorIndex >= 0) - { - profileSelectionMenu.removeItem(profileSelectionMenu.items[separatorIndex]) - separatorIndex = -1; - } - profileSelectionMenu.removeItem(object.item); - } - } - ExclusiveGroup { id: profileSelectionMenuGroup; } - - Component - { - id: menuItemDelegate - MenuItem - { - id: item - text: model_data ? model_data.name : "" - checkable: true - checked: Cura.MachineManager.activeQualityId == model_data.id - exclusiveGroup: profileSelectionMenuGroup; - onTriggered: Cura.MachineManager.setActiveQuality(model_data.id) - } - } - - MenuSeparator { } - MenuItem { - action: base.updateProfileAction; - } - MenuItem { - action: base.resetProfileAction; - } - MenuItem { - action: base.addProfileAction; - } - MenuSeparator { } - MenuItem { - action: base.manageProfilesAction; - } - } - } - UM.SimpleButton { - id: customisedSettings - - visible: Cura.MachineManager.hasUserSettings - height: parent.height * 0.6 - width: parent.height * 0.6 - - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("setting_preferences_button_margin").width - - color: hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button"); - iconSource: UM.Theme.getIcon("star"); - - onClicked: base.manageProfilesAction.trigger() - onEntered: - { - var content = catalog.i18nc("@tooltip","Some setting values are different from the values stored in the profile.\n\nClick to open the profile manager.") - base.showTooltip(globalProfileRow, Qt.point(0, globalProfileRow.height / 2), content) - } - onExited: base.hideTooltip() - } - } -} diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 4109fd1586..29814ca42e 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -52,20 +52,8 @@ Rectangle width: parent.width height: totalHeightHeader - addMachineAction: base.addMachineAction; - configureMachinesAction: base.configureMachinesAction; - } - - ProfileSetup { - id: profileItem - addProfileAction: base.addProfileAction - updateProfileAction: base.updateProfileAction - resetProfileAction: base.resetProfileAction - manageProfilesAction: base.manageProfilesAction - anchors.top: header.bottom + anchors.top: parent.top anchors.topMargin: UM.Theme.getSize("default_margin").height - width: parent.width - height: totalHeightProfileSetup onShowTooltip: base.showTooltip(item, location, text) onHideTooltip: base.hideTooltip() @@ -76,7 +64,7 @@ Rectangle width: parent.width height: UM.Theme.getSize("sidebar_lining").height color: UM.Theme.getColor("sidebar_lining") - anchors.top: profileItem.bottom + anchors.top: header.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height } diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 60f5af2e73..83daf00be0 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -296,6 +296,159 @@ Item } } + Row + { + id: globalProfileRow + height: UM.Theme.getSize("sidebar_setup").height + + anchors + { + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + } + + + Label + { + id: globalProfileLabel + text: catalog.i18nc("@label","Profile:"); + width: parent.width * 0.45 - UM.Theme.getSize("default_margin").width + font: UM.Theme.getFont("default"); + color: UM.Theme.getColor("text"); + } + + ToolButton + { + id: globalProfileSelection + text: Cura.MachineManager.activeQualityName + width: parent.width * 0.55 + UM.Theme.getSize("default_margin").width + height: UM.Theme.getSize("setting_control").height + tooltip: Cura.MachineManager.activeQualityName + style: UM.Theme.styles.sidebar_header_button + + menu: Menu + { + id: profileSelectionMenu + Instantiator + { + id: profileSelectionInstantiator + model: UM.InstanceContainersModel + { + filter: + { + var result = { "type": "quality" }; + if(Cura.MachineManager.filterQualityByMachine) + { + result.definition = Cura.MachineManager.activeDefinitionId; + if(Cura.MachineManager.hasMaterials) + { + result.material = Cura.MachineManager.activeMaterialId; + } + } + else + { + result.definition = "fdmprinter" + } + return result + } + } + property int separatorIndex: -1 + + Loader { + property QtObject model_data: model + property int model_index: index + sourceComponent: menuItemDelegate + } + onObjectAdded: + { + //Insert a separator between readonly and custom profiles + if(separatorIndex < 0 && index > 0) + { + if(model.getItem(index-1).readOnly != model.getItem(index).metadata.read_only) + { + profileSelectionMenu.insertSeparator(index); + separatorIndex = index; + } + } + //Because of the separator, custom profiles move one index lower + profileSelectionMenu.insertItem((model.getItem(index).readOnly) ? index : index + 1, object.item); + } + onObjectRemoved: + { + //When adding a profile, the menu is rebuild by removing all items. + //If a separator was added, we need to remove that too. + if(separatorIndex >= 0) + { + profileSelectionMenu.removeItem(profileSelectionMenu.items[separatorIndex]) + separatorIndex = -1; + } + profileSelectionMenu.removeItem(object.item); + } + } + ExclusiveGroup { id: profileSelectionMenuGroup; } + + Component + { + id: menuItemDelegate + MenuItem + { + id: item + text: model_data ? model_data.name : "" + checkable: true + checked: model_data != null ? Cura.MachineManager.activeQualityId == model_data.id : false + exclusiveGroup: profileSelectionMenuGroup; + onTriggered: Cura.MachineManager.setActiveQuality(model_data.id) + } + } + + MenuSeparator { } + MenuItem + { + action: Cura.Actions.updateProfile; + } + MenuItem + { + action: Cura.Actions.resetProfile; + } + MenuItem + { + action: Cura.Actions.addProfile; + } + MenuSeparator { } + MenuItem + { + action: Cura.Actions.manageProfiles; + } + } + + UM.SimpleButton + { + id: customisedSettings + + visible: Cura.MachineManager.hasUserSettings + height: parent.height * 0.6 + width: parent.height * 0.6 + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("setting_preferences_button_margin").width + + color: hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button"); + iconSource: UM.Theme.getIcon("star"); + + onClicked: base.manageProfilesAction.trigger() + onEntered: + { + var content = catalog.i18nc("@tooltip","Some setting values are different from the values stored in the profile.\n\nClick to open the profile manager.") + base.showTooltip(globalProfileRow, Qt.point(0, globalProfileRow.height / 2), content) + } + onExited: base.hideTooltip() + } + } + } + UM.SettingPropertyProvider { id: machineExtruderCount From 88d87e8e8558dcd840cd3d2e5f8768e8ed83c9c9 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 9 Jun 2016 14:31:56 +0200 Subject: [PATCH 33/69] Cleanup sidebarheader and fix extruder selection Contributes to CURA-340 --- resources/qml/SidebarHeader.qml | 225 ++++++++++++++++---------------- 1 file changed, 113 insertions(+), 112 deletions(-) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 83daf00be0..f1c0bf7d8b 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -8,54 +8,54 @@ import QtQuick.Controls.Styles 1.1 import UM 1.2 as UM import Cura 1.0 as Cura -Item +Column { id: base; - // Machine Setup - property Action addMachineAction; - property Action configureMachinesAction; - UM.I18nCatalog { id: catalog; name:"cura"} + property int totalHeightHeader: childrenRect.height property int currentExtruderIndex; - Rectangle { - id: sidebarTabRow - width: base.width - height: 0 - anchors.top: parent.top - color: UM.Theme.getColor("sidebar_header_bar") - } + spacing: UM.Theme.getSize("default_margin").height - Rectangle { + signal showTooltip(Item item, point location, string text) + signal hideTooltip() + + Row + { id: machineSelectionRow - width: base.width height: UM.Theme.getSize("sidebar_setup").height - anchors.top: sidebarTabRow.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height - anchors.horizontalCenter: parent.horizontalCenter - Label{ + anchors + { + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + } + + Label + { id: machineSelectionLabel - //: Machine selection label - text: catalog.i18nc("@label:listbox","Printer:"); - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width + text: catalog.i18nc("@label:listbox", "Printer:"); anchors.verticalCenter: parent.verticalCenter font: UM.Theme.getFont("default"); color: UM.Theme.getColor("text"); + + width: parent.width * 0.45 - UM.Theme.getSize("default_margin").width } - ToolButton { + ToolButton + { id: machineSelection text: Cura.MachineManager.activeMachineName; - width: parent.width/100*55 + height: UM.Theme.getSize("setting_control").height tooltip: Cura.MachineManager.activeMachineName; - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter style: UM.Theme.styles.sidebar_header_button + width: parent.width * 0.55 + UM.Theme.getSize("default_margin").width + menu: Menu { id: machineSelectionMenu @@ -81,103 +81,116 @@ Item MenuSeparator { } - MenuItem { action: base.addMachineAction; } - MenuItem { action: base.configureMachinesAction; } + MenuItem { action: Cura.Actions.addMachine; } + MenuItem { action: Cura.Actions.configureMachines; } } } } - Rectangle { - id: extruderSelection - width: parent.width/100*55 + ListView + { + id: extrudersList + property var index: 0 + visible: machineExtruderCount.properties.value > 1 - height: visible ? UM.Theme.getSize("sidebar_header_mode_toggle").height : 0 - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.top: machineSelectionRow.bottom - anchors.topMargin: visible ? UM.Theme.getSize("default_margin").height : 0 - Component{ - id: wizardDelegate - Button { - height: extruderSelection.height - anchors.left: parent.left - anchors.leftMargin: model.index * (extruderSelection.width / machineExtruderCount.properties.value) - anchors.verticalCenter: parent.verticalCenter - width: parent.width / machineExtruderCount.properties.value - text: model.name - exclusiveGroup: extruderMenuGroup; - checkable: true; - checked: base.currentExtruderIndex == index - onClicked: - { - extruderSelection.focus = true; //Changing focus applies the currently-being-typed values so it can change the displayed setting values. - base.currentExtruderIndex = index; - ExtruderManager.setActiveExtruderIndex(index); - } + height: UM.Theme.getSize("sidebar_header_mode_toggle").height - style: ButtonStyle { - background: Rectangle { - border.width: UM.Theme.getSize("default_lining").width - border.color: control.checked ? UM.Theme.getColor("toggle_checked_border") : - control.pressed ? UM.Theme.getColor("toggle_active_border") : - control.hovered ? UM.Theme.getColor("toggle_hovered_border") : UM.Theme.getColor("toggle_unchecked_border") - color: control.checked ? UM.Theme.getColor("toggle_checked") : - control.pressed ? UM.Theme.getColor("toggle_active") : - control.hovered ? UM.Theme.getColor("toggle_hovered") : UM.Theme.getColor("toggle_unchecked") - Behavior on color { ColorAnimation { duration: 50; } } - Label { - anchors.centerIn: parent - color: control.checked ? UM.Theme.getColor("toggle_checked_text") : - control.pressed ? UM.Theme.getColor("toggle_active_text") : - control.hovered ? UM.Theme.getColor("toggle_hovered_text") : UM.Theme.getColor("toggle_unchecked_text") - font: UM.Theme.getFont("default") - text: control.text; - } - } - label: Item { } - } - } - } - ExclusiveGroup { id: extruderMenuGroup; } - ListView + boundsBehavior: Flickable.StopAtBounds + + anchors { - id: extrudersList - property var index: 0 - model: Cura.ExtrudersModel {} - delegate: wizardDelegate - anchors.top: parent.top - anchors.left: parent.left - width: parent.width + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + } + + ExclusiveGroup { id: extruderMenuGroup; } + + orientation: ListView.Horizontal + + model: Cura.ExtrudersModel { id: extrudersModel; addGlobal: true } + + delegate: Button + { + height: ListView.view.height + width: ListView.view.width / extrudersModel.rowCount() + + text: model.name + exclusiveGroup: extruderMenuGroup; + checkable: true; + checked: base.currentExtruderIndex == index + + onClicked: + { + extruderSelection.focus = true; //Changing focus applies the currently-being-typed values so it can change the displayed setting values. + base.currentExtruderIndex = index; + ExtruderManager.setActiveExtruderIndex(index); + } + + Component.onCompleted: console.log(model.name); + + style: ButtonStyle + { + background: Rectangle + { + border.width: UM.Theme.getSize("default_lining").width + border.color: control.checked ? UM.Theme.getColor("toggle_checked_border") : + control.pressed ? UM.Theme.getColor("toggle_active_border") : + control.hovered ? UM.Theme.getColor("toggle_hovered_border") : UM.Theme.getColor("toggle_unchecked_border") + color: control.checked ? UM.Theme.getColor("toggle_checked") : + control.pressed ? UM.Theme.getColor("toggle_active") : + control.hovered ? UM.Theme.getColor("toggle_hovered") : UM.Theme.getColor("toggle_unchecked") + Behavior on color { ColorAnimation { duration: 50; } } + + Label + { + anchors.centerIn: parent + color: control.checked ? UM.Theme.getColor("toggle_checked_text") : + control.pressed ? UM.Theme.getColor("toggle_active_text") : + control.hovered ? UM.Theme.getColor("toggle_hovered_text") : UM.Theme.getColor("toggle_unchecked_text") + + font: UM.Theme.getFont("default") + text: control.text; + } + } + label: Item { } + } } } - Rectangle { + Row + { id: variantRow - anchors.top: extruderSelection.visible ? extruderSelection.bottom : machineSelectionRow.bottom - anchors.topMargin: visible ? UM.Theme.getSize("default_margin").height : 0 - width: base.width - height: visible ? UM.Theme.getSize("sidebar_setup").height : 0 + + height: UM.Theme.getSize("sidebar_setup").height visible: Cura.MachineManager.hasVariants || Cura.MachineManager.hasMaterials - Label{ + anchors + { + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + } + + Label + { id: variantLabel text: (Cura.MachineManager.hasVariants && Cura.MachineManager.hasMaterials) ? catalog.i18nc("@label","Nozzle & Material:"): Cura.MachineManager.hasVariants ? catalog.i18nc("@label","Nozzle:") : catalog.i18nc("@label","Material:"); - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter - width: parent.width/100*45 + width: parent.width * 0.45 - UM.Theme.getSize("default_margin").width font: UM.Theme.getFont("default"); color: UM.Theme.getColor("text"); } Rectangle { - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter - width: parent.width/100*55 + width: parent.width * 0.55 + UM.Theme.getSize("default_margin").width height: UM.Theme.getSize("setting_control").height ToolButton { @@ -214,13 +227,6 @@ Item onTriggered: { Cura.MachineManager.setActiveVariant(model.id); - /*if (typeof(model) !== "undefined" && !model.active) { - //Selecting a variant was canceled; undo menu selection - variantSelectionInstantiator.model.setProperty(index, "active", false); - var activeMachineVariantName = UM.MachineManager.activeMachineVariant; - var activeMachineVariantIndex = variantSelectionInstantiator.model.find("name", activeMachineVariantName); - variantSelectionInstantiator.model.setProperty(activeMachineVariantIndex, "active", true); - }*/ } } onObjectAdded: variantsSelectionMenu.insertItem(index, object) @@ -277,13 +283,6 @@ Item onTriggered: { Cura.MachineManager.setActiveMaterial(model.id); - /*if (typeof(model) !== "undefined" && !model.active) { - //Selecting a material was canceled; undo menu selection - materialSelectionInstantiator.model.setProperty(index, "active", false); - var activeMaterialName = Cura.MachineManager.activeMaterialName - var activeMaterialIndex = materialSelectionInstantiator.model.find("name", activeMaterialName); - materialSelectionInstantiator.model.setProperty(activeMaterialIndex, "active", true); - }*/ } } onObjectAdded: materialSelectionMenu.insertItem(index, object) @@ -458,4 +457,6 @@ Item watchedProperties: [ "value" ] storeIndex: 0 } + + UM.I18nCatalog { id: catalog; name:"cura" } } From 4a43b50b7a99b4dce6d72826eca23e772ee7255b Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 9 Jun 2016 14:59:32 +0200 Subject: [PATCH 34/69] Remove unused action properties from Sidebar --- resources/qml/Cura.qml | 7 ------- resources/qml/Sidebar.qml | 7 ------- 2 files changed, 14 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 74f5e8bdd8..a1023d8ef2 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -533,13 +533,6 @@ UM.MainWindow } width: UM.Theme.getSize("sidebar").width; - - addMachineAction: Cura.Actions.addMachine; - configureMachinesAction: Cura.Actions.configureMachines; - addProfileAction: Cura.Actions.addProfile; - updateProfileAction: Cura.Actions.updateProfile; - resetProfileAction: Cura.Actions.resetProfile; - manageProfilesAction: Cura.Actions.manageProfiles; } } } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 29814ca42e..b7ff0743de 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -12,13 +12,6 @@ Rectangle { id: base; - property Action addMachineAction; - property Action configureMachinesAction; - property Action addProfileAction; - property Action updateProfileAction; - property Action resetProfileAction; - property Action manageProfilesAction; - property Action configureSettingsAction; property int currentModeIndex; color: UM.Theme.getColor("sidebar"); From 3a75e1fb795740398d668ba0c3bacbce2b0e456b Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 9 Jun 2016 15:12:37 +0200 Subject: [PATCH 35/69] Fix setting the active extruder Contributes to CURA-340 --- resources/qml/SidebarHeader.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index f1c0bf7d8b..7d7161256a 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -123,7 +123,7 @@ Column onClicked: { - extruderSelection.focus = true; //Changing focus applies the currently-being-typed values so it can change the displayed setting values. + focus = true; //Changing focus applies the currently-being-typed values so it can change the displayed setting values. base.currentExtruderIndex = index; ExtruderManager.setActiveExtruderIndex(index); } From abf634c0b0ed7cac37be69ba4d44e08e3977f190 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 9 Jun 2016 15:14:32 +0200 Subject: [PATCH 36/69] Filter visible settings based on if they can be set per extruder Contributes to CURA-340 --- resources/qml/Settings/SettingView.qml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index a6bb60f865..d1ddb12e34 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -31,6 +31,15 @@ ScrollView containerId: Cura.MachineManager.activeDefinitionId exclude: ["machine_settings"] visibilityHandler: UM.SettingPreferenceVisibilityHandler { } + + filter: + { + if(ExtruderManager.activeExtruderStackId) + { + return { "settable_per_extruder": true } + } + return { } + } } delegate: Loader From 98c9f202a293d7409b36865ca61d2ad096000e4c Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 9 Jun 2016 15:32:41 +0200 Subject: [PATCH 37/69] Do not produce an error when a setting has been filtered out Contributes to CURA-340 --- resources/qml/Settings/SettingView.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index d1ddb12e34..4be2326b0a 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -91,7 +91,7 @@ ScrollView id: provider containerStackId: ExtruderManager.activeExtruderStackId ? ExtruderManager.activeExtruderStackId : Cura.MachineManager.activeMachineId - key: model.key + key: model.key ? model.key : "" watchedProperties: [ "value", "enabled", "state", "validationState" ] storeIndex: 0 } From 90ddff1c7ffe8e5c0b4624275d75b5ec9a49f8c7 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 9 Jun 2016 15:35:37 +0200 Subject: [PATCH 38/69] Remove obsolete debug statement Contributes to 1685 --- resources/qml/SidebarHeader.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 7d7161256a..db9b580907 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -128,8 +128,6 @@ Column ExtruderManager.setActiveExtruderIndex(index); } - Component.onCompleted: console.log(model.name); - style: ButtonStyle { background: Rectangle From 12a7b99cf7c7aa6a21c40e8279c3334886ab55ca Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 9 Jun 2016 15:43:18 +0200 Subject: [PATCH 39/69] fix: merge b3cfa62 went wrong, no slicing happened (CURA-1558) --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 12828971cd..15c41f9c56 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -97,7 +97,7 @@ class CuraApplication(QtApplication): SettingDefinition.addSupportedProperty("settable_per_extruder", DefinitionPropertyType.Any, default = True) SettingDefinition.addSupportedProperty("settable_per_meshgroup", DefinitionPropertyType.Any, default = True) SettingDefinition.addSupportedProperty("settable_globally", DefinitionPropertyType.Any, default = True) - SettingDefinition.addSettingType("extruder", str, ast.literal_eval, UM.Settings.Validator) + SettingDefinition.addSettingType("extruder", int, str, UM.Settings.Validator) super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType) From bd76c3e30f68560fc8d1bc821e6f488a9978f61d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 15:46:22 +0200 Subject: [PATCH 40/69] Add drop-down in per-object settings to select extruder Actually selecting an extruder has no effect because there are dragons in that area and I need better armour with bonus damage against bugs before I venture in there. Contributes to issues CURA-340 and CURA-1278. --- cura/SettingOverrideDecorator.py | 38 ++++++-- .../PerObjectSettingsPanel.qml | 94 ++++++++++++++++++- .../PerObjectSettingsTool.py | 19 +++- 3 files changed, 142 insertions(+), 9 deletions(-) diff --git a/cura/SettingOverrideDecorator.py b/cura/SettingOverrideDecorator.py index f9878e436c..06dbc2cb31 100644 --- a/cura/SettingOverrideDecorator.py +++ b/cura/SettingOverrideDecorator.py @@ -1,5 +1,9 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. + +from PyQt5.QtCore import pyqtSignal +import copy + from UM.Scene.SceneNodeDecorator import SceneNodeDecorator from UM.Settings.ContainerStack import ContainerStack @@ -7,24 +11,29 @@ from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Application import Application -import copy + ## A decorator that adds a container stack to a Node. This stack should be queried for all settings regarding # the linked node. The Stack in question will refer to the global stack (so that settings that are not defined by # this stack still resolve. class SettingOverrideDecorator(SceneNodeDecorator): + ## Event indicating that the user selected a different extruder. + activeExtruderChanged = pyqtSignal() + def __init__(self): super().__init__() self._stack = ContainerStack(stack_id = id(self)) self._stack.setDirty(False) # This stack does not need to be saved. self._instance = InstanceContainer(container_id = "SettingOverrideInstanceContainer") self._stack.addContainer(self._instance) + self._extruder_stack = None #Stack upon which our stack is based. self._stack.propertyChanged.connect(self._onSettingChanged) ContainerRegistry.getInstance().addContainer(self._stack) - Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged) - self._onGlobalContainerStackChanged() + Application.getInstance().globalContainerStackChanged.connect(self._updateNextStack) + self.activeExtruderChanged.connect(self._updateNextStack) + self._updateNextStack() def __deepcopy__(self, memo): ## Create a fresh decorator object @@ -35,13 +44,30 @@ class SettingOverrideDecorator(SceneNodeDecorator): deep_copy._stack.replaceContainer(0, deep_copy._instance) return deep_copy + ## Gets the currently active extruder to print this object with. + # + # \return An extruder's container stack. + def getActiveExtruder(self): + return self._extruder_stack + def _onSettingChanged(self, instance, property): if property == "value": # Only reslice if the value has changed. Application.getInstance().getBackend().forceSlice() - def _onGlobalContainerStackChanged(self): - ## Ensure that the next stack is always the global stack. - self._stack.setNextStack(Application.getInstance().getGlobalContainerStack()) + ## Makes sure that the stack upon which the container stack is placed is + # kept up to date. + def _updateNextStack(self): + if self._extruder_stack: + self._stack.setNextStack(ContainerRegistry.getInstance().findContainerStack(id = self._extruder_stack)) + else: + self._stack.setNextStack(Application.getInstance().getGlobalContainerStack()) + + ## Changes the extruder with which to print this node. + # + # \param extruder_stack_id The new extruder stack to print with. + def setActiveExtruder(self, extruder_stack_id): + self._extruder_stack = extruder_stack_id + self.activeExtruderChanged.emit() def getStack(self): return self._stack \ No newline at end of file diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index d07db2e212..4610083674 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Ultimaker B.V. +// Copyright (c) 2016 Ultimaker B.V. // Uranium is released under the terms of the AGPLv3 or higher. import QtQuick 2.2 @@ -26,6 +26,98 @@ Item { spacing: UM.Theme.getSize("default_margin").height; + Row + { + ComboBox + { + id: extruderSelector + + model: Cura.ExtrudersModel + { + id: extruders_model + } + textRole: "name" + width: items.width + height: UM.Theme.getSize("section").height + MouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + onWheel: wheel.accepted = true; + } + + style: ComboBoxStyle + { + background: Rectangle + { + color: + { + if(extruderSelector.hovered || base.activeFocus) + { + return UM.Theme.getColor("setting_control_highlight"); + } + else + { + return extruders_model.getItem(extruderSelector.currentIndex).colour; + } + } + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("setting_control_border") + } + label: Item + { + Label + { + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_lining").width + anchors.right: downArrow.left + anchors.rightMargin: UM.Theme.getSize("default_lining").width + anchors.verticalCenter: parent.verticalCenter + + text: extruderSelector.currentText + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("setting_control_disabled_text") + + elide: Text.ElideRight + verticalAlignment: Text.AlignVCenter + } + + UM.RecolorImage + { + id: downArrow + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 + anchors.verticalCenter: parent.verticalCenter + + source: UM.Theme.getIcon("arrow_bottom") + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + 5 + sourceSize.height: width + 5 + + color: UM.Theme.getColor("setting_control_text") + } + } + } + + onActivated: UM.ActiveTool.properties.setValue("SelectedActiveExtruder", extruders_model.getItem(index).id); + onModelChanged: updateCurrentIndex(); + + function updateCurrentIndex() + { + for(var i = 0; i < extruders_model.rowCount(); ++i) + { + if(extruders_model.getItem(i).id == UM.ActiveTool.properties.getValue("SelectedActiveExtruder")) + { + extruderSelector.currentIndex = i; + return; + } + } + extruderSelector.currentIndex = -1; + } + } + } + Repeater { id: contents diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index 6ae44c2671..255277c3af 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2016 Ultimaker B.V. # Uranium is released under the terms of the AGPLv3 or higher. from UM.Tool import Tool @@ -14,7 +14,7 @@ class PerObjectSettingsTool(Tool): super().__init__() self._model = None - self.setExposedProperties("SelectedObjectId", "ContainerID") + self.setExposedProperties("SelectedObjectId", "ContainerID", "SelectedActiveExtruder") Preferences.getInstance().preferenceChanged.connect(self._onPreferenceChanged) Selection.selectionChanged.connect(self.propertyChanged) @@ -42,6 +42,21 @@ class PerObjectSettingsTool(Tool): except AttributeError: return "" + ## Gets the active extruder of the currently selected object. + # + # \return The active extruder of the currently selected object. + def getSelectedActiveExtruder(self): + selected_object = Selection.getSelectedObject(0) + selected_object.callDecoration("getActiveExtruder") + + ## Changes the active extruder of the currently selected object. + # + # \param extruder_stack_id The ID of the extruder to print the currently + # selected object with. + def setSelectedActiveExtruder(self, extruder_stack_id): + selected_object = Selection.getSelectedObject(0) + selected_object.callDecoration("setActiveExtruder", extruder_stack_id) + def _onPreferenceChanged(self, preference): if preference == "cura/active_mode": enabled = Preferences.getInstance().getValue(preference)==1 From 38c6c3cb0160b45c94d15e9b221dc338b2b0a3b5 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 15:51:28 +0200 Subject: [PATCH 41/69] Minor fixes to SidebarHeader CURA-1689 --- resources/qml/SidebarHeader.qml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index f1c0bf7d8b..17fb473b74 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -128,8 +128,6 @@ Column ExtruderManager.setActiveExtruderIndex(index); } - Component.onCompleted: console.log(model.name); - style: ButtonStyle { background: Rectangle @@ -365,7 +363,7 @@ Column //Insert a separator between readonly and custom profiles if(separatorIndex < 0 && index > 0) { - if(model.getItem(index-1).readOnly != model.getItem(index).metadata.read_only) + if(model.getItem(index-1).readOnly != model.getItem(index).readOnly) { profileSelectionMenu.insertSeparator(index); separatorIndex = index; @@ -376,7 +374,7 @@ Column } onObjectRemoved: { - //When adding a profile, the menu is rebuild by removing all items. + //When adding a profile, the menu is rebuilt by removing all items. //If a separator was added, we need to remove that too. if(separatorIndex >= 0) { From 0952dd0327b4fd90545208b628c4c3b5b5c1cdb4 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 16:01:08 +0200 Subject: [PATCH 42/69] Removed warnings about undefined properties CURA-1278 --- resources/qml/Preferences/ProfilesPage.qml | 1 - resources/qml/Settings/SettingCategory.qml | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index b382065a7e..cd37df3cc5 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -41,7 +41,6 @@ UM.ManagementPage { width: objectListContainer.viewport.width; height: childrenRect.height; - color: palette.light Label { diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml index f4c35f876e..6e23158a1c 100644 --- a/resources/qml/Settings/SettingCategory.qml +++ b/resources/qml/Settings/SettingCategory.qml @@ -56,9 +56,9 @@ Button { anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("setting_preferences_button_margin").width - visible: hiddenValuesCount > 0 - height: parent.height / 2; - width: height; + visible: false //hiddenValuesCount > 0 + height: parent.height / 2 + width: height onClicked: { base.showAllHiddenInheritedSettings() From 392d237b4746b013affc749b192ab48033dabc04 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 16:55:04 +0200 Subject: [PATCH 43/69] Fix filtering UM2+ profiles Profiles did not show before selecting a material CURA-1278 --- cura/MachineManagerModel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 816dbc4600..e9a07f58f7 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -114,8 +114,8 @@ class MachineManagerModel(QObject): UM.Settings.ContainerRegistry.getInstance().addContainer(new_global_stack) variant_instance_container = self._updateVariantContainer(definition) - material_instance_container = self._updateMaterialContainer(definition) - quality_instance_container = self._updateQualityContainer(definition) + material_instance_container = self._updateMaterialContainer(definition, variant_instance_container) + quality_instance_container = self._updateQualityContainer(definition, material_instance_container) current_settings_instance_container = UM.Settings.InstanceContainer(name + "_current_settings") current_settings_instance_container.addMetaDataEntry("machine", name) From e793ce1a2c289cca27c1d4b42b788118521c4855 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 16:57:40 +0200 Subject: [PATCH 44/69] Use ID instead of definition --- cura/ExtrudersModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/ExtrudersModel.py b/cura/ExtrudersModel.py index 3265667dc6..2a4ae54310 100644 --- a/cura/ExtrudersModel.py +++ b/cura/ExtrudersModel.py @@ -80,7 +80,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): } self.appendItem(item) - for extruder in manager.getMachineExtruders(global_container_stack.getBottom()): + for extruder in manager.getMachineExtruders(global_container_stack.getBottom().getId()): material = extruder.findContainer({ "type": "material" }) colour = material.getMetaDataEntry("color_code", default = "#FFFF00") if material else "#FFFF00" position = extruder.getBottom().getMetaDataEntry("position", default = "0") #Position in the definition. From beb263025b5041ec00a222355d02bd6625d9f983 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 15:59:57 +0200 Subject: [PATCH 45/69] Make ExtruderSelector invisible if there is no choice in extruders It doesn't yet update well if you keep the panel open while switching machines. Contributes to issue CURA-340. --- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 4610083674..03158266f5 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -36,6 +36,7 @@ Item { { id: extruders_model } + visible: extruders_model.rowCount() > 1 textRole: "name" width: items.width height: UM.Theme.getSize("section").height From 9d618282ed614b78ee263187af71f6ed25c3603f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 16:30:54 +0200 Subject: [PATCH 46/69] Save default material colour statically So if you wish to change that colour, you only need to change it in one place. Contributes to issue CURA-340. --- cura/ExtrudersModel.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cura/ExtrudersModel.py b/cura/ExtrudersModel.py index 2a4ae54310..960c05bd5e 100644 --- a/cura/ExtrudersModel.py +++ b/cura/ExtrudersModel.py @@ -28,6 +28,10 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): # containers. IndexRole = Qt.UserRole + 4 + ## Colour to display if there is no material or the material has no known + # colour. + defaultColour = "#FFFF00" + ## Initialises the extruders model, defining the roles and listening for # changes in the data. # @@ -71,7 +75,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): if self._add_global: material = global_container_stack.findContainer({ "type": "material" }) - colour = material.getMetaDataEntry("color_code", default = "#FFFF00") if material else "#FFFF00" + colour = material.getMetaDataEntry("color_code", default = self.defaultColour) if material else self.defaultColour item = { "id": global_container_stack.getId(), "name": "Global", @@ -82,7 +86,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): for extruder in manager.getMachineExtruders(global_container_stack.getBottom().getId()): material = extruder.findContainer({ "type": "material" }) - colour = material.getMetaDataEntry("color_code", default = "#FFFF00") if material else "#FFFF00" + colour = material.getMetaDataEntry("color_code", default = self.defaultColour) if material else self.defaultColour position = extruder.getBottom().getMetaDataEntry("position", default = "0") #Position in the definition. try: position = int(position) From 9f3752276f701f5fb417f06d28aa94a6b3f34532 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 16:43:53 +0200 Subject: [PATCH 47/69] Fix check if machine's extruders are processed Luckily this did never occur anyway since the rest of the code was sound. Contributes to issue CURA-340. --- cura/ExtruderManager.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/ExtruderManager.py b/cura/ExtruderManager.py index f5971ac141..edd6ab7d23 100644 --- a/cura/ExtruderManager.py +++ b/cura/ExtruderManager.py @@ -191,9 +191,10 @@ class ExtruderManager(QObject): container_registry.addContainer(container_stack) ## Generates extruders for a specific machine. + # + # \param machine_id The machine to get the extruders of. def getMachineExtruders(self, machine_id): - container_registry = UM.Settings.ContainerRegistry.getInstance() - if not machine_id in self._extruder_trains: + if machine_id not in self._extruder_trains: UM.Logger.log("w", "Tried to get the extruder trains for machine %s, which doesn't exist.", machine_id) return for name in self._extruder_trains[machine_id]: From 3206650f39cf6f7b034307d5f5afad79b632acb8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 16:59:01 +0200 Subject: [PATCH 48/69] Fix signal, repair per-object settings This was the wrong type of signal, which gave an error. Contributes to issue CURA-340. --- cura/SettingOverrideDecorator.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/SettingOverrideDecorator.py b/cura/SettingOverrideDecorator.py index 06dbc2cb31..23730fee60 100644 --- a/cura/SettingOverrideDecorator.py +++ b/cura/SettingOverrideDecorator.py @@ -1,11 +1,10 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -from PyQt5.QtCore import pyqtSignal import copy from UM.Scene.SceneNodeDecorator import SceneNodeDecorator - +from UM.Signal import Signal, signalemitter from UM.Settings.ContainerStack import ContainerStack from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry @@ -15,9 +14,10 @@ from UM.Application import Application ## A decorator that adds a container stack to a Node. This stack should be queried for all settings regarding # the linked node. The Stack in question will refer to the global stack (so that settings that are not defined by # this stack still resolve. +@signalemitter class SettingOverrideDecorator(SceneNodeDecorator): ## Event indicating that the user selected a different extruder. - activeExtruderChanged = pyqtSignal() + activeExtruderChanged = Signal() def __init__(self): super().__init__() From 959305ddf72769d5154771996b7a6c78e2db492d Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 9 Jun 2016 17:26:43 +0200 Subject: [PATCH 49/69] JSOn fix: removed buggy default:true for numeric values (CURA-1558) --- resources/definitions/fdmprinter.def.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 52aab1d26c..bc4b8dbc40 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -324,7 +324,6 @@ "minimum_value": "0.001", "minimum_value_warning": "0.04", "maximum_value_warning": "0.8 * machine_nozzle_size", - "default_value": true, "settable_per_mesh": false, "settable_per_extruder": false }, @@ -338,7 +337,6 @@ "minimum_value": "0.001", "minimum_value_warning": "0.04", "maximum_value_warning": "0.8 * machine_nozzle_size", - "default_value": true, "settable_per_mesh": false, "settable_per_extruder": false }, @@ -366,7 +364,6 @@ "value":"line_width", "default_value": 0.4, "type": "float", - "default_value": true, "settable_per_mesh": true, "children": { From b0198aedb089afb64be4322424503ddf9138e3f1 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 9 Jun 2016 17:27:20 +0200 Subject: [PATCH 50/69] JSON fix: line_width didn't supply any settable_per info (CURA-1558) --- resources/definitions/fdmprinter.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index bc4b8dbc40..1f7ed7c78a 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -351,6 +351,7 @@ "default_value": 0.4, "type": "float", "value": "machine_nozzle_size", + "settable_per_mesh": true, "children": { "wall_line_width": From c6b17064601eb59837d9f109c2ffe5e2435c5b58 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 17:49:33 +0200 Subject: [PATCH 51/69] Fix customisedSettings button (profiles dropdown) layout and behavior CURA-1685 --- resources/qml/SidebarHeader.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index fdae096aee..1083496f36 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -430,12 +430,12 @@ Column anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("setting_preferences_button_margin").width + anchors.rightMargin: UM.Theme.getSize("setting_preferences_button_margin").width - UM.Theme.getSize("default_margin").width color: hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button"); iconSource: UM.Theme.getIcon("star"); - onClicked: base.manageProfilesAction.trigger() + onClicked: Cura.Actions.manageProfiles.trigger() onEntered: { var content = catalog.i18nc("@tooltip","Some setting values are different from the values stored in the profile.\n\nClick to open the profile manager.") From d34d398e9660060233024d338823567bd04a1444 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 18:40:42 +0200 Subject: [PATCH 52/69] Change the implementation of creating a profile from the current settings The newly created profile now combines the settings of the active quality profile and the current settings CURA-970, CURA-1585 --- cura/MachineManagerModel.py | 34 +++++----------------- resources/qml/Actions.qml | 2 +- resources/qml/Cura.qml | 2 +- resources/qml/Preferences/ProfilesPage.qml | 4 +-- 4 files changed, 11 insertions(+), 31 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index e9a07f58f7..6768a357a5 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -269,38 +269,18 @@ class MachineManagerModel(QObject): return containers[0].isReadOnly() @pyqtSlot(result = str) - def convertUserContainerToQuality(self): - if not self._global_container_stack: + def newQualityContainerFromQualityAndUser(self): + new_container_id = self.duplicateContainer(self.activeQualityId) + if new_container_id == "": return + self.setActiveQuality(new_container_id) + self.updateQualityContainerFromUserContainer() - new_quality_container = InstanceContainer("") - name = self._createUniqueName("quality", "", self.activeQualityName, catalog.i18nc("@label", "Custom profile")) - user_settings = self._global_container_stack.getTop() - - ## Copy all values - new_quality_container.deserialize(user_settings.serialize()) - - ## If the currently active machine does not have quality profiles of its own, - # make the new quality profile available for all machines that don't have - # unique quality profiles (including the current machine) - if not self.filterQualityByMachine: - new_quality_container.setDefinition(UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0]) - - ## Change type / id / name - new_quality_container.setMetaDataEntry("type", "quality") - new_quality_container.setReadOnly(False) - new_quality_container.setName(name) - new_quality_container._id = name - - UM.Settings.ContainerRegistry.getInstance().addContainer(new_quality_container) - self.clearUserSettings() # As all users settings are now transfered to the new quality profile, remove them. - self.setActiveQuality(name) - return name @pyqtSlot(str, result=str) def duplicateContainer(self, container_id): if not self._global_container_stack: - return + return "" containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=container_id) if containers: new_name = self._createUniqueName("quality", "", containers[0].getName(), catalog.i18nc("@label", "Custom profile")) @@ -348,7 +328,7 @@ class MachineManagerModel(QObject): @pyqtSlot() - def updateUserContainerToQuality(self): + def updateQualityContainerFromUserContainer(self): if not self._global_container_stack: return user_settings = self._global_container_stack.getTop() diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index e09b6b5424..3ef40644d2 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -112,7 +112,7 @@ Item id: updateProfileAction; enabled: Cura.MachineManager.isGlobalStackValid && Cura.MachineManager.hasUserSettings && !Cura.MachineManager.isReadOnly(Cura.MachineManager.activeQualityId) text: catalog.i18nc("@action:inmenu menubar:profile","&Update Current Profile"); - onTriggered: Cura.MachineManager.updateUserContainerToQuality() + onTriggered: Cura.MachineManager.updateQualityContainerFromUserContainer() } Action diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index a1023d8ef2..547f05d056 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -582,7 +582,7 @@ UM.MainWindow target: Cura.Actions.addProfile onTriggered: { - Cura.MachineManager.convertUserContainerToQuality(); + Cura.MachineManager.newQualityContainerFromQualityAndUser(); preferences.setPage(5); preferences.show(); diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index cd37df3cc5..71afdd98ac 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -65,7 +65,7 @@ UM.ManagementPage onAddObject: { var selectedContainer; if (objectList.currentItem.id == Cura.MachineManager.activeQualityId) { - selectedContainer = Cura.MachineManager.convertUserContainerToQuality(); + selectedContainer = Cura.MachineManager.newQualityContainerFromQualityAndUser(); } else { selectedContainer = Cura.MachineManager.duplicateContainer(base.currentItem.id); } @@ -121,7 +121,7 @@ UM.ManagementPage return catalog.i18nc("@action:button", "Update \"%1\"".arg(profileName)); } enabled: Cura.MachineManager.hasUserSettings && !Cura.MachineManager.isReadOnly(Cura.MachineManager.activeQualityId) - onClicked: Cura.MachineManager.updateUserContainerToQuality() + onClicked: Cura.MachineManager.updateQualityContainerFromUserContainer() } Button From c8070cff052083751f0a17bd0058e9f8888876c5 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Thu, 9 Jun 2016 18:43:54 +0200 Subject: [PATCH 53/69] Don't ignore the directory but the link, too. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cc21d3092c..8bcc055115 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,4 @@ resources/firmware .pydevproject # Debian packaging -debian/ +debian* From 330481d2d604913199c408deccf79f24c118a72f Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Thu, 9 Jun 2016 18:45:48 +0200 Subject: [PATCH 54/69] Ignore settings set on Eclipse --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 8bcc055115..dc951a52b7 100644 --- a/.gitignore +++ b/.gitignore @@ -16,8 +16,11 @@ resources/firmware *~ *.qm .idea + +# Eclipse+PyDev .project .pydevproject +.settings # Debian packaging debian* From f5f711b7dc38270860d2c54e3403fc647aae716c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 18:59:28 +0200 Subject: [PATCH 55/69] On extruder switch create OverrideDecorator if needed The SettingOverrideDecorator is only applied if the node has a per-object setting. Now it also creates a decorator also if you've ever switched the extruder, which was needed because the decorator contains the information which extruder to print with. Contributes to issue CURA-340. --- plugins/PerObjectSettingsTool/PerObjectSettingsTool.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index 255277c3af..395dbdc594 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -5,7 +5,7 @@ from UM.Tool import Tool from UM.Scene.Selection import Selection from UM.Application import Application from UM.Preferences import Preferences - +from cura.SettingOverrideDecorator import SettingOverrideDecorator ## This tool allows the user to add & change settings per node in the scene. # The settings per object are kept in a ContainerStack, which is linked to a node by decorator. @@ -55,6 +55,9 @@ class PerObjectSettingsTool(Tool): # selected object with. def setSelectedActiveExtruder(self, extruder_stack_id): selected_object = Selection.getSelectedObject(0) + stack = selected_object.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. + if not stack: + selected_object.addDecorator(SettingOverrideDecorator()) selected_object.callDecoration("setActiveExtruder", extruder_stack_id) def _onPreferenceChanged(self, preference): From 9e86cd5c85312d54d120a0d769560ae833055443 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 19:03:41 +0200 Subject: [PATCH 56/69] Fix call to findContainerStack[s] Was a typo. Now it also checks if the stack ID is correct here. Not because it went wrong, but for defensive programming. Contributes to issue CURA-340. --- cura/SettingOverrideDecorator.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cura/SettingOverrideDecorator.py b/cura/SettingOverrideDecorator.py index 23730fee60..7417e47bf2 100644 --- a/cura/SettingOverrideDecorator.py +++ b/cura/SettingOverrideDecorator.py @@ -8,6 +8,7 @@ from UM.Signal import Signal, signalemitter from UM.Settings.ContainerStack import ContainerStack from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry +import UM.Logger from UM.Application import Application @@ -58,7 +59,11 @@ class SettingOverrideDecorator(SceneNodeDecorator): # kept up to date. def _updateNextStack(self): if self._extruder_stack: - self._stack.setNextStack(ContainerRegistry.getInstance().findContainerStack(id = self._extruder_stack)) + extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = self._extruder_stack) + if extruder_stack: + self._stack.setNextStack(extruder_stack) + else: + UM.Logger.log("e", "Extruder stack %s below per-object settings does not exist.", self._extruder_stack) else: self._stack.setNextStack(Application.getInstance().getGlobalContainerStack()) From 598ff1e398d662f2f4570417d1893f071f7bd31b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 9 Jun 2016 19:05:52 +0200 Subject: [PATCH 57/69] Fix changing active extruder from per-object drop-down Apparently this is the way you do it. Contributes to issue CURA-340. --- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 03158266f5..502e903416 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -101,7 +101,7 @@ Item { } } - onActivated: UM.ActiveTool.properties.setValue("SelectedActiveExtruder", extruders_model.getItem(index).id); + onActivated: UM.ActiveTool.setProperty("SelectedActiveExtruder", extruders_model.getItem(index).id); onModelChanged: updateCurrentIndex(); function updateCurrentIndex() From af238d5a7656b243550c426405e2b356de877365 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Jun 2016 19:17:31 +0200 Subject: [PATCH 58/69] Renaming profiles now also renames them on disk CURA-1683 --- cura/MachineManagerModel.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index e9a07f58f7..7e588574d8 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -5,12 +5,17 @@ from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from UM.Application import Application from UM.Preferences import Preferences from UM.Logger import Logger +from UM.Resources import Resources + +import os +import urllib import UM.Settings from UM.Settings.Validator import ValidatorState from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerStack import ContainerStack from . import ExtruderManager +import cura.CuraApplication from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") @@ -323,8 +328,19 @@ class MachineManagerModel(QObject): def renameQualityContainer(self, container_id, new_name): containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = container_id, type = "quality") if containers: + + # Remove old container form drive. + old_id = containers[0].getId() + file_name = urllib.parse.quote_plus(old_id) + ".inst.cfg" + path = Resources.getStoragePath(cura.CuraApplication.CuraApplication.ResourceTypes.QualityInstanceContainer, + file_name) + os.remove(path) + + ## Check if the new name is allowed. new_name = self._createUniqueName("quality", containers[0].getName(), new_name, catalog.i18nc("@label", "Custom profile")) + containers[0].setName(new_name) + containers[0]._id = new_name # Todo: Fix proper id change function for this. self.activeQualityChanged.emit() From 0d7a7d9299a945a5da32445897d758b11b5d6b81 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 19:18:46 +0200 Subject: [PATCH 59/69] Update wording to make storing/updating/discarding current settings more clear CURA-970 --- resources/qml/Actions.qml | 8 ++++---- resources/qml/Cura.qml | 8 ++++---- resources/qml/Preferences/ProfilesPage.qml | 8 +++----- resources/qml/SidebarHeader.qml | 20 ++++---------------- 4 files changed, 15 insertions(+), 29 deletions(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 3ef40644d2..7e03bd7102 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -111,7 +111,7 @@ Item { id: updateProfileAction; enabled: Cura.MachineManager.isGlobalStackValid && Cura.MachineManager.hasUserSettings && !Cura.MachineManager.isReadOnly(Cura.MachineManager.activeQualityId) - text: catalog.i18nc("@action:inmenu menubar:profile","&Update Current Profile"); + text: catalog.i18nc("@action:inmenu menubar:profile","&Update profile with current settings"); onTriggered: Cura.MachineManager.updateQualityContainerFromUserContainer() } @@ -119,15 +119,15 @@ Item { id: resetProfileAction; enabled: Cura.MachineManager.hasUserSettings - text: catalog.i18nc("@action:inmenu menubar:profile","&Reload Current Profile"); + text: catalog.i18nc("@action:inmenu menubar:profile","&Discard current settings"); onTriggered: Cura.MachineManager.clearUserSettings(); } Action { id: addProfileAction; - enabled: Cura.MachineManager.isGlobalStackValid - text: catalog.i18nc("@action:inmenu menubar:profile","&Create New Profile..."); + enabled: Cura.MachineManager.isGlobalStackValid && Cura.MachineManager.hasUserSettings + text: catalog.i18nc("@action:inmenu menubar:profile","&Create profile from current settings..."); } Action diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 547f05d056..c3dc95b454 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -297,11 +297,11 @@ UM.MainWindow MenuSeparator { id: profileMenuSeparator } - MenuItem { action: Cura.Actions.updateProfile; } - MenuItem { action: Cura.Actions.resetProfile; } - MenuItem { action: Cura.Actions.addProfile; } + MenuItem { action: Cura.Actions.addProfile } + MenuItem { action: Cura.Actions.updateProfile } + MenuItem { action: Cura.Actions.resetProfile } MenuSeparator { } - MenuItem { action: Cura.Actions.manageProfiles; } + MenuItem { action: Cura.Actions.manageProfiles } } Menu diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index 71afdd98ac..93fd8ae61f 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -13,7 +13,7 @@ UM.ManagementPage id: base; title: catalog.i18nc("@title:tab", "Profiles"); - addText: catalog.i18nc("@label", "Duplicate") + addText: base.currentItem && (base.currentItem.id == Cura.MachineManager.activeQualityId) ? catalog.i18nc("@label", "Create") : catalog.i18nc("@label", "Duplicate") model: UM.InstanceContainersModel { @@ -116,9 +116,7 @@ UM.ManagementPage Button { text: { - var profileName = Cura.MachineManager.activeQualityName; - profileName = (profileName.length > 20) ? profileName.substring(0, 20) + '...' : profileName; - return catalog.i18nc("@action:button", "Update \"%1\"".arg(profileName)); + return catalog.i18nc("@action:button", "Update profile with current settings"); } enabled: Cura.MachineManager.hasUserSettings && !Cura.MachineManager.isReadOnly(Cura.MachineManager.activeQualityId) onClicked: Cura.MachineManager.updateQualityContainerFromUserContainer() @@ -126,7 +124,7 @@ UM.ManagementPage Button { - text: catalog.i18nc("@action:button", "Discard changes"); + text: catalog.i18nc("@action:button", "Discard current settings"); enabled: Cura.MachineManager.hasUserSettings onClicked: Cura.MachineManager.clearUserSettings(); } diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 1083496f36..282068ee2c 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -401,23 +401,11 @@ Column } MenuSeparator { } - MenuItem - { - action: Cura.Actions.updateProfile; - } - MenuItem - { - action: Cura.Actions.resetProfile; - } - MenuItem - { - action: Cura.Actions.addProfile; - } + MenuItem { action: Cura.Actions.addProfile } + MenuItem { action: Cura.Actions.updateProfile } + MenuItem { action: Cura.Actions.resetProfile } MenuSeparator { } - MenuItem - { - action: Cura.Actions.manageProfiles; - } + MenuItem { action: Cura.Actions.manageProfiles } } UM.SimpleButton From 7d2a7bd157a334fe96dd8e215a0faf2de3e391e1 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 21:40:07 +0200 Subject: [PATCH 60/69] Abbreviate headers CURA-1668 --- resources/qml/Preferences/ProfilesPage.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index 93fd8ae61f..670bf79956 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -191,13 +191,13 @@ UM.ManagementPage visible: currentItem.id == Cura.MachineManager.activeQualityId spacing: UM.Theme.getSize("default_margin").width Label { - text: catalog.i18nc("@action:label", "Profile value") + text: catalog.i18nc("@action:label", "Profile:") width: scrollView.width / 100 * 55 horizontalAlignment: Text.AlignRight font.bold: true } Label { - text: catalog.i18nc("@action:label", "Current setting") + text: catalog.i18nc("@action:label", "Current:") visible: currentItem.id == Cura.MachineManager.activeQualityId font.bold: true } From 2287c2daa698c0300074af37c65d9c8c96855391 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Jun 2016 21:40:53 +0200 Subject: [PATCH 61/69] Show that a value is being calculated instead of showing "QVariant..." CURA-1668 --- cura/ContainerSettingsModel.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cura/ContainerSettingsModel.py b/cura/ContainerSettingsModel.py index 83a1f3ccd4..2ff1a5f401 100644 --- a/cura/ContainerSettingsModel.py +++ b/cura/ContainerSettingsModel.py @@ -5,6 +5,7 @@ from PyQt5.QtCore import pyqtProperty, Qt, pyqtSignal, pyqtSlot, QUrl from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.SettingFunction import SettingFunction class ContainerSettingsModel(ListModel): LabelRole = Qt.UserRole + 1 @@ -53,7 +54,11 @@ class ContainerSettingsModel(ListModel): while category.type != "category": category = category.parent - values.append(container.getProperty(key, "value")) + value = container.getProperty(key, "value") + if type(value) == SettingFunction: + values.append("=\u0192") + else: + values.append(container.getProperty(key, "value")) else: values.append("") From d8e8b0740ac2b1d776c13cd8078fe1b8e4f5a45d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 10 Jun 2016 00:12:35 +0200 Subject: [PATCH 62/69] Temporarily revert "Renaming profiles now also renames them on disk" This reverts commit af238d5a7656b243550c426405e2b356de877365. --- cura/MachineManagerModel.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index e3f0bd6241..6768a357a5 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -5,17 +5,12 @@ from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from UM.Application import Application from UM.Preferences import Preferences from UM.Logger import Logger -from UM.Resources import Resources - -import os -import urllib import UM.Settings from UM.Settings.Validator import ValidatorState from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerStack import ContainerStack from . import ExtruderManager -import cura.CuraApplication from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") @@ -308,19 +303,8 @@ class MachineManagerModel(QObject): def renameQualityContainer(self, container_id, new_name): containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = container_id, type = "quality") if containers: - - # Remove old container form drive. - old_id = containers[0].getId() - file_name = urllib.parse.quote_plus(old_id) + ".inst.cfg" - path = Resources.getStoragePath(cura.CuraApplication.CuraApplication.ResourceTypes.QualityInstanceContainer, - file_name) - os.remove(path) - - ## Check if the new name is allowed. new_name = self._createUniqueName("quality", containers[0].getName(), new_name, catalog.i18nc("@label", "Custom profile")) - containers[0].setName(new_name) - containers[0]._id = new_name # Todo: Fix proper id change function for this. self.activeQualityChanged.emit() From 070a522abb772854d5d59214a30f18ff8f25b940 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 10 Jun 2016 09:17:12 +0200 Subject: [PATCH 63/69] Revert "Temporarily revert "Renaming profiles now also renames them on disk"" Starting work on it again, so unreverting the revert (i guess) This reverts commit d8e8b0740ac2b1d776c13cd8078fe1b8e4f5a45d. --- cura/MachineManagerModel.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 6768a357a5..e3f0bd6241 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -5,12 +5,17 @@ from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from UM.Application import Application from UM.Preferences import Preferences from UM.Logger import Logger +from UM.Resources import Resources + +import os +import urllib import UM.Settings from UM.Settings.Validator import ValidatorState from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerStack import ContainerStack from . import ExtruderManager +import cura.CuraApplication from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") @@ -303,8 +308,19 @@ class MachineManagerModel(QObject): def renameQualityContainer(self, container_id, new_name): containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = container_id, type = "quality") if containers: + + # Remove old container form drive. + old_id = containers[0].getId() + file_name = urllib.parse.quote_plus(old_id) + ".inst.cfg" + path = Resources.getStoragePath(cura.CuraApplication.CuraApplication.ResourceTypes.QualityInstanceContainer, + file_name) + os.remove(path) + + ## Check if the new name is allowed. new_name = self._createUniqueName("quality", containers[0].getName(), new_name, catalog.i18nc("@label", "Custom profile")) + containers[0].setName(new_name) + containers[0]._id = new_name # Todo: Fix proper id change function for this. self.activeQualityChanged.emit() From 962b4e84a963f8799691b829ff701b077307065e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 10 Jun 2016 09:38:47 +0200 Subject: [PATCH 64/69] Fixed renaming of profiles. They are now correctly renamed (and saved under different name on disk as well) CURA-1683 --- cura/MachineManagerModel.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index e3f0bd6241..7cb80bbf20 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -6,6 +6,7 @@ from UM.Application import Application from UM.Preferences import Preferences from UM.Logger import Logger from UM.Resources import Resources +import copy import os import urllib @@ -303,26 +304,32 @@ class MachineManagerModel(QObject): return "" - @pyqtSlot(str, str) def renameQualityContainer(self, container_id, new_name): containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = container_id, type = "quality") if containers: + new_name = self._createUniqueName("quality", containers[0].getName(), new_name, + catalog.i18nc("@label", "Custom profile")) - # Remove old container form drive. - old_id = containers[0].getId() - file_name = urllib.parse.quote_plus(old_id) + ".inst.cfg" - path = Resources.getStoragePath(cura.CuraApplication.CuraApplication.ResourceTypes.QualityInstanceContainer, - file_name) - os.remove(path) + # As we also want the id of the container to be changed (so that profile name is the name of the file + # on disk. We need to create a new instance and remove it (so the old file of the container is removed) + # If we don't do that, we might get duplicates & other weird issues. + new_container = InstanceContainer("") + new_container.deserialize(containers[0].serialize()) - ## Check if the new name is allowed. - new_name = self._createUniqueName("quality", containers[0].getName(), new_name, catalog.i18nc("@label", "Custom profile")) + # Actually set the name + new_container.setName(new_name) + new_container._id = new_name # Todo: Fix proper id change function for this. - containers[0].setName(new_name) - containers[0]._id = new_name # Todo: Fix proper id change function for this. - self.activeQualityChanged.emit() + # Add the "new" container. + UM.Settings.ContainerRegistry.getInstance().addContainer(new_container) + # Ensure that the renamed profile is saved -before- we remove the old profile. + Application.getInstance().saveSettings() + + # Actually set & remove new / old quality. + self.setActiveQuality(new_name) + self.removeQualityContainer(containers[0].getId()) @pyqtSlot(str) def removeQualityContainer(self, container_id): From 0cf3fd36240849d30415057bb307ec70959abbf7 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 10 Jun 2016 09:41:51 +0200 Subject: [PATCH 65/69] Removed unused imports CURA-1278 --- cura/MachineManagerModel.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 7cb80bbf20..443c19d302 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -4,22 +4,16 @@ import re from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from UM.Application import Application from UM.Preferences import Preferences -from UM.Logger import Logger -from UM.Resources import Resources -import copy - -import os -import urllib import UM.Settings from UM.Settings.Validator import ValidatorState from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerStack import ContainerStack from . import ExtruderManager -import cura.CuraApplication from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") + class MachineManagerModel(QObject): def __init__(self, parent = None): super().__init__(parent) @@ -47,7 +41,6 @@ class MachineManagerModel(QObject): self.setActiveMachine(active_machine_id) pass - globalContainerChanged = pyqtSignal() activeMaterialChanged = pyqtSignal() activeVariantChanged = pyqtSignal() From b61b0a7ee2e11adf6bbf150a61bf48e226fd57c5 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 10 Jun 2016 10:52:12 +0200 Subject: [PATCH 66/69] Removing unneeded import of os' --- cura_app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index dc748435f9..3bcce18fb5 100755 --- a/cura_app.py +++ b/cura_app.py @@ -36,7 +36,6 @@ import Arcus #@UnusedImport import cura.CuraApplication if sys.platform == "win32" and hasattr(sys, "frozen"): - import os dirpath = os.path.expanduser("~/AppData/Local/cura/") os.makedirs(dirpath, exist_ok = True) sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w") From e2e9e7964c2bbfb1274df5f017350746fc7385e2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 10 Jun 2016 11:48:33 +0200 Subject: [PATCH 67/69] Fixed duplication if no name was changed CURA-1427 --- cura/MachineManagerModel.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 443c19d302..0e7230fb79 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -304,6 +304,10 @@ class MachineManagerModel(QObject): new_name = self._createUniqueName("quality", containers[0].getName(), new_name, catalog.i18nc("@label", "Custom profile")) + if containers[0].getName() == new_name: + # Nothing to do. + return + # As we also want the id of the container to be changed (so that profile name is the name of the file # on disk. We need to create a new instance and remove it (so the old file of the container is removed) # If we don't do that, we might get duplicates & other weird issues. From 9672b3360c92728fba54466f7e1584e444aae7a2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 10 Jun 2016 12:26:11 +0200 Subject: [PATCH 68/69] Changing settings in extruder stack now also triggers reslice CURA-1689 --- cura/ExtruderManager.py | 6 ++++++ plugins/CuraEngineBackend/CuraEngineBackend.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/cura/ExtruderManager.py b/cura/ExtruderManager.py index edd6ab7d23..578905a63a 100644 --- a/cura/ExtruderManager.py +++ b/cura/ExtruderManager.py @@ -66,6 +66,12 @@ class ExtruderManager(QObject): self._active_extruder_index = index self.activeExtruderChanged.emit() + def getActiveExtruderStack(self): + try: + return self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getBottom().getId()][str(self._active_extruder_index)] + except AttributeError: + return None + ## Adds all extruders of a specific machine definition to the extruder # manager. # diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 3e22f8f6fb..80f2614e87 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -12,6 +12,8 @@ from UM.PluginRegistry import PluginRegistry from UM.Resources import Resources from UM.Settings.Validator import ValidatorState #To find if a setting is in an error state. We can't slice then. +from cura.ExtruderManager import ExtruderManager + from cura.OneAtATimeIterator import OneAtATimeIterator from . import ProcessSlicedLayersJob from . import ProcessGCodeJob @@ -59,6 +61,10 @@ class CuraEngineBackend(Backend): Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() + self._active_extruder_stack = None + ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged) + self._onActiveExtruderChanged() + #When you update a setting and other settings get changed through inheritance, many propertyChanged signals are fired. #This timer will group them up, and only slice for the last setting changed signal. #TODO: Properly group propertyChanged signals by whether they are triggered by the same user interaction. @@ -367,4 +373,16 @@ class CuraEngineBackend(Backend): if self._global_container_stack: self._global_container_stack.propertyChanged.connect(self._onSettingChanged) #Note: Only starts slicing when the value changed. self._global_container_stack.containersChanged.connect(self._onChanged) + self._onActiveExtruderChanged() self._onChanged() + + def _onActiveExtruderChanged(self): + if self._active_extruder_stack: + self._active_extruder_stack.propertyChanged.disconnect(self._onSettingChanged) + self._active_extruder_stack.containersChanged.disconnect(self._onChanged) + + self._active_extruder_stack = ExtruderManager.getInstance().getActiveExtruderStack() + if self._active_extruder_stack: + self._active_extruder_stack.propertyChanged.connect(self._onSettingChanged) # Note: Only starts slicing when the value changed. + self._active_extruder_stack.containersChanged.connect(self._onChanged) + self._onChanged() \ No newline at end of file From 179b6eeaac0381b5ddc4faa941da981dba4ade30 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 10 Jun 2016 13:16:54 +0200 Subject: [PATCH 69/69] Fixed issue where not having a machine caused extruder retrieval to fail CURA-1689 --- cura/ExtruderManager.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/ExtruderManager.py b/cura/ExtruderManager.py index 578905a63a..72b6086e26 100644 --- a/cura/ExtruderManager.py +++ b/cura/ExtruderManager.py @@ -71,6 +71,8 @@ class ExtruderManager(QObject): return self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getBottom().getId()][str(self._active_extruder_index)] except AttributeError: return None + except KeyError: + return None ## Adds all extruders of a specific machine definition to the extruder # manager.