From b4b24822bb4660b96a7e0661eecd58092570862e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 2 May 2016 16:44:02 +0200 Subject: [PATCH 001/224] First stub of reworked FDM printer CURA-1278 --- resources/machines/fdmprinter.def.json | 2452 ++++++++++++++++++++++++ 1 file changed, 2452 insertions(+) create mode 100644 resources/machines/fdmprinter.def.json diff --git a/resources/machines/fdmprinter.def.json b/resources/machines/fdmprinter.def.json new file mode 100644 index 0000000000..3d39e8a652 --- /dev/null +++ b/resources/machines/fdmprinter.def.json @@ -0,0 +1,2452 @@ +{ + "id": "fdmprinter", + "version": 2, + "metadata": + { + "category": "Ultimaker", + "manufacturer": "Ultimaker", + "visible": false + }, + "name": "FDM Printer Base Description", + "author": "Ultimaker B.V.", + "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", + + "settings": + { + "machine_settings": + { + "label": "Machine", + "type": "category", + "description": "Machine specific settings", + "children": + { + "machine_show_variants": { + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "machine_width": { + "description": "The width (X-direction) of the printable area.", + "default_value": 100, + "global_only": true, + "type": "float", + "label": "Machine width" + }, + "machine_depth": { + "description": "The depth (Y-direction) of the printable area.", + "default_value": 100, + "global_only": true, + "type": "float", + "label": "Machine depth" + }, + "machine_height": { + "description": "The height (Z-direction) of the printable area.", + "default_value": 100, + "global_only": true, + "type": "float", + "label": "Machine height" + }, + "machine_heated_bed": { + "description": "Whether the machine has a heated bed present.", + "default_value": false, + "global_only": true, + "label": "Has heated bed", + "type": "bool" + }, + "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" + }, + "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": "bool", + "label": "Number extruders" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "machine_gcode_flavor": { + "description": "The type of gcode to be generated.", + "default_value": "RepRap", + "global_only": true, + "type": "str", + "label": "Gcode flavour" + }, + "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" + }, + "machine_head_polygon": { + "description": "A 2D silhouette of the print head (fan caps excluded).", + "type": "polygon", + "default_value": [ + [ + -1, + 1 + ], + [ + -1, + -1 + ], + [ + 1, + -1 + ], + [ + 1, + 1 + ] + ], + "global_only": true, + "label": "Machine head polygon" + }, + "machine_head_with_fans_polygon": { + "description": "A 2D silhouette of the print head (fan caps included).", + "type": "polygon", + "default_value": [ + [ + -20, + 10 + ], + [ + 10, + 10 + ], + [ + 10, + -10 + ], + [ + -20, + -10 + ] + ], + "global_only": true, + "label": "Machine head & Fan polygon" + }, + "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" + }, + "machine_nozzle_size": { + "label": "Nozzle Diameter", + "description": "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size.", + "unit": "mm", + "type": "float", + "default_value": 0.4, + "minimum_value": "0.001", + "maximum_value_warning": "10", + "visible": false + } + } + }, + "resolution": + { + "label": "Quality", + "type": "category", + "icon": "category_layer_height", + "description": "All settings that influence the resolution of the print. These settings have a large impact on the quality (and print time)", + "children": + { + "layer_height": + { + "label": "Layer Height", + "description": "The height of each layer in mm. Higher values produce faster prints in lower resolution, lower values produce slower prints in higher resolution.", + "unit": "mm", + "type": "float", + "default_value": 0.1, + "minimum_value": "0.001", + "minimum_value_warning": "0.04", + "maximum_value_warning": "0.8 * machine_nozzle_size", + "global_only": "True" + }, + "layer_height_0": + { + "label": "Initial Layer Height", + "description": "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0.001", + "minimum_value_warning": "0.04", + "maximum_value_warning": "0.8 * machine_nozzle_size", + "global_only": "True" + }, + "line_width": + { + "label": "Line Width", + "description": "Width of a single line. Generally, the width of each line should correspond to the width of the nozzle. However, slightly reducing this value could produce better prints.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "2 * machine_nozzle_size", + "default_value": 0.4, + "type": "float", + "inherit_function": "machine_nozzle_size", + "children": + { + "wall_line_width": + { + "label": "Wall Line Width", + "description": "Width of a single wall line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float", + "children": + { + "wall_line_width_0": + { + "label": "Outer Wall Line Width", + "description": "Width of the outermost wall line. By lowering this value, higher levels of detail can be printed.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float" + }, + "wall_line_width_x": + { + "label": "Inner Wall(s) Line Width", + "description": "Width of a single wall line for all wall lines except the outermost one.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float" + } + } + }, + "skin_line_width": + { + "label": "Top/bottom Line Width", + "description": "Width of a single top/bottom line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float" + }, + "infill_line_width": + { + "label": "Infill Line Width", + "description": "Width of a single infill line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float" + }, + "skirt_line_width": + { + "label": "Skirt Line Width", + "description": "Width of a single skirt line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float", + "global_only": true + }, + "support_line_width": + { + "label": "Support Line Width", + "description": "Width of a single support structure line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float", + "enabled": "support_enable", + "global_only": true + }, + "support_roof_line_width": + { + "label": "Support Roof Line Width", + "description": "Width of a single support roof line.", + "unit": "mm", + "default_value": 0.4, + "minimum_value": "0.0001", + "maximum_value_warning": "machine_nozzle_size * 2", + "type": "float", + "enabled": "support_roof_enable", + "global_only": true + } + } + } + } + }, + "shell": + { + "label": "Shell", + "visible": true, + "icon": "category_shell", + "description": "Shell", + "type": "category", + "children": + { + "wall_thickness": + { + "label": "Wall Thickness", + "description": "The thickness of the outside walls in the horizontal direction. This value divided by the wall line width defines the number of walls.", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "minimum_value_warning": "line_width", + "maximum_value_warning": "5 * line_width", + "type": "float", + "children": + { + "wall_line_count": + { + "label": "Wall Line Count", + "description": "The number of walls. When calculated by the wall thickness, this value is rounded to a whole number.", + "default_value": 2, + "minimum_value": "0", + "type": "int", + "inherit_function": "1 if magic_spiralize else max(1, round((wall_thickness - wall_line_width_0) / wall_line_width_x) + 1)" + } + } + }, + "top_bottom_thickness": + { + "label": "Top/Bottom Thickness", + "description": "The thickness of the top/bottom layers in the print. This value divided by the layer height defines the number of top/bottom layers.", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "maximum_value": "5", + "minimum_value_warning": "0.6", + "type": "float", + "children": + { + "top_thickness": + { + "label": "Top Thickness", + "description": "The thickness of the top layers in the print. This value divided by the layer height defines the number of top layers.", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "children": + { + "top_layers": + { + "label": "Top Layers", + "description": "The number of top layers. When calculated by the top thickness, this value is rounded to a whole number.", + "default_value": 8, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "int", + "inherit_function": "0 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" + } + } + }, + "bottom_thickness": + { + "label": "Bottom Thickness", + "description": "The thickness of the bottom layers in the print. This value divided by the layer height defines the number of bottom layers.", + "unit": "mm", + "default_value": 0.6, + "minimum_value": "0", + "type": "float", + "children": + { + "bottom_layers": + { + "label": "Bottom Layers", + "description": "The number of bottom layers. When calculated by the bottom thickness, this value is rounded to a whole number.", + "minimum_value": "0", + "default_value": 6, + "type": "int", + "inherit_function": "999999 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" + } + } + } + } + }, + "top_bottom_pattern": + { + "label": "Top/Bottom Pattern", + "description": "The pattern of the top/bottom layers.", + "type": "enum", + "options": + { + "lines": "Lines", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "lines" + }, + "wall_0_inset": + { + "label": "Outer Wall Inset", + "description": "Inset applied to the path of the outer wall. If the outer wall is smaller than the nozzle, and printed after the inner walls, use this offset to get the hole in the nozzle to overlap with the inner walls instead of the outside of the object.", + "unit": "mm", + "type": "float", + "default_value": 0.0, + "inherit_function": "(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" + }, + "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, + "inherit": false + }, + "remove_overlapping_walls_enabled": + { + "label": "Remove Overlapping Wall Parts", + "description": "Remove parts of a wall which share an overlap which would result in overextrusion in some places. These overlaps occur in thin parts and sharp corners in models.", + "type": "bool", + "default_value": false, + "enabled": "False", + "children": + { + "remove_overlapping_walls_0_enabled": + { + "label": "Remove Overlapping Outer Wall Parts", + "description": "Remove parts of an outer wall which share an overlap which would result in overextrusion in some places. These overlaps occur in thin pieces in a model and sharp corners.", + "type": "bool", + "default_value": false, + "inherit": true, + "enabled": "False" + }, + "remove_overlapping_walls_x_enabled": + { + "label": "Remove Overlapping Inner Wall Parts", + "description": "Remove parts of an inner wall that would otherwise overlap and cause over-extrusion. These overlaps occur in thin pieces in a model and sharp corners.", + "type": "bool", + "default_value": true, + "inherit": false + } + } + }, + "fill_perimeter_gaps": + { + "label": "Fill Gaps Between Walls", + "description": "Fills the gaps between walls when overlapping inner wall parts are removed.", + "type": "enum", + "options": + { + "nowhere": "Nowhere", + "everywhere": "Everywhere", + "skin": "Skin" + }, + "default_value": "everywhere", + "enabled": "remove_overlapping_walls_x_enabled" + }, + "travel_compensate_overlapping_walls_enabled": + { + "label": "Compensate Wall Overlaps", + "description": "Compensate the flow for parts of a wall being printed where there is already a wall in place.", + "type": "bool", + "default_value": true + }, + "xy_offset": + { + "label": "Horizontal Expansion", + "description": "Amount of offset applied to all polygons in each layer. Positive values can compensate for too big holes; negative values can compensate for too small holes.", + "unit": "mm", + "type": "float", + "minimum_value_warning": "-10", + "maximum_value_warning": "10", + "default_value": 0 + }, + "z_seam_type": + { + "label": "Z Seam Alignment", + "description": "Starting point of each path in a layer. When paths in consecutive layers start at the same point a vertical seam may show on the print. When aligning these at the back, the seam is easiest to remove. When placed randomly the inaccuracies at the paths' start will be less noticeable. When taking the shortest path the print will be quicker.", + "type": "enum", + "options": + { + "back": "Back", + "shortest": "Shortest", + "random": "Random" + }, + "default_value": "shortest" + }, + "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 + } + } + }, + "infill": + { + "label": "Infill", + "icon": "category_infill", + "description": "Infill", + "type": "category", + "children": + { + "infill_sparse_density": + { + "label": "Infill Density", + "description": "Adjusts the density of infill of the print.", + "unit": "%", + "type": "float", + "default_value": 20, + "minimum_value": "0", + "maximum_value_warning": "100", + "children": + { + "infill_line_distance": + { + "label": "Infill Line Distance", + "description": "Distance between the printed infill lines. This setting is calculated by the infill density and the infill line width.", + "unit": "mm", + "type": "float", + "default_value": 2, + "minimum_value": "0", + "inherit_function": "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))" + } + } + }, + "infill_pattern": + { + "label": "Infill Pattern", + "description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle and concentric patterns are fully printed every layer.", + "type": "enum", + "options": + { + "grid": "Grid", + "lines": "Lines", + "triangles": "Triangles", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "grid", + "inherit_function": "'lines' if infill_sparse_density > 25 else 'grid'" + }, + "infill_overlap": + { + "label": "Infill Overlap Percentage", + "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", + "unit": "%", + "type": "float", + "default_value": 10, + "inherit_function": "10 if infill_sparse_density < 95 else 0", + "minimum_value_warning": "-50", + "maximum_value_warning": "100", + "children": + { + "infill_overlap_mm": + { + "label": "Infill Overlap", + "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", + "unit": "mm", + "type": "float", + "default_value": 0.04, + "minimum_value_warning": "-0.5 * machine_nozzle_size", + "maximum_value_warning": "machine_nozzle_size", + "inherit_function": "infill_line_width * parent_value / 100 if infill_sparse_density < 95 else 0" + } + } + }, + "infill_wipe_dist": + { + "label": "Infill Wipe Distance", + "description": "Distance of a travel move inserted after every infill line, to make the infill stick to the walls better. This option is similar to infill overlap, but without extrusion and only on one end of the infill line.", + "unit": "mm", + "type": "float", + "default_value": 0.04, + "inherit_function": "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" + }, + "infill_sparse_thickness": + { + "label": "Infill Layer Thickness", + "description": "The thickness per layer of infill material. This value should always be a multiple of the layer height and is otherwise rounded.", + "unit": "mm", + "type": "float", + "default_value": 0.1, + "minimum_value": "0.0001", + "maximum_value_warning": "0.32", + "maximum_value": "layer_height * 8", + "inherit_function": "layer_height" + }, + "infill_before_walls": + { + "label": "Infill Before Walls", + "description": "Print the infill before printing the walls. Printing the walls first may lead to more accurate walls, but overhangs print worse. Printing the infill first leads to sturdier walls, but the infill pattern might sometimes show through the surface.", + "type": "bool", + "default_value": true + } + } + }, + "material": + { + "label": "Material", + "icon": "category_material", + "description": "Material", + "type": "category", + "children": + { + "material_flow_dependent_temperature": { + "label": "Auto Temperature", + "description": "Change the temperature for each layer automatically with the average flow speed of that layer.", + "type": "bool", + "default_value": false, + "visible": false, + "enabled": "False", + "global_only": true + }, + "material_print_temperature": { + "label": "Printing Temperature", + "description": "The temperature used for printing. Set at 0 to pre-heat the printer manually.", + "unit": "°C", + "type": "float", + "default_value": 210, + "minimum_value": "0", + "maximum_value_warning": "260", + "enabled": "not (material_flow_dependent_temperature)" + }, + "material_flow_temp_graph": { + "label": "Flow Temperature Graph", + "description": "Data linking material flow (in mm3 per second) to temperature (degrees Celsius).", + "unit": "", + "type": "str", + "default_value": "[[3.5,200],[7.0,240]]", + "enabled": "False", + "enabled_before_removal": "material_flow_dependent_temperature", + "global_only": true + }, + "material_extrusion_cool_down_speed": { + "label": "Extrusion Cool Down Speed Modifier", + "description": "The extra speed by which the nozzle cools while extruding. The same value is used to signify the heat up speed lost when heating up while extruding.", + "unit": "°C/s", + "type": "float", + "default_value": 0.5, + "minimum_value": "0", + "maximum_value_warning": "10.0", + "global_only": "True", + "enabled": "False", + "enabled_before_removal": "material_flow_dependent_temperature or machine_extruder_count > 1", + "visible": false + }, + "material_bed_temperature": { + "label": "Bed Temperature", + "description": "The temperature used for the heated bed. Set at 0 to pre-heat the printer manually.", + "unit": "°C", + "type": "float", + "default_value": 60, + "minimum_value": "0", + "maximum_value_warning": "260", + "enabled": "machine_heated_bed", + "global_only": "True" + }, + "material_diameter": { + "label": "Diameter", + "description": "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament.", + "unit": "mm", + "type": "float", + "default_value": 2.85, + "minimum_value": "0.0001", + "minimum_value_warning": "0.4", + "maximum_value_warning": "3.5", + "global_only": "True" + }, + "material_flow": { + "label": "Flow", + "description": "Flow compensation: the amount of material extruded is multiplied by this value.", + "unit": "%", + "default_value": 100, + "type": "float", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150" + }, + "retraction_enable": { + "label": "Enable Retraction", + "description": "Retract the filament when the nozzle is moving over a non-printed area. ", + "type": "bool", + "default_value": true, + "visible": true + }, + "retraction_amount": { + "label": "Retraction Distance", + "description": "The length of material retracted during a retraction move.", + "unit": "mm", + "type": "float", + "default_value": 6.5, + "minimum_value_warning": "-0.0001", + "maximum_value_warning": "10.0", + "visible": false, + "inherit": false, + "enabled": "retraction_enable" + }, + "retraction_speed": { + "label": "Retraction Speed", + "description": "The speed at which the filament is retracted and primed during a retraction move.", + "unit": "mm/s", + "type": "float", + "default_value": 25, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "visible": false, + "inherit": false, + "enabled": "retraction_enable", + "children": { + "retraction_retract_speed": { + "label": "Retraction Retract Speed", + "description": "The speed at which the filament is retracted during a retraction move.", + "unit": "mm/s", + "type": "float", + "default_value": 25, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "visible": false, + "enabled": "retraction_enable" + }, + "retraction_prime_speed": { + "label": "Retraction Prime Speed", + "description": "The speed at which the filament is primed during a retraction move.", + "unit": "mm/s", + "type": "float", + "default_value": 25, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "visible": false, + "enabled": "retraction_enable" + } + } + }, + "retraction_extra_prime_amount": { + "label": "Retraction Extra Prime Amount", + "description": "Some material can ooze away during a travel move, which can be compensated for here.", + "unit": "mm³", + "type": "float", + "default_value": 0, + "minimum_value_warning": "-0.0001", + "maximum_value_warning": "5.0", + "visible": false, + "inherit": false, + "enabled": "retraction_enable" + }, + "retraction_min_travel": { + "label": "Retraction Minimum Travel", + "description": "The minimum distance of travel needed for a retraction to happen at all. This helps to get fewer retractions in a small area.", + "unit": "mm", + "type": "float", + "default_value": 1.5, + "inherit_function": "line_width * 2", + "minimum_value": "0", + "maximum_value_warning": "10", + "visible": false, + "inherit": false, + "enabled": "retraction_enable" + }, + "retraction_count_max": { + "label": "Maximum Retraction Count", + "description": "This setting limits the number of retractions occurring within the minimum extrusion distance window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament, as that can flatten the filament and cause grinding issues.", + "default_value": 45, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "int", + "visible": false, + "inherit": false, + "enabled": "retraction_enable" + }, + "retraction_extrusion_window": { + "label": "Minimum Extrusion Distance Window", + "description": "The window in which the maximum retraction count is enforced. This value should be approximately the same as the retraction distance, so that effectively the number of times a retraction passes the same patch of material is limited.", + "unit": "mm", + "type": "float", + "default_value": 4.5, + "minimum_value": "0", + "maximum_value_warning": "retraction_amount * 2", + "visible": false, + "inherit_function": "retraction_amount", + "enabled": "retraction_enable" + }, + "retraction_hop": { + "label": "Z Hop when Retracting", + "description": "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.", + "unit": "mm", + "type": "float", + "default_value": 0, + "minimum_value_warning": "-0.0001", + "maximum_value_warning": "10", + "inherit": false, + "enabled": "retraction_enable" + } + } + }, + "speed": + { + "label": "Speed", + "icon": "category_speed", + "description": "Speed", + "type": "category", + "children": + { + "speed_print": + { + "label": "Print Speed", + "description": "The speed at which printing happens.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value_warning": "150", + "maximum_value": "299792458000", + "default_value": 60, + "children": + { + "speed_infill": + { + "label": "Infill Speed", + "description": "The speed at which infill is printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 60 + }, + "speed_wall": + { + "label": "Wall Speed", + "description": "The speed at which the walls are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 30, + "visible": false, + "inherit_function": "parent_value / 2", + "children": + { + "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.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 30 + }, + "speed_wall_x": + { + "label": "Inner Wall Speed", + "description": "The speed at which all inner walls are printed Printing the inner wall faster than the outer wall will reduce printing time. It works well to set this in between the outer wall speed and the infill speed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 60, + "inherit_function": "parent_value * 2" + } + } + }, + "speed_topbottom": + { + "label": "Top/Bottom Speed", + "description": "The speed at which top/bottom layers are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 30, + "inherit_function": "parent_value / 2" + }, + "speed_support": + { + "label": "Support Speed", + "description": "The speed at which the support structure is printed. Printing support at higher speeds can greatly reduce printing time. The surface quality of the support structure is not important since it is removed after printing.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 60, + "inherit_function": "speed_print", + "enabled": "support_roof_enable", + "children": + { + "speed_support_infill": + { + "label": "Support Infill Speed", + "description": "The speed at which the infill of support is printed. Printing the infill at lower speeds improves stability.", + "unit": "mm/s", + "type": "float", + "default_value": 60, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "inherit": true, + "enabled": "support_enable", + "global_only": true + }, + "speed_support_roof": + { + "label": "Support Roof Speed", + "description": "The speed at which the roofs of support are printed. Printing the support roof at lower speeds can improve overhang quality.", + "unit": "mm/s", + "type": "float", + "default_value": 40, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "enabled": "support_roof_enable", + "inherit_function": "parent_value / 1.5", + "global_only": true + } + } + } + } + }, + "speed_travel": + { + "label": "Travel Speed", + "description": "The speed at which travel moves are made.", + "unit": "mm/s", + "type": "float", + "default_value": 120, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "300", + "inherit_function": "speed_print if magic_spiralize else 120", + "global_only": true + }, + "speed_layer_0": { + "label": "Initial Layer Speed", + "description": "The print speed for the initial layer. A lower value is advised to improve adhesion to the build plate.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "300" + }, + "skirt_speed": { + "label": "Skirt Speed", + "description": "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed, but sometimes you might want to print the skirt at a different speed.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "300", + "inherit_function": "speed_layer_0", + "global_only": true + }, + "speed_slowdown_layers": + { + "label": "Number of Slower Layers", + "description": "The first few layers are printed slower than the rest of the object, to get better adhesion to the build plate and improve the overall success rate of prints. The speed is gradually increased over these layers.", + "type": "int", + "default_value": 2, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "300", + "global_only": true + } + } + }, + "travel": + { + "label": "Travel", + "icon": "category_travel", + "description": "travel", + "type": "category", + "children": + { + "retraction_combing": + { + "label": "Combing Mode", + "description": "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only.", + "type": "enum", + "options": + { + "off": "Off", + "all": "All", + "noskin": "No Skin" + }, + "default_value": "all", + "global_only": true + }, + "travel_avoid_other_parts": + { + "label": "Avoid Printed Parts when Traveling", + "description": "The nozzle avoids already printed parts when traveling. This option is only available when combing is enabled.", + "type": "bool", + "default_value": true, + "enabled": "retraction_combing != \"off\"", + "global_only": "True" + }, + "travel_avoid_distance": + { + "label": "Travel Avoid Distance", + "description": "The distance between the nozzle and already printed parts when avoiding during travel moves.", + "unit": "mm", + "type": "float", + "default_value": 1.5, + "inherit_function": "machine_nozzle_tip_outer_diameter / 2 * 1.25", + "minimum_value": "0", + "maximum_value_warning": "machine_nozzle_tip_outer_diameter * 5", + "inherit": false, + "enabled": "retraction_combing != \"off\" and travel_avoid_other_parts", + "global_only": "True" + } + } + }, + "cooling": + { + "label": "Cooling", + "icon": "category_cool", + "description": "Cooling", + "type": "category", + "children": + { + "cool_fan_enabled": + { + "label": "Enable Cooling Fans", + "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" + }, + "cool_fan_speed": + { + "label": "Fan Speed", + "description": "The speed at which the cooling fans spin.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 100, + "inherit_function": "100.0 if cool_fan_enabled else 0.0", + "enabled": "cool_fan_enabled", + "global_only": "True", + "children": + { + "cool_fan_speed_min": + { + "label": "Regular Fan Speed", + "description": "The speed at which the fans spin before hitting the threshold. When a layer prints faster than the threshold, the fan speed gradually inclines towards the maximum fan speed.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "inherit_function": "parent_value", + "default_value": 100, + "visible": false, + "enabled": "cool_fan_enabled", + "global_only": "True" + }, + "cool_fan_speed_max": + { + "label": "Maximum Fan Speed", + "description": "The speed at which the fans spin on the minimum layer time. The fan speed gradually increases between the regular fan speed and maximum fan speed when the threshold is hit.", + "unit": "%", + "type": "float", + "minimum_value": "max(0, cool_fan_speed_min)", + "maximum_value": "100", + "default_value": 100, + "enabled": "cool_fan_enabled", + "global_only": "True" + } + } + }, + "cool_min_layer_time_fan_speed_max": + { + "label": "Regular/Maximum Fan Speed Threshold", + "description": "The layer time which sets the threshold between regular fan speed and maximum fan speed. Layers that print slower than this time use regular fan speed. For faster layers the fan speed gradually increases towards the maximum fan speed.", + "unit": "sec", + "type": "float", + "default_value": 10, + "minimum_value": "cool_min_layer_time", + "maximum_value_warning": "600", + "global_only": "True" + }, + "cool_fan_full_at_height": + { + "label": "Regular Fan Speed at Height", + "description": "The height at which the fans spin on regular fan speed. At the layers below the fan speed gradually increases from zero to regular fan speed.", + "unit": "mm", + "type": "float", + "default_value": 0.5, + "inherit_function": "layer_height_0", + "minimum_value": "0", + "maximum_value_warning": "10.0", + "global_only": "True", + "children": + { + "cool_fan_full_layer": + { + "label": "Regular Fan Speed at Layer", + "description": "The layer at which the fans spin on regular fan speed. If regular fan speed at height is set, this value is calculated and rounded to a whole number.", + "type": "int", + "default_value": 1, + "minimum_value": "0", + "maximum_value_warning": "100", + "inherit_function": "int((parent_value - layer_height_0 + 0.001) / layer_height) + 1", + "global_only": "True" + } + } + }, + "cool_min_layer_time": + { + "label": "Minimum Layer Time", + "description": "The minimum time spent in a layer. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer.", + "unit": "sec", + "type": "float", + "default_value": 5, + "minimum_value": "0", + "maximum_value_warning": "600", + "global_only": "True" + }, + "cool_min_speed": + { + "label": "Minimum Speed", + "description": "The minimum print speed, despite slowing down due to the minimum layer time. When the printer would slow down too much, the pressure in the nozzle would be too low and result in bad print quality.", + "unit": "mm/s", + "type": "float", + "default_value": 10, + "minimum_value": "0", + "maximum_value_warning": "100", + "global_only": "True" + }, + "cool_lift_head": + { + "label": "Lift Head", + "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" + } + } + }, + "support": + { + "label": "Support", + "type": "category", + "icon": "category_support", + "description": "Support", + "children": + { + "support_enable": + { + "label": "Enable Support", + "description": "Enable support structures. These structures support parts of the model with severe overhangs.", + "type": "bool", + "default_value": false + }, + "support_type": + { + "label": "Support Placement", + "description": "Adjusts the placement of the support structures. The placement can be set to touching build plate or everywhere. When set to everywhere the support structures will also be printed on the model.", + "type": "enum", + "options": + { + "buildplate": "Touching Buildplate", + "everywhere": "Everywhere" + }, + "default_value": "everywhere", + "enabled": "support_enable" + }, + "support_angle": + { + "label": "Support Overhang Angle", + "description": "The minimum angle of overhangs for which support is added. At a value of 0° all overhangs are supported, 90° will not provide any support.", + "unit": "°", + "type": "float", + "minimum_value": "0", + "maximum_value": "90", + "default_value": 50, + "enabled": "support_enable" + }, + "support_pattern": + { + "label": "Support Pattern", + "description": "The pattern of the support structures of the print. The different options available result in sturdy or easy to remove support.", + "type": "enum", + "options": + { + "lines": "Lines", + "grid": "Grid", + "triangles": "Triangles", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "zigzag", + "enabled": "support_enable", + "global_only": true + }, + "support_connect_zigzags": + { + "label": "Connect Support ZigZags", + "description": "Connect the ZigZags. This will increase the strength of the zig zag support structure.", + "type": "bool", + "default_value": true, + "enabled": "support_enable and (support_pattern == \"zigzag\")", + "global_only": true + }, + "support_infill_rate": + { + "label": "Support Density", + "description": "Adjusts the density of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "100", + "default_value": 15, + "enabled": "support_enable", + "global_only": true, + "children": { + "support_line_distance": + { + "label": "Support Line Distance", + "description": "Distance between the printed support structure lines. This setting is calculated by the support density.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "default_value": 2.66, + "enabled": "support_enable", + "inherit_function": "(support_line_width * 100) / parent_value * (2 if support_pattern == \"grid\" else (3 if support_pattern == \"triangles\" else 1))", + "global_only": true + } + } + }, + "support_xy_distance": + { + "label": "Support X/Y Distance", + "description": "Distance of the support structure from the print in the X/Y directions.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.7, + "enabled": "support_enable" + }, + "support_z_distance": + { + "label": "Support Z Distance", + "description": "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded down to a multiple of the layer height.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.15, + "enabled": "support_enable", + + "children": + { + "support_top_distance": + { + "label": "Support Top Distance", + "description": "Distance from the top of the support to the print.", + "unit": "mm", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.15, + "type": "float", + "enabled": "support_enable" + }, + "support_bottom_distance": + { + "label": "Support Bottom Distance", + "description": "Distance from the print to the bottom of the support.", + "unit": "mm", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.1, + "inherit_function": "0.1 if support_type == 'everywhere' else 0", + "type": "float", + "enabled": "support_enable and support_type == 'everywhere'" + } + } + }, + "support_bottom_stair_step_height": + { + "label": "Support Stair Step Height", + "description": "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0", + "maximum_value_warning": "1.0", + "enabled": "support_enable" + }, + "support_join_distance": + { + "label": "Support Join Distance", + "description": "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one.", + "unit": "mm", + "type": "float", + "default_value": 2.0, + "minimum_value_warning": "0", + "maximum_value_warning": "10", + "enabled": "support_enable" + }, + "support_offset": + { + "label": "Support Horizontal Expansion", + "description": "Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support.", + "unit": "mm", + "type": "float", + "default_value": 0.2, + "minimum_value_warning": "-0.5", + "maximum_value_warning": "5.0", + "enabled": "support_enable" + }, + "support_area_smoothing": + { + "label": "Support Area Smoothing", + "description": "Maximum distance in the X/Y directions of a line segment which is to be smoothed out. Ragged lines are introduced by the join distance and support bridge, which cause the machine to resonate. Smoothing the support areas won't cause them to break with the constraints, except it might change the overhang.", + "unit": "mm", + "type": "float", + "default_value": 0.6, + "minimum_value": "0", + "maximum_value_warning": "1.0", + "enabled": "support_enable" + }, + "support_roof_enable": + { + "label": "Enable Support Roof", + "description": "Generate a dense top skin at the top of the support on which the model is printed.", + "type": "bool", + "default_value": false, + "visible": true, + "enabled": "support_enable" + }, + "support_roof_height": + { + "label": "Support Roof Thickness", + "description": "The thickness of the support roofs.", + "unit": "mm", + "type": "float", + "default_value": 1, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "support_roof_enable" + }, + "support_roof_density": + { + "label": "Support Roof Density", + "description": "Adjusts the density of the roof of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", + "unit": "%", + "type": "float", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "enabled":"support_roof_enable", + "global_only": true, + "children": + { + "support_roof_line_distance": + { + "label": "Support Roof Line Distance", + "description": "Distance between the printed support roof lines. This setting is calculated by the support roof Density, but can be adjusted separately.", + "unit": "mm", + "type": "float", + "default_value": 0.4, + "minimum_value": "0", + "inherit_function": "0 if parent_value == 0 else (support_roof_line_width * 100) / parent_value * (2 if support_roof_pattern == \"grid\" else (3 if support_roof_pattern == \"triangles\" else 1))", + "enabled": "support_roof_enable", + "global_only": true + } + } + }, + "support_roof_pattern": + { + "label": "Support Roof Pattern", + "description": "The pattern with which the top of the support is printed.", + "type": "enum", + "options": + { + "lines": "Lines", + "grid": "Grid", + "triangles": "Triangles", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "concentric", + "enabled": "support_roof_enable", + "global_only": true + }, + "support_use_towers": + { + "label": "Use Towers", + "description": "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof.", + "type": "bool", + "default_value": true, + "enabled": "support_enable" + }, + "support_tower_diameter": + { + "label": "Tower Diameter", + "description": "The diameter of a special tower.", + "unit": "mm", + "type": "float", + "default_value": 3.0, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "support_enable and support_use_towers" + }, + "support_minimal_diameter": + { + "label": "Minimum Diameter", + "description": "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.", + "unit": "mm", + "type": "float", + "default_value": 3.0, + "minimum_value": "0", + "maximum_value_warning": "10", + "maximum_value": "support_tower_diameter", + "inherit": true, + "enabled": "support_enable and support_use_towers" + }, + "support_tower_roof_angle": + { + "label": "Tower Roof Angle", + "description": "The angle of a rooftop of a tower. A higher value results in pointed tower roofs, a lower value results in flattened tower roofs.", + "unit": "°", + "type": "int", + "minimum_value": "0", + "maximum_value": "90", + "default_value": 65, + "enabled": "support_enable and support_use_towers" + } + } + }, + "platform_adhesion": + { + "label": "Platform Adhesion", + "type": "category", + "icon": "category_adhesion", + "description": "Adhesion", + "children": + { + "adhesion_type": + { + "label": "Platform Adhesion Type", + "description": "Different options that help to improve both priming your extrusion and adhesion to the build plate. Brim adds a single layer flat area around the base of your object to prevent warping. Raft adds a thick grid with a roof below the object. Skirt is a line printed around the object, but not connected to the model.", + "type": "enum", + "options": + { + "skirt": "Skirt", + "brim": "Brim", + "raft": "Raft" + }, + "default_value": "brim", + "global_only": "True" + }, + "skirt_line_count": + { + "label": "Skirt Line Count", + "description": "Multiple skirt lines help to prime your extrusion better for small objects. Setting this to 0 will disable the skirt.", + "type": "int", + "default_value": 1, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "adhesion_type == \"skirt\"", + "global_only": "True" + }, + "skirt_gap": + { + "label": "Skirt Distance", + "description": "The horizontal distance between the skirt and the first layer of the print.\nThis is the minimum distance, multiple skirt lines will extend outwards from this distance.", + "unit": "mm", + "type": "float", + "default_value": 3, + "minimum_value_warning": "0", + "maximum_value_warning": "100", + "enabled": "adhesion_type == \"skirt\"", + "global_only": "True" + }, + "skirt_minimal_length": + { + "label": "Skirt Minimum Length", + "description": "The minimum length of the skirt. If this length is not reached by the skirt line count, more skirt lines will be added until the minimum length is reached. Note: If the line count is set to 0 this is ignored.", + "unit": "mm", + "type": "float", + "default_value": 250, + "minimum_value": "0", + "minimum_value_warning": "25", + "maximum_value_warning": "2500", + "enabled": "adhesion_type == \"skirt\"", + "global_only": "True" + }, + "brim_width": + { + "label": "Brim Width", + "description": "The distance from the model to the outermost brim line. A larger brim enhances adhesion to the build plate, but also reduces the effective print area.", + "type": "float", + "unit": "mm", + "default_value": 8.0, + "minimum_value": "0.0", + "maximum_value_warning": "100.0", + "enabled": "adhesion_type == \"brim\"", + "global_only": "True", + "children": + { + "brim_line_count": + { + "label": "Brim Line Count", + "description": "The number of lines used for a brim. More brim lines enhance adhesion to the build plate, but also reduces the effective print area.", + "type": "int", + "default_value": 20, + "minimum_value": "0", + "maximum_value_warning": "300", + "inherit_function": "math.ceil(parent_value / skirt_line_width)", + "enabled": "adhesion_type == \"brim\"", + "global_only": "True" + } + } + }, + "raft_margin": + { + "label": "Raft Extra Margin", + "description": "If the raft is enabled, this is the extra raft area around the object which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print.", + "unit": "mm", + "type": "float", + "default_value": 5, + "minimum_value_warning": "0", + "maximum_value_warning": "10", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_airgap": + { + "label": "Raft Air Gap", + "description": "The gap between the final raft layer and the first layer of the object. Only the first layer is raised by this amount to lower the bonding between the raft layer and the object. Makes it easier to peel off the raft.", + "unit": "mm", + "type": "float", + "default_value": 0.35, + "minimum_value": "0", + "maximum_value_warning": "1.0", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_surface_layers": + { + "label": "Raft Top Layers", + "description": "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the object sits on. 2 layers result in a smoother top surface than 1.", + "type": "int", + "default_value": 2, + "minimum_value": "0", + "maximum_value_warning": "20", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_surface_thickness": + { + "label": "Raft Top Layer Thickness", + "description": "Layer thickness of the top raft layers.", + "unit": "mm", + "type": "float", + "default_value": 0.1, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_surface_line_width": + { + "label": "Raft Top Line Width", + "description": "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0.0001", + "maximum_value_warning": "machine_nozzle_size * 2", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_surface_line_spacing": + { + "label": "Raft Top Spacing", + "description": "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0.0001", + "maximum_value_warning": "5.0", + "enabled": "adhesion_type == \"raft\"", + "inherit_function": "raft_surface_line_width", + "global_only": "True" + }, + "raft_interface_thickness": + { + "label": "Raft Middle Thickness", + "description": "Layer thickness of the middle raft layer.", + "unit": "mm", + "type": "float", + "default_value": 0.27, + "minimum_value": "0", + "maximum_value_warning": "5.0", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_interface_line_width": + { + "label": "Raft Middle Line Width", + "description": "Width of the lines in the middle raft layer. Making the second layer extrude more causes the lines to stick to the bed.", + "unit": "mm", + "type": "float", + "default_value": 1, + "inherit_function": "line_width", + "minimum_value": "0.0001", + "maximum_value_warning": "machine_nozzle_size * 2", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_interface_line_spacing": + { + "label": "Raft Middle Spacing", + "description": "The distance between the raft lines for the middle raft layer. The spacing of the middle should be quite wide, while being dense enough to support the top raft layers.", + "unit": "mm", + "type": "float", + "default_value": 1.0, + "minimum_value": "0", + "maximum_value_warning": "15.0", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_base_thickness": + { + "label": "Raft Base Thickness", + "description": "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer bed.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0", + "maximum_value_warning": "5.0", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_base_line_width": + { + "label": "Raft Base Line Width", + "description": "Width of the lines in the base raft layer. These should be thick lines to assist in bed adhesion.", + "unit": "mm", + "type": "float", + "default_value": 1, + "minimum_value": "0.0001", + "inherit_function": "line_width", + "maximum_value_warning": "machine_nozzle_size * 2", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_base_line_spacing": + { + "label": "Raft Line Spacing", + "description": "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate.", + "unit": "mm", + "type": "float", + "default_value": 3.0, + "minimum_value": "0.0001", + "maximum_value_warning": "100", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_speed": + { + "label": "Raft Print Speed", + "description": "The speed at which the raft is printed.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "200", + "enabled": "adhesion_type == \"raft\"", + "inherit_function": "speed_print / 60 * 30", + "global_only": "True", + "children": + { + "raft_surface_speed": + { + "label": "Raft Surface Print Speed", + "description": "The speed at which the surface raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "enabled": "adhesion_type == \"raft\"", + "inherit_function": "parent_value", + "global_only": "True" + }, + "raft_interface_speed": + { + "label": "Raft Interface Print Speed", + "description": "The speed at which the interface raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", + "unit": "mm/s", + "type": "float", + "default_value": 15, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "enabled": "adhesion_type == \"raft\"", + "inherit_function": "0.5 * parent_value", + "global_only": "True" + }, + "raft_base_speed": + { + "label": "Raft Base Print Speed", + "description": "The speed at which the base raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", + "unit": "mm/s", + "type": "float", + "default_value": 15, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "200", + "enabled": "adhesion_type == \"raft\"", + "inherit_function": "0.5 * parent_value", + "global_only": "True" + } + } + }, + "raft_fan_speed": + { + "label": "Raft Fan Speed", + "description": "The fan speed for the raft.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 100, + "global_only": "True", + "enabled": "adhesion_type == \"raft\"", + "children": + { + "raft_surface_fan_speed": + { + "label": "Raft Surface Fan Speed", + "description": "The fan speed for the surface raft layers.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 100, + "global_only": "True", + "inherit": true, + "enabled": "adhesion_type == \"raft\"" + }, + "raft_interface_fan_speed": + { + "label": "Raft Interface Fan Speed", + "description": "The fan speed for the interface raft layer.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 100, + "global_only": "True", + "inherit": true, + "enabled": "adhesion_type == \"raft\"" + }, + "raft_base_fan_speed": + { + "label": "Raft Base Fan Speed", + "description": "The fan speed for the base raft layer.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 100, + "global_only": "True", + "inherit": true, + "enabled": "adhesion_type == \"raft\"" + } + } + } + } + }, + "meshfix": + { + "label": "Mesh Fixes", + "type": "category", + "icon": "category_fixes", + "description": "category_fixes", + "children": + { + "meshfix_union_all": + { + "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 + }, + "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 + }, + "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 + }, + "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 + } + } + }, + "blackmagic": + { + "label": "Special Modes", + "type": "category", + "icon": "category_blackmagic", + "description": "category_blackmagic", + "children": + { + "print_sequence": + { + "label": "Print Sequence", + "description": "Whether to print all objects one layer at a time or to wait for one object to finish, before moving on to the next. One at a time mode is only possible if all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes.", + "type": "enum", + "options": + { + "all_at_once": "All at Once", + "one_at_a_time": "One at a Time" + }, + "default_value": "all_at_once", + "global_only": true + }, + "magic_mesh_surface_mode": + { + "label": "Surface Mode", + "description": "Treat the model as a surface only, a volume, or volumes with loose surfaces. The normal print mode only prints enclosed volumes. \"Surface\" prints a single wall tracing the mesh surface with no infill and no top/bottom skin. \"Both\" prints enclosed volumes like normal and any remaining polygons as surfaces.", + "type": "enum", + "options": + { + "normal": "Normal", + "surface": "Surface", + "both": "Both" + }, + "default_value": "normal" + }, + "magic_spiralize": + { + "label": "Spiralize Outer Contour", + "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" + } + } + }, + "blackmagic": + { + "label": "Experimental Modes", + "type": "category", + "icon": "category_blackmagic", + "description": "category_blackmagic", + "children": + { + "draft_shield_enabled": + { + "label": "Enable Draft Shield", + "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 + }, + "draft_shield_dist": + { + "label": "Draft Shield X/Y Distance", + "description": "Distance of the draft shield from the print, in the X/Y directions.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "100", + "default_value": 10, + "enabled": "draft_shield_enabled", + "global_only": true + }, + "draft_shield_height_limitation": + { + "label": "Draft Shield Limitation", + "description": "Set the height of the draft shield. Choose to print the draft shield at the full height of the object or at a limited height.", + "type": "enum", + "options": + { + "full": "Full", + "limited": "Limited" + }, + "default_value": "full", + "enabled": "draft_shield_enabled", + "global_only": true + }, + "draft_shield_height": + { + "label": "Draft Shield Height", + "description": "Height limitation of the draft shield. Above this height no draft shield will be printed.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "9999", + "default_value": 0, + "inherit_function": "9999 if draft_shield_height_limitation == 'full' and draft_shield_enabled else 0.0", + "enabled": "draft_shield_height_limitation == \"limited\"", + "global_only": true + }, + "coasting_enable": + { + "label": "Enable Coasting", + "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 + }, + "coasting_volume": + { + "label": "Coasting Volume", + "description": "The volume otherwise oozed. This value should generally be close to the nozzle diameter cubed.", + "unit": "mm³", + "type": "float", + "default_value": 0.064, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "inherit": false, + "enabled": "coasting_enable", + "global_only": true + }, + "coasting_min_volume": + { + "label": "Minimum Volume Before Coasting", + "description": "The smallest volume an extrusion path should have before allowing coasting. For smaller extrusion paths, less pressure has been built up in the bowden tube and so the coasted volume is scaled linearly. This value should always be larger than the Coasting Volume.", + "unit": "mm³", + "type": "float", + "default_value": 0.8, + "minimum_value": "0", + "maximum_value_warning": "10.0", + "enabled": "coasting_enable", + "global_only": true + }, + "coasting_speed": + { + "label": "Coasting Speed", + "description": "The speed by which to move during coasting, relative to the speed of the extrusion path. A value slightly under 100% is advised, since during the coasting move the pressure in the bowden tube drops.", + "unit": "%", + "type": "float", + "default_value": 90, + "minimum_value": "0.0001", + "maximum_value_warning": "100", + "inherit": false, + "enabled": "coasting_enable", + "global_only": true + }, + "skin_outline_count": + { + "label": "Extra Skin Wall Count", + "description": "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material.", + "default_value": 0, + "minimum_value": "0", + "maximum_value_warning": "10", + "type": "int" + }, + "skin_alternate_rotation": + { + "label": "Alternate Skin Rotation", + "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\"" + }, + "support_conical_enabled": + { + "label": "Enable Conical Support", + "description": "Experimental feature: Make support areas smaller at the bottom than at the overhang.", + "type": "bool", + "default_value": false, + "enabled": "support_enable" + }, + "support_conical_angle": + { + "label": "Conical Support Angle", + "description": "The angle of the tilt of conical support. With 0 degrees being vertical, and 90 degrees being horizontal. Smaller angles cause the support to be more sturdy, but consist of more material. Negative angles cause the base of the support to be wider than the top.", + "unit": "°", + "type": "float", + "minimum_value": "-90", + "minimum_value_warning": "-45", + "maximum_value_warning": "45", + "maximum_value": "90", + "default_value": 30, + "enabled": "support_conical_enabled and support_enable" + }, + "support_conical_min_width": + { + "label": "Conical Support Minimum Width", + "description": "Minimum width to which the base of the conical support area is reduced. Small widths can lead to unstable support structures.", + "unit": "mm", + "default_value": 5.0, + "minimum_value": "0", + "minimum_value_warning": "machine_nozzle_size * 3", + "maximum_value_warning": "100.0", + "type": "float", + "enabled": "support_conical_enabled and support_enable" + }, + "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 + }, + "magic_fuzzy_skin_thickness": + { + "label": "Fuzzy Skin Thickness", + "description": "The width within which to jitter. It's advised to keep this below the outer wall width, since the inner walls are unaltered.", + "type": "float", + "unit": "mm", + "default_value": 0.3, + "minimum_value": "0.001", + "maximum_value_warning": "wall_line_width_0", + "enabled": "magic_fuzzy_skin_enabled" + }, + "magic_fuzzy_skin_point_density": + { + "label": "Fuzzy Skin Density", + "description": "The average density of points introduced on each polygon in a layer. Note that the original points of the polygon are discarded, so a low density results in a reduction of the resolution.", + "type": "float", + "unit": "1/mm", + "default_value": 1.25, + "minimum_value": "0.008", + "minimum_value_warning": "0.1", + "maximum_value_warning": "10", + "maximum_value": "2 / magic_fuzzy_skin_thickness", + "enabled": "magic_fuzzy_skin_enabled", + "children": + { + "magic_fuzzy_skin_point_dist": + { + "label": "Fuzzy Skin Point Distance", + "description": "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness.", + "type": "float", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "magic_fuzzy_skin_thickness / 2", + "minimum_value_warning": "0.1", + "maximum_value_warning": "10", + "inherit_function": "10000 if parent_value == 0 else 1 / parent_value", + "enabled": "magic_fuzzy_skin_enabled" + } + } + }, + "wireframe_enabled": + { + "label": "Wire Printing", + "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" + }, + "wireframe_height": + { + "label": "WP Connection Height", + "description": "The height of the upward and diagonally downward lines between two horizontal parts. This determines the overall density of the net structure. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 3, + "minimum_value": "0.0001", + "maximum_value_warning": "20", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_roof_inset": + { + "label": "WP Roof Inset Distance", + "description": "The distance covered when making a connection from a roof outline inward. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 3, + "minimum_value": "0", + "minimum_value_warning": "machine_nozzle_size", + "maximum_value_warning": "20", + "enabled": "wireframe_enabled", + "inherit_function": "wireframe_height", + "global_only": "True" + }, + "wireframe_printspeed": + { + "label": "WP Speed", + "description": "Speed at which the nozzle moves when extruding material. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "enabled": "wireframe_enabled", + "global_only": "True", + "children": + { + "wireframe_printspeed_bottom": + { + "label": "WP Bottom Printing Speed", + "description": "Speed of printing the first layer, which is the only layer touching the build platform. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "visible": false, + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_printspeed_up": + { + "label": "WP Upward Printing Speed", + "description": "Speed of printing a line upward 'in thin air'. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "visible": false, + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_printspeed_down": + { + "label": "WP Downward Printing Speed", + "description": "Speed of printing a line diagonally downward. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "visible": false, + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_printspeed_flat": + { + "label": "WP Horizontal Printing Speed", + "description": "Speed of printing the horizontal contours of the object. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "inherit": true, + "enabled": "wireframe_enabled", + "global_only": "True" + } + } + }, + "wireframe_flow": + { + "label": "WP Flow", + "description": "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing.", + "unit": "%", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "enabled": "wireframe_enabled", + "global_only": "True", + "children": + { + "wireframe_flow_connection": + { + "label": "WP Connection Flow", + "description": "Flow compensation when going up or down. Only applies to Wire Printing.", + "unit": "%", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_flow_flat": + { + "label": "WP Flat Flow", + "description": "Flow compensation when printing flat lines. Only applies to Wire Printing.", + "unit": "%", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "enabled": "wireframe_enabled", + "global_only": "True" + } + } + }, + "wireframe_top_delay": + { + "label": "WP Top Delay", + "description": "Delay time after an upward move, so that the upward line can harden. Only applies to Wire Printing.", + "unit": "sec", + "type": "float", + "default_value": 0, + "minimum_value": "0", + "maximum_value_warning": "1", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_bottom_delay": + { + "label": "WP Bottom Delay", + "description": "Delay time after a downward move. Only applies to Wire Printing.", + "unit": "sec", + "type": "float", + "default_value": 0, + "minimum_value": "0", + "maximum_value_warning": "1", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_flat_delay": + { + "label": "WP Flat Delay", + "description": "Delay time between two horizontal segments. Introducing such a delay can cause better adhesion to previous layers at the connection points, while too long delays cause sagging. Only applies to Wire Printing.", + "unit": "sec", + "type": "float", + "default_value": 0.1, + "minimum_value": "0", + "maximum_value_warning": "0.5", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_up_half_speed": + { + "label": "WP Ease Upward", + "description": "Distance of an upward move which is extruded with half speed.\nThis can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.3, + "minimum_value": "0", + "maximum_value_warning": "5.0", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_top_jump": + { + "label": "WP Knot Size", + "description": "Creates a small knot at the top of an upward line, so that the consecutive horizontal layer has a better chance to connect to it. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.6, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_fall_down": + { + "label": "WP Fall Down", + "description": "Distance with which the material falls down after an upward extrusion. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.5, + "minimum_value": "0", + "maximum_value_warning": "wireframe_height", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_drag_along": + { + "label": "WP Drag Along", + "description": "Distance with which the material of an upward extrusion is dragged along with the diagonally downward extrusion. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.6, + "minimum_value": "0", + "maximum_value_warning": "wireframe_height", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_strategy": + { + "label": "WP Strategy", + "description": "Strategy for making sure two consecutive layers connect at each connection point. Retraction lets the upward lines harden in the right position, but may cause filament grinding. A knot can be made at the end of an upward line to heighten the chance of connecting to it and to let the line cool; however, it may require slow printing speeds. Another strategy is to compensate for the sagging of the top of an upward line; however, the lines won't always fall down as predicted.", + "type": "enum", + "options": + { + "compensate": "Compensate", + "knot": "Knot", + "retract": "Retract" + }, + "default_value": "compensate", + "visible": false, + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_straight_before_down": + { + "label": "WP Straighten Downward Lines", + "description": "Percentage of a diagonally downward line which is covered by a horizontal line piece. This can prevent sagging of the top most point of upward lines. Only applies to Wire Printing.", + "type": "float", + "unit": "%", + "default_value": 20, + "minimum_value": "0", + "maximum_value": "100", + "visible": false, + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_roof_fall_down": + { + "label": "WP Roof Fall Down", + "description": "The distance which horizontal roof lines printed 'in thin air' fall down when being printed. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 2, + "minimum_value_warning": "0", + "maximum_value_warning": "wireframe_roof_inset", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_roof_drag_along": + { + "label": "WP Roof Drag Along", + "description": "The distance of the end piece of an inward line which gets dragged along when going back to the outer outline of the roof. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_roof_outer_delay": + { + "label": "WP Roof Outer Delay", + "description": "Time spent at the outer perimeters of hole which is to become a roof. Longer times can ensure a better connection. Only applies to Wire Printing.", + "type": "float", + "unit": "sec", + "default_value": 0.2, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_nozzle_clearance": + { + "label": "WP Nozzle Clearance", + "description": "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 1, + "minimum_value_warning": "0", + "maximum_value_warning": "10.0", + "enabled": "wireframe_enabled", + "global_only": "True" + } + } + } + } +} From 9b1f560935da77757b057ec6ab929ad95191b4dc Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 2 May 2016 16:47:15 +0200 Subject: [PATCH 002/224] Removed last stray visible properties CURA-1278 --- resources/machines/fdmprinter.def.json | 28 +++----------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/resources/machines/fdmprinter.def.json b/resources/machines/fdmprinter.def.json index 3d39e8a652..b44d720d33 100644 --- a/resources/machines/fdmprinter.def.json +++ b/resources/machines/fdmprinter.def.json @@ -4,8 +4,7 @@ "metadata": { "category": "Ultimaker", - "manufacturer": "Ultimaker", - "visible": false + "manufacturer": "Ultimaker" }, "name": "FDM Printer Base Description", "author": "Ultimaker B.V.", @@ -215,7 +214,6 @@ "default_value": 0.4, "minimum_value": "0.001", "maximum_value_warning": "10", - "visible": false } } }, @@ -366,7 +364,6 @@ "shell": { "label": "Shell", - "visible": true, "icon": "category_shell", "description": "Shell", "type": "category", @@ -683,7 +680,6 @@ "description": "Change the temperature for each layer automatically with the average flow speed of that layer.", "type": "bool", "default_value": false, - "visible": false, "enabled": "False", "global_only": true }, @@ -717,8 +713,7 @@ "maximum_value_warning": "10.0", "global_only": "True", "enabled": "False", - "enabled_before_removal": "material_flow_dependent_temperature or machine_extruder_count > 1", - "visible": false + "enabled_before_removal": "material_flow_dependent_temperature or machine_extruder_count > 1" }, "material_bed_temperature": { "label": "Bed Temperature", @@ -756,8 +751,7 @@ "label": "Enable Retraction", "description": "Retract the filament when the nozzle is moving over a non-printed area. ", "type": "bool", - "default_value": true, - "visible": true + "default_value": true }, "retraction_amount": { "label": "Retraction Distance", @@ -767,7 +761,6 @@ "default_value": 6.5, "minimum_value_warning": "-0.0001", "maximum_value_warning": "10.0", - "visible": false, "inherit": false, "enabled": "retraction_enable" }, @@ -780,7 +773,6 @@ "minimum_value": "0", "maximum_value": "299792458000", "maximum_value_warning": "100", - "visible": false, "inherit": false, "enabled": "retraction_enable", "children": { @@ -793,7 +785,6 @@ "minimum_value": "0", "maximum_value": "299792458000", "maximum_value_warning": "100", - "visible": false, "enabled": "retraction_enable" }, "retraction_prime_speed": { @@ -805,7 +796,6 @@ "minimum_value": "0", "maximum_value": "299792458000", "maximum_value_warning": "100", - "visible": false, "enabled": "retraction_enable" } } @@ -818,7 +808,6 @@ "default_value": 0, "minimum_value_warning": "-0.0001", "maximum_value_warning": "5.0", - "visible": false, "inherit": false, "enabled": "retraction_enable" }, @@ -831,7 +820,6 @@ "inherit_function": "line_width * 2", "minimum_value": "0", "maximum_value_warning": "10", - "visible": false, "inherit": false, "enabled": "retraction_enable" }, @@ -842,7 +830,6 @@ "minimum_value": "0", "maximum_value_warning": "100", "type": "int", - "visible": false, "inherit": false, "enabled": "retraction_enable" }, @@ -854,7 +841,6 @@ "default_value": 4.5, "minimum_value": "0", "maximum_value_warning": "retraction_amount * 2", - "visible": false, "inherit_function": "retraction_amount", "enabled": "retraction_enable" }, @@ -912,7 +898,6 @@ "maximum_value": "299792458000", "maximum_value_warning": "150", "default_value": 30, - "visible": false, "inherit_function": "parent_value / 2", "children": { @@ -1134,7 +1119,6 @@ "maximum_value": "100", "inherit_function": "parent_value", "default_value": 100, - "visible": false, "enabled": "cool_fan_enabled", "global_only": "True" }, @@ -1411,7 +1395,6 @@ "description": "Generate a dense top skin at the top of the support on which the model is printed.", "type": "bool", "default_value": false, - "visible": true, "enabled": "support_enable" }, "support_roof_height": @@ -2198,7 +2181,6 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "50", - "visible": false, "enabled": "wireframe_enabled", "global_only": "True" }, @@ -2212,7 +2194,6 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "50", - "visible": false, "enabled": "wireframe_enabled", "global_only": "True" }, @@ -2226,7 +2207,6 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "50", - "visible": false, "enabled": "wireframe_enabled", "global_only": "True" }, @@ -2381,7 +2361,6 @@ "retract": "Retract" }, "default_value": "compensate", - "visible": false, "enabled": "wireframe_enabled", "global_only": "True" }, @@ -2394,7 +2373,6 @@ "default_value": 20, "minimum_value": "0", "maximum_value": "100", - "visible": false, "enabled": "wireframe_enabled", "global_only": "True" }, From ad506be34cf455409e31557ac9294b769bf6fb21 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 2 May 2016 16:48:58 +0200 Subject: [PATCH 003/224] Formatting CURA-1278 --- resources/machines/fdmprinter.def.json | 77 +++++++++++++++++--------- 1 file changed, 51 insertions(+), 26 deletions(-) diff --git a/resources/machines/fdmprinter.def.json b/resources/machines/fdmprinter.def.json index b44d720d33..db7bcfb864 100644 --- a/resources/machines/fdmprinter.def.json +++ b/resources/machines/fdmprinter.def.json @@ -19,142 +19,163 @@ "description": "Machine specific settings", "children": { - "machine_show_variants": { + "machine_show_variants": + { "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" }, - "machine_start_gcode": { + "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" }, - "machine_end_gcode": { + "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" }, - "material_bed_temp_wait": { + "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" }, - "material_print_temp_prepend": { + "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" }, - "machine_width": { + "machine_width": + { "description": "The width (X-direction) of the printable area.", "default_value": 100, "global_only": true, "type": "float", "label": "Machine width" }, - "machine_depth": { + "machine_depth": + { "description": "The depth (Y-direction) of the printable area.", "default_value": 100, "global_only": true, "type": "float", "label": "Machine depth" }, - "machine_height": { + "machine_height": + { "description": "The height (Z-direction) of the printable area.", "default_value": 100, "global_only": true, "type": "float", "label": "Machine height" }, - "machine_heated_bed": { + "machine_heated_bed": + { "description": "Whether the machine has a heated bed present.", "default_value": false, "global_only": true, "label": "Has heated bed", "type": "bool" }, - "machine_center_is_zero": { + "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" }, - "machine_extruder_count": { + "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": "bool", "label": "Number extruders" }, - "machine_nozzle_tip_outer_diameter": { + "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" }, - "machine_nozzle_head_distance": { + "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" }, - "machine_nozzle_expansion_angle": { + "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" }, - "machine_heat_zone_length": { + "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" }, - "machine_nozzle_heat_up_speed": { + "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" }, - "machine_nozzle_cool_down_speed": { + "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" }, - "machine_gcode_flavor": { + "machine_gcode_flavor": + { "description": "The type of gcode to be generated.", "default_value": "RepRap", "global_only": true, "type": "str", "label": "Gcode flavour" }, - "machine_disallowed_areas": { + "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" }, - "machine_head_polygon": { + "machine_head_polygon": + { "description": "A 2D silhouette of the print head (fan caps excluded).", "type": "polygon", - "default_value": [ + "default_value": + [ [ -1, 1 @@ -175,10 +196,12 @@ "global_only": true, "label": "Machine head polygon" }, - "machine_head_with_fans_polygon": { + "machine_head_with_fans_polygon": + { "description": "A 2D silhouette of the print head (fan caps included).", "type": "polygon", - "default_value": [ + "default_value": + [ [ -20, 10 @@ -199,21 +222,23 @@ "global_only": true, "label": "Machine head & Fan polygon" }, - "gantry_height": { + "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" }, - "machine_nozzle_size": { + "machine_nozzle_size": + { "label": "Nozzle Diameter", "description": "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size.", "unit": "mm", "type": "float", "default_value": 0.4, "minimum_value": "0.001", - "maximum_value_warning": "10", + "maximum_value_warning": "10" } } }, From 1eab26dcc02d1a09186aa21efebc8bf6e0e9f902 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 3 May 2016 09:23:20 +0200 Subject: [PATCH 004/224] Added invisible to metadata again CURA-1278 --- resources/machines/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/machines/fdmprinter.def.json b/resources/machines/fdmprinter.def.json index db7bcfb864..3bf66226f5 100644 --- a/resources/machines/fdmprinter.def.json +++ b/resources/machines/fdmprinter.def.json @@ -4,12 +4,12 @@ "metadata": { "category": "Ultimaker", - "manufacturer": "Ultimaker" + "manufacturer": "Ultimaker", + "visible": false }, "name": "FDM Printer Base Description", "author": "Ultimaker B.V.", "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", - "settings": { "machine_settings": From c69652531753364a8d326848a1448f0b54807068 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 3 May 2016 11:38:59 +0200 Subject: [PATCH 005/224] Updated inherit function to value (and in cases where there was implicit inheritance made it explicit) CURA-1278 --- resources/machines/fdmprinter.def.json | 175 +++++++++++++------------ 1 file changed, 94 insertions(+), 81 deletions(-) diff --git a/resources/machines/fdmprinter.def.json b/resources/machines/fdmprinter.def.json index 3bf66226f5..cf92aa847f 100644 --- a/resources/machines/fdmprinter.def.json +++ b/resources/machines/fdmprinter.def.json @@ -284,7 +284,7 @@ "maximum_value_warning": "2 * machine_nozzle_size", "default_value": 0.4, "type": "float", - "inherit_function": "machine_nozzle_size", + "value": "machine_nozzle_size", "children": { "wall_line_width": @@ -295,6 +295,7 @@ "minimum_value": "0.0001", "minimum_value_warning": "0.2", "maximum_value_warning": "5", + "value":"line_width", "default_value": 0.4, "type": "float", "children": @@ -308,6 +309,7 @@ "minimum_value_warning": "0.2", "maximum_value_warning": "5", "default_value": 0.4, + "value":"wall_line_width", "type": "float" }, "wall_line_width_x": @@ -319,6 +321,7 @@ "minimum_value_warning": "0.2", "maximum_value_warning": "5", "default_value": 0.4, + "value":"wall_line_width", "type": "float" } } @@ -332,7 +335,8 @@ "minimum_value_warning": "0.2", "maximum_value_warning": "5", "default_value": 0.4, - "type": "float" + "type": "float", + "value": "line_width" }, "infill_line_width": { @@ -343,7 +347,8 @@ "minimum_value_warning": "0.2", "maximum_value_warning": "5", "default_value": 0.4, - "type": "float" + "type": "float", + "value": "line_width" }, "skirt_line_width": { @@ -355,7 +360,8 @@ "maximum_value_warning": "5", "default_value": 0.4, "type": "float", - "global_only": true + "global_only": true, + "value": "line_width" }, "support_line_width": { @@ -368,7 +374,8 @@ "default_value": 0.4, "type": "float", "enabled": "support_enable", - "global_only": true + "global_only": true, + "value": "line_width" }, "support_roof_line_width": { @@ -380,7 +387,8 @@ "maximum_value_warning": "machine_nozzle_size * 2", "type": "float", "enabled": "support_roof_enable", - "global_only": true + "global_only": true, + "value": "line_width" } } } @@ -413,7 +421,7 @@ "default_value": 2, "minimum_value": "0", "type": "int", - "inherit_function": "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)" } } }, @@ -438,6 +446,7 @@ "minimum_value": "0", "maximum_value_warning": "100", "type": "float", + "value": "top_bottom_thickness", "children": { "top_layers": @@ -448,7 +457,7 @@ "minimum_value": "0", "maximum_value_warning": "100", "type": "int", - "inherit_function": "0 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" + "value": "0 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" } } }, @@ -460,6 +469,7 @@ "default_value": 0.6, "minimum_value": "0", "type": "float", + "value": "top_bottom_thickness", "children": { "bottom_layers": @@ -469,7 +479,7 @@ "minimum_value": "0", "default_value": 6, "type": "int", - "inherit_function": "999999 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" + "value": "999999 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" } } } @@ -495,7 +505,7 @@ "unit": "mm", "type": "float", "default_value": 0.0, - "inherit_function": "(machine_nozzle_size - wall_line_width_0) / 2 if wall_line_width_0 < machine_nozzle_size else 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" }, @@ -504,8 +514,7 @@ "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, - "inherit": false + "default_value": false }, "remove_overlapping_walls_enabled": { @@ -522,7 +531,7 @@ "description": "Remove parts of an outer wall which share an overlap which would result in overextrusion in some places. These overlaps occur in thin pieces in a model and sharp corners.", "type": "bool", "default_value": false, - "inherit": true, + "value": "remove_overlapping_walls_enabled", "enabled": "False" }, "remove_overlapping_walls_x_enabled": @@ -531,7 +540,7 @@ "description": "Remove parts of an inner wall that would otherwise overlap and cause over-extrusion. These overlaps occur in thin pieces in a model and sharp corners.", "type": "bool", "default_value": true, - "inherit": false + "value": "remove_overlapping_walls_enabled" } } }, @@ -615,7 +624,7 @@ "type": "float", "default_value": 2, "minimum_value": "0", - "inherit_function": "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))" } } }, @@ -633,7 +642,7 @@ "zigzag": "Zig Zag" }, "default_value": "grid", - "inherit_function": "'lines' if infill_sparse_density > 25 else 'grid'" + "value": "'lines' if infill_sparse_density > 25 else 'grid'" }, "infill_overlap": { @@ -642,7 +651,7 @@ "unit": "%", "type": "float", "default_value": 10, - "inherit_function": "10 if infill_sparse_density < 95 else 0", + "value": "10 if infill_sparse_density < 95 else 0", "minimum_value_warning": "-50", "maximum_value_warning": "100", "children": @@ -656,7 +665,7 @@ "default_value": 0.04, "minimum_value_warning": "-0.5 * machine_nozzle_size", "maximum_value_warning": "machine_nozzle_size", - "inherit_function": "infill_line_width * parent_value / 100 if infill_sparse_density < 95 else 0" + "value": "infill_line_width * infill_overlap / 100 if infill_sparse_density < 95 else 0" } } }, @@ -667,7 +676,7 @@ "unit": "mm", "type": "float", "default_value": 0.04, - "inherit_function": "wall_line_width_0 / 4 if wall_line_count == 1 else wall_line_width_x / 4", + "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" }, @@ -681,7 +690,7 @@ "minimum_value": "0.0001", "maximum_value_warning": "0.32", "maximum_value": "layer_height * 8", - "inherit_function": "layer_height" + "value": "layer_height" }, "infill_before_walls": { @@ -700,7 +709,8 @@ "type": "category", "children": { - "material_flow_dependent_temperature": { + "material_flow_dependent_temperature": + { "label": "Auto Temperature", "description": "Change the temperature for each layer automatically with the average flow speed of that layer.", "type": "bool", @@ -708,7 +718,8 @@ "enabled": "False", "global_only": true }, - "material_print_temperature": { + "material_print_temperature": + { "label": "Printing Temperature", "description": "The temperature used for printing. Set at 0 to pre-heat the printer manually.", "unit": "°C", @@ -718,14 +729,15 @@ "maximum_value_warning": "260", "enabled": "not (material_flow_dependent_temperature)" }, - "material_flow_temp_graph": { + "material_flow_temp_graph": + { "label": "Flow Temperature Graph", "description": "Data linking material flow (in mm3 per second) to temperature (degrees Celsius).", "unit": "", "type": "str", "default_value": "[[3.5,200],[7.0,240]]", "enabled": "False", - "enabled_before_removal": "material_flow_dependent_temperature", + "comments": "old enabled function: material_flow_dependent_temperature", "global_only": true }, "material_extrusion_cool_down_speed": { @@ -738,7 +750,7 @@ "maximum_value_warning": "10.0", "global_only": "True", "enabled": "False", - "enabled_before_removal": "material_flow_dependent_temperature or machine_extruder_count > 1" + "comments": "old enabled function: material_flow_dependent_temperature or machine_extruder_count > 1" }, "material_bed_temperature": { "label": "Bed Temperature", @@ -786,7 +798,6 @@ "default_value": 6.5, "minimum_value_warning": "-0.0001", "maximum_value_warning": "10.0", - "inherit": false, "enabled": "retraction_enable" }, "retraction_speed": { @@ -798,7 +809,6 @@ "minimum_value": "0", "maximum_value": "299792458000", "maximum_value_warning": "100", - "inherit": false, "enabled": "retraction_enable", "children": { "retraction_retract_speed": { @@ -810,7 +820,8 @@ "minimum_value": "0", "maximum_value": "299792458000", "maximum_value_warning": "100", - "enabled": "retraction_enable" + "enabled": "retraction_enable", + "value": "retraction_speed" }, "retraction_prime_speed": { "label": "Retraction Prime Speed", @@ -821,7 +832,8 @@ "minimum_value": "0", "maximum_value": "299792458000", "maximum_value_warning": "100", - "enabled": "retraction_enable" + "enabled": "retraction_enable", + "value": "retraction_speed" } } }, @@ -833,7 +845,6 @@ "default_value": 0, "minimum_value_warning": "-0.0001", "maximum_value_warning": "5.0", - "inherit": false, "enabled": "retraction_enable" }, "retraction_min_travel": { @@ -842,10 +853,9 @@ "unit": "mm", "type": "float", "default_value": 1.5, - "inherit_function": "line_width * 2", + "value": "line_width * 2", "minimum_value": "0", "maximum_value_warning": "10", - "inherit": false, "enabled": "retraction_enable" }, "retraction_count_max": { @@ -855,7 +865,6 @@ "minimum_value": "0", "maximum_value_warning": "100", "type": "int", - "inherit": false, "enabled": "retraction_enable" }, "retraction_extrusion_window": { @@ -866,7 +875,7 @@ "default_value": 4.5, "minimum_value": "0", "maximum_value_warning": "retraction_amount * 2", - "inherit_function": "retraction_amount", + "value": "retraction_amount", "enabled": "retraction_enable" }, "retraction_hop": { @@ -877,7 +886,6 @@ "default_value": 0, "minimum_value_warning": "-0.0001", "maximum_value_warning": "10", - "inherit": false, "enabled": "retraction_enable" } } @@ -911,7 +919,8 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "150", - "default_value": 60 + "default_value": 60, + "value": "speed_print" }, "speed_wall": { @@ -923,7 +932,7 @@ "maximum_value": "299792458000", "maximum_value_warning": "150", "default_value": 30, - "inherit_function": "parent_value / 2", + "value": "speed_print / 2", "children": { "speed_wall_0": @@ -935,7 +944,8 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "150", - "default_value": 30 + "default_value": 30, + "value": "speed_wall" }, "speed_wall_x": { @@ -947,7 +957,7 @@ "maximum_value": "299792458000", "maximum_value_warning": "150", "default_value": 60, - "inherit_function": "parent_value * 2" + "value": "speed_wall * 2" } } }, @@ -961,7 +971,7 @@ "maximum_value": "299792458000", "maximum_value_warning": "150", "default_value": 30, - "inherit_function": "parent_value / 2" + "value": "speed_print / 2" }, "speed_support": { @@ -973,7 +983,7 @@ "maximum_value": "299792458000", "maximum_value_warning": "150", "default_value": 60, - "inherit_function": "speed_print", + "value": "speed_print", "enabled": "support_roof_enable", "children": { @@ -987,7 +997,7 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "150", - "inherit": true, + "value": "speed_support", "enabled": "support_enable", "global_only": true }, @@ -1002,7 +1012,7 @@ "maximum_value": "299792458000", "maximum_value_warning": "150", "enabled": "support_roof_enable", - "inherit_function": "parent_value / 1.5", + "value": "speed_support / 1.5", "global_only": true } } @@ -1019,7 +1029,7 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "300", - "inherit_function": "speed_print if magic_spiralize else 120", + "value": "speed_print if magic_spiralize else 120", "global_only": true }, "speed_layer_0": { @@ -1041,7 +1051,7 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "300", - "inherit_function": "speed_layer_0", + "value": "speed_layer_0", "global_only": true }, "speed_slowdown_layers": @@ -1095,10 +1105,9 @@ "unit": "mm", "type": "float", "default_value": 1.5, - "inherit_function": "machine_nozzle_tip_outer_diameter / 2 * 1.25", + "value": "machine_nozzle_tip_outer_diameter / 2 * 1.25", "minimum_value": "0", "maximum_value_warning": "machine_nozzle_tip_outer_diameter * 5", - "inherit": false, "enabled": "retraction_combing != \"off\" and travel_avoid_other_parts", "global_only": "True" } @@ -1129,7 +1138,7 @@ "minimum_value": "0", "maximum_value": "100", "default_value": 100, - "inherit_function": "100.0 if cool_fan_enabled else 0.0", + "value": "100.0 if cool_fan_enabled else 0.0", "enabled": "cool_fan_enabled", "global_only": "True", "children": @@ -1142,7 +1151,7 @@ "type": "float", "minimum_value": "0", "maximum_value": "100", - "inherit_function": "parent_value", + "value": "cool_fan_speed", "default_value": 100, "enabled": "cool_fan_enabled", "global_only": "True" @@ -1157,7 +1166,8 @@ "maximum_value": "100", "default_value": 100, "enabled": "cool_fan_enabled", - "global_only": "True" + "global_only": "True", + "value": "cool_fan_speed" } } }, @@ -1179,7 +1189,7 @@ "unit": "mm", "type": "float", "default_value": 0.5, - "inherit_function": "layer_height_0", + "value": "layer_height_0", "minimum_value": "0", "maximum_value_warning": "10.0", "global_only": "True", @@ -1193,7 +1203,7 @@ "default_value": 1, "minimum_value": "0", "maximum_value_warning": "100", - "inherit_function": "int((parent_value - layer_height_0 + 0.001) / layer_height) + 1", + "value": "int((cool_fan_full_at_height - layer_height_0 + 0.001) / layer_height) + 1", "global_only": "True" } } @@ -1316,7 +1326,7 @@ "minimum_value": "0", "default_value": 2.66, "enabled": "support_enable", - "inherit_function": "(support_line_width * 100) / parent_value * (2 if support_pattern == \"grid\" else (3 if support_pattern == \"triangles\" else 1))", + "value": "(support_line_width * 100) / support_infill_rate * (2 if support_pattern == \"grid\" else (3 if support_pattern == \"triangles\" else 1))", "global_only": true } } @@ -1354,7 +1364,8 @@ "maximum_value_warning": "10", "default_value": 0.15, "type": "float", - "enabled": "support_enable" + "enabled": "support_enable", + "value": "support_z_distance" }, "support_bottom_distance": { @@ -1364,7 +1375,7 @@ "minimum_value": "0", "maximum_value_warning": "10", "default_value": 0.1, - "inherit_function": "0.1 if support_type == 'everywhere' else 0", + "value": "0.1 if support_type == 'everywhere' else 0", "type": "float", "enabled": "support_enable and support_type == 'everywhere'" } @@ -1454,7 +1465,7 @@ "type": "float", "default_value": 0.4, "minimum_value": "0", - "inherit_function": "0 if parent_value == 0 else (support_roof_line_width * 100) / parent_value * (2 if support_roof_pattern == \"grid\" else (3 if support_roof_pattern == \"triangles\" else 1))", + "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 } @@ -1506,7 +1517,6 @@ "minimum_value": "0", "maximum_value_warning": "10", "maximum_value": "support_tower_diameter", - "inherit": true, "enabled": "support_enable and support_use_towers" }, "support_tower_roof_angle": @@ -1601,7 +1611,7 @@ "default_value": 20, "minimum_value": "0", "maximum_value_warning": "300", - "inherit_function": "math.ceil(parent_value / skirt_line_width)", + "value": "math.ceil(brim_width / skirt_line_width)", "enabled": "adhesion_type == \"brim\"", "global_only": "True" } @@ -1676,7 +1686,7 @@ "minimum_value": "0.0001", "maximum_value_warning": "5.0", "enabled": "adhesion_type == \"raft\"", - "inherit_function": "raft_surface_line_width", + "value": "raft_surface_line_width", "global_only": "True" }, "raft_interface_thickness": @@ -1698,7 +1708,7 @@ "unit": "mm", "type": "float", "default_value": 1, - "inherit_function": "line_width", + "value": "line_width", "minimum_value": "0.0001", "maximum_value_warning": "machine_nozzle_size * 2", "enabled": "adhesion_type == \"raft\"", @@ -1736,7 +1746,7 @@ "type": "float", "default_value": 1, "minimum_value": "0.0001", - "inherit_function": "line_width", + "value": "line_width", "maximum_value_warning": "machine_nozzle_size * 2", "enabled": "adhesion_type == \"raft\"", "global_only": "True" @@ -1764,7 +1774,7 @@ "maximum_value": "299792458000", "maximum_value_warning": "200", "enabled": "adhesion_type == \"raft\"", - "inherit_function": "speed_print / 60 * 30", + "value": "speed_print / 60 * 30", "global_only": "True", "children": { @@ -1779,7 +1789,7 @@ "maximum_value": "299792458000", "maximum_value_warning": "100", "enabled": "adhesion_type == \"raft\"", - "inherit_function": "parent_value", + "value": "raft_speed", "global_only": "True" }, "raft_interface_speed": @@ -1793,7 +1803,7 @@ "maximum_value": "299792458000", "maximum_value_warning": "150", "enabled": "adhesion_type == \"raft\"", - "inherit_function": "0.5 * parent_value", + "value": "0.5 * raft_speed", "global_only": "True" }, "raft_base_speed": @@ -1807,7 +1817,7 @@ "maximum_value": "299792458000", "maximum_value_warning": "200", "enabled": "adhesion_type == \"raft\"", - "inherit_function": "0.5 * parent_value", + "value": "0.5 * raft_speed", "global_only": "True" } } @@ -1835,7 +1845,7 @@ "maximum_value": "100", "default_value": 100, "global_only": "True", - "inherit": true, + "value": "raft_fan_speed", "enabled": "adhesion_type == \"raft\"" }, "raft_interface_fan_speed": @@ -1848,7 +1858,7 @@ "maximum_value": "100", "default_value": 100, "global_only": "True", - "inherit": true, + "value": "raft_fan_speed", "enabled": "adhesion_type == \"raft\"" }, "raft_base_fan_speed": @@ -1861,7 +1871,7 @@ "maximum_value": "100", "default_value": 100, "global_only": "True", - "inherit": true, + "value": "raft_fan_speed", "enabled": "adhesion_type == \"raft\"" } } @@ -1950,12 +1960,12 @@ } } }, - "blackmagic": + "experimental": { "label": "Experimental Modes", "type": "category", "icon": "category_blackmagic", - "description": "category_blackmagic", + "description": "experimental!", "children": { "draft_shield_enabled": @@ -2001,7 +2011,7 @@ "minimum_value": "0", "maximum_value_warning": "9999", "default_value": 0, - "inherit_function": "9999 if draft_shield_height_limitation == 'full' and draft_shield_enabled else 0.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 }, @@ -2022,7 +2032,6 @@ "default_value": 0.064, "minimum_value": "0", "maximum_value_warning": "2.0", - "inherit": false, "enabled": "coasting_enable", "global_only": true }, @@ -2047,7 +2056,6 @@ "default_value": 90, "minimum_value": "0.0001", "maximum_value_warning": "100", - "inherit": false, "enabled": "coasting_enable", "global_only": true }, @@ -2143,7 +2151,7 @@ "minimum_value": "magic_fuzzy_skin_thickness / 2", "minimum_value_warning": "0.1", "maximum_value_warning": "10", - "inherit_function": "10000 if parent_value == 0 else 1 / parent_value", + "value": "10000 if parent_value == 0 else 1 / magic_fuzzy_skin_point_density", "enabled": "magic_fuzzy_skin_enabled" } } @@ -2179,7 +2187,7 @@ "minimum_value_warning": "machine_nozzle_size", "maximum_value_warning": "20", "enabled": "wireframe_enabled", - "inherit_function": "wireframe_height", + "value": "wireframe_height", "global_only": "True" }, "wireframe_printspeed": @@ -2207,7 +2215,8 @@ "maximum_value": "299792458000", "maximum_value_warning": "50", "enabled": "wireframe_enabled", - "global_only": "True" + "global_only": "True", + "value": "wireframe_printspeed" }, "wireframe_printspeed_up": { @@ -2220,7 +2229,8 @@ "maximum_value": "299792458000", "maximum_value_warning": "50", "enabled": "wireframe_enabled", - "global_only": "True" + "global_only": "True", + "value": "wireframe_printspeed" }, "wireframe_printspeed_down": { @@ -2233,7 +2243,8 @@ "maximum_value": "299792458000", "maximum_value_warning": "50", "enabled": "wireframe_enabled", - "global_only": "True" + "global_only": "True", + "value": "wireframe_printspeed" }, "wireframe_printspeed_flat": { @@ -2245,7 +2256,7 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "100", - "inherit": true, + "value": "wireframe_printspeed", "enabled": "wireframe_enabled", "global_only": "True" } @@ -2274,7 +2285,8 @@ "maximum_value_warning": "100", "type": "float", "enabled": "wireframe_enabled", - "global_only": "True" + "global_only": "True", + "value": "wireframe_flow" }, "wireframe_flow_flat": { @@ -2286,7 +2298,8 @@ "maximum_value_warning": "100", "type": "float", "enabled": "wireframe_enabled", - "global_only": "True" + "global_only": "True", + "value": "wireframe_flow" } } }, From 44246c0676e8d432eb53e27157197b14a59526dc Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 9 May 2016 12:06:11 +0200 Subject: [PATCH 006/224] Comment out all things that use settings related things so we can at least start --- cura/CuraApplication.py | 8 ++++---- plugins/CuraEngineBackend/CuraEngineBackend.py | 10 +++++----- resources/qml/Cura.qml | 6 +++--- resources/qml/ProfileSetup.qml | 2 +- resources/qml/SidebarHeader.qml | 6 +++--- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 2a22b624a9..1f83cd1f3d 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -101,8 +101,8 @@ class CuraApplication(QtApplication): self._camera_animation = None self._cura_actions = None - self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged) - self.getMachineManager().addMachineRequested.connect(self._onAddMachineRequested) + #self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged) + #self.getMachineManager().addMachineRequested.connect(self._onAddMachineRequested) self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) @@ -175,9 +175,9 @@ class CuraApplication(QtApplication): Selection.selectionChanged.connect(self.onSelectionChanged) root = controller.getScene().getRoot() - self._platform = Platform(root) + #self._platform = Platform(root) - self._volume = BuildVolume.BuildVolume(root) + #self._volume = BuildVolume.BuildVolume(root) self.getRenderer().setBackgroundColor(QColor(245, 245, 245)) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 7a5d332d9e..5102427823 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -52,11 +52,11 @@ class CuraEngineBackend(Backend): # When there are current settings and machine instance is changed, there is no profile changed event. We should # pretend there is though. - Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveProfileChanged) + #Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveProfileChanged) - self._profile = None - Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged) - self._onActiveProfileChanged() + #self._profile = None + #Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged) + #self._onActiveProfileChanged() self._change_timer = QTimer() self._change_timer.setInterval(500) @@ -84,7 +84,7 @@ class CuraEngineBackend(Backend): Application.getInstance().getController().toolOperationStarted.connect(self._onToolOperationStarted) Application.getInstance().getController().toolOperationStopped.connect(self._onToolOperationStopped) - Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onInstanceChanged) + #Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onInstanceChanged) def close(self): # Terminate CuraEngine if it is still running at this point diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 1759eabfc6..cdff5fc9ab 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -168,7 +168,7 @@ UM.MainWindow Instantiator { - model: UM.MachineInstancesModel { } +// model: UM.MachineInstancesModel { } MenuItem { text: model.name; @@ -187,7 +187,7 @@ UM.MainWindow Instantiator { - model: UM.MachineVariantsModel { } +// model: UM.MachineVariantsModel { } MenuItem { text: model.name; checkable: true; @@ -215,7 +215,7 @@ UM.MainWindow Instantiator { id: profileMenuInstantiator - model: UM.ProfilesModel {} +// model: UM.ProfilesModel {} property int separatorIndex: -1 Loader { diff --git a/resources/qml/ProfileSetup.qml b/resources/qml/ProfileSetup.qml index d6ff042a44..24668f43b0 100644 --- a/resources/qml/ProfileSetup.qml +++ b/resources/qml/ProfileSetup.qml @@ -56,7 +56,7 @@ Item{ Instantiator { id: profileSelectionInstantiator - model: UM.ProfilesModel {} +// model: UM.ProfilesModel {} property int separatorIndex: -1 Loader { diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index b5fcc880f6..1c17233acb 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -71,7 +71,7 @@ Item id: machineSelectionMenu Instantiator { - model: UM.MachineInstancesModel { } +// model: UM.MachineInstancesModel { } MenuItem { text: model.name; @@ -139,7 +139,7 @@ Item Instantiator { id: variantSelectionInstantiator - model: UM.MachineVariantsModel { id: variantsModel } +// model: UM.MachineVariantsModel { id: variantsModel } MenuItem { text: model.name; @@ -183,7 +183,7 @@ Item Instantiator { id: materialSelectionInstantiator - model: UM.MachineMaterialsModel { id: machineMaterialsModel } +// model: UM.MachineMaterialsModel { id: machineMaterialsModel } MenuItem { text: model.name; From 38492cb2304b1f84620701d60ad276655076c43c Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 9 May 2016 12:06:35 +0200 Subject: [PATCH 007/224] Update API version of two required plugins --- plugins/CuraEngineBackend/__init__.py | 2 +- plugins/SolidView/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/__init__.py b/plugins/CuraEngineBackend/__init__.py index 86a53d3ada..2e652ae845 100644 --- a/plugins/CuraEngineBackend/__init__.py +++ b/plugins/CuraEngineBackend/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "name": catalog.i18nc("@label", "CuraEngine Backend"), "author": "Ultimaker", "description": catalog.i18nc("@info:whatsthis", "Provides the link to the CuraEngine slicing backend."), - "api": 2 + "api": 3 } } diff --git a/plugins/SolidView/__init__.py b/plugins/SolidView/__init__.py index 0317648e6e..945ccba8f6 100644 --- a/plugins/SolidView/__init__.py +++ b/plugins/SolidView/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": i18n_catalog.i18nc("@info:whatsthis", "Provides a normal solid mesh view."), - "api": 2 + "api": 3 }, "view": { "name": i18n_catalog.i18nc("@item:inmenu", "Solid"), From 1b9c29579b6febbc8281d833698cef27f8c06606 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 9 May 2016 14:55:01 +0200 Subject: [PATCH 008/224] Reworked add machine (Still stub) CURA-1278 --- resources/qml/AddMachineDialog.qml | 165 +++++++++++++++++++++++++++++ resources/qml/Cura.qml | 14 +-- 2 files changed, 172 insertions(+), 7 deletions(-) create mode 100644 resources/qml/AddMachineDialog.qml diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml new file mode 100644 index 0000000000..c6e852aa3e --- /dev/null +++ b/resources/qml/AddMachineDialog.qml @@ -0,0 +1,165 @@ +// Copyright (c) 2016 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.Layouts 1.1 +import QtQuick.Window 2.1 + +import QtQuick.Controls.Styles 1.1 + +import UM 1.1 as UM +import Cura 1.0 as Cura + + +UM.Dialog +{ + id: base + title: catalog.i18nc("@title:window", "Add Printer") + property string activeManufacturer: "Ultimaker"; + + function getMachineName() + { + var name = machineList.model.getItem(machineList.currentIndex).name + return name + } + + ScrollView + { + id: machinesHolder + + anchors + { + left: parent.left; + top: parent.top; + right: parent.right; + bottom: parent.bottom; + } + ListView + { + id: machineList + + model: UM.DefinitionContainersModel + { + id: machineDefinitionsModel + filter: {"visible":true} + } + section.property: "manufacturer" + section.delegate: Button + { + text: section + style: ButtonStyle + { + background: Rectangle + { + border.width: 0 + color: "transparent"; + height: UM.Theme.getSize("standard_list_lineheight").height + width: machineList.width + } + label: Label + { + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("standard_arrow").width + UM.Theme.getSize("default_margin").width + text: control.text + color: palette.windowText + font.bold: true + UM.RecolorImage + { + id: downArrow + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + sourceSize.height: width + color: palette.windowText + source: base.activeManufacturer == section ? UM.Theme.getIcon("arrow_bottom") : UM.Theme.getIcon("arrow_right") + } + } + } + + onClicked: + { + base.activeManufacturer = section; + machineList.currentIndex = machineList.model.find("manufacturer", section) + machineName.text = getMachineName() + } + } + + delegate: RadioButton + { + id: machineButton + + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("standard_list_lineheight").width + + opacity: 1; + height: UM.Theme.getSize("standard_list_lineheight").height; + + checked: ListView.isCurrentItem; + + exclusiveGroup: printerGroup; + + text: model.name + + onClicked: + { + ListView.view.currentIndex = index; + machineName.text = getMachineName() + } + + states: State + { + name: "collapsed"; + when: base.activeManufacturer != model.manufacturer; + + PropertyChanges { target: machineButton; opacity: 0; height: 0; } + } + + transitions: + [ + Transition + { + to: "collapsed"; + SequentialAnimation + { + NumberAnimation { property: "opacity"; duration: 75; } + NumberAnimation { property: "height"; duration: 75; } + } + }, + Transition + { + from: "collapsed"; + SequentialAnimation + { + NumberAnimation { property: "height"; duration: 75; } + NumberAnimation { property: "opacity"; duration: 75; } + } + } + ] + } + } + } + + TextField + { + id: machineName; + text: getMachineName() + implicitWidth: UM.Theme.getSize("standard_list_input").width + maximumLength: 40 + anchors.bottom:parent.bottom + } + + Item + { + UM.I18nCatalog + { + id: catalog; + name: "cura"; + } + SystemPalette { id: palette } + ExclusiveGroup { id: printerGroup; } + } +} \ No newline at end of file diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index cdff5fc9ab..e39cd733d9 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -626,7 +626,7 @@ UM.MainWindow resetAll.onTriggered: Printer.resetAll(); reloadAll.onTriggered: Printer.reloadAll(); - addMachine.onTriggered: addMachineWizard.visible = true; + addMachine.onTriggered: addMachineDialog.visible = true; addProfile.onTriggered: { UM.MachineManager.createProfile(); @@ -742,9 +742,9 @@ UM.MainWindow id: engineLog; } - AddMachineWizard + AddMachineDialog { - id: addMachineWizard + id: addMachineDialog } AboutDialog @@ -757,8 +757,8 @@ UM.MainWindow target: Printer onRequestAddPrinter: { - addMachineWizard.visible = true - addMachineWizard.firstRun = false + addMachineDialog.visible = true + addMachineDialog.firstRun = false } } @@ -777,8 +777,8 @@ UM.MainWindow } else if(UM.MachineManager.activeMachineInstance == "") { - addMachineWizard.firstRun = true; - addMachineWizard.open(); + addMachineDialog.firstRun = true; + addMachineDialog.open(); } } } From 0049ee13777f3e61a6b03f9f818f657f6b6fa902 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 9 May 2016 15:42:47 +0200 Subject: [PATCH 009/224] SolidView now uses activeContainerStack CURA-1278 --- plugins/SolidView/SolidView.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 8719e9c6e4..561d194dd3 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -34,12 +34,11 @@ class SolidView(View): self._disabled_shader.setUniformValue("u_diffuseColor", [0.68, 0.68, 0.68, 1.0]) self._disabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) - if Application.getInstance().getMachineManager().getWorkingProfile(): - profile = Application.getInstance().getMachineManager().getWorkingProfile() + if Application.getInstance().getActiveContainerStack(): if Preferences.getInstance().getValue("view/show_overhang"): - angle = profile.getSettingValue("support_angle") - if angle != None: + angle = Application.getInstance().getActiveContainerStack().getValue("support_angle") + if angle is not None: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle))) else: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) #Overhang angle of 0 causes no area at all to be marked as overhang. From 293fd5e80d4fdde9a61506d7dc0927a33e2377e6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 9 May 2016 15:44:04 +0200 Subject: [PATCH 010/224] Moved fdmprinter.def.json to definitions folder CURA-1278 --- resources/definitions/fdmprinter.def.json | 2468 +++++++++++++++++++++ 1 file changed, 2468 insertions(+) create mode 100644 resources/definitions/fdmprinter.def.json diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json new file mode 100644 index 0000000000..cf92aa847f --- /dev/null +++ b/resources/definitions/fdmprinter.def.json @@ -0,0 +1,2468 @@ +{ + "id": "fdmprinter", + "version": 2, + "metadata": + { + "category": "Ultimaker", + "manufacturer": "Ultimaker", + "visible": false + }, + "name": "FDM Printer Base Description", + "author": "Ultimaker B.V.", + "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", + "settings": + { + "machine_settings": + { + "label": "Machine", + "type": "category", + "description": "Machine specific settings", + "children": + { + "machine_show_variants": + { + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "machine_width": + { + "description": "The width (X-direction) of the printable area.", + "default_value": 100, + "global_only": true, + "type": "float", + "label": "Machine width" + }, + "machine_depth": + { + "description": "The depth (Y-direction) of the printable area.", + "default_value": 100, + "global_only": true, + "type": "float", + "label": "Machine depth" + }, + "machine_height": + { + "description": "The height (Z-direction) of the printable area.", + "default_value": 100, + "global_only": true, + "type": "float", + "label": "Machine height" + }, + "machine_heated_bed": + { + "description": "Whether the machine has a heated bed present.", + "default_value": false, + "global_only": true, + "label": "Has heated bed", + "type": "bool" + }, + "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" + }, + "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": "bool", + "label": "Number extruders" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "machine_gcode_flavor": + { + "description": "The type of gcode to be generated.", + "default_value": "RepRap", + "global_only": true, + "type": "str", + "label": "Gcode flavour" + }, + "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" + }, + "machine_head_polygon": + { + "description": "A 2D silhouette of the print head (fan caps excluded).", + "type": "polygon", + "default_value": + [ + [ + -1, + 1 + ], + [ + -1, + -1 + ], + [ + 1, + -1 + ], + [ + 1, + 1 + ] + ], + "global_only": true, + "label": "Machine head polygon" + }, + "machine_head_with_fans_polygon": + { + "description": "A 2D silhouette of the print head (fan caps included).", + "type": "polygon", + "default_value": + [ + [ + -20, + 10 + ], + [ + 10, + 10 + ], + [ + 10, + -10 + ], + [ + -20, + -10 + ] + ], + "global_only": true, + "label": "Machine head & Fan polygon" + }, + "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" + }, + "machine_nozzle_size": + { + "label": "Nozzle Diameter", + "description": "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size.", + "unit": "mm", + "type": "float", + "default_value": 0.4, + "minimum_value": "0.001", + "maximum_value_warning": "10" + } + } + }, + "resolution": + { + "label": "Quality", + "type": "category", + "icon": "category_layer_height", + "description": "All settings that influence the resolution of the print. These settings have a large impact on the quality (and print time)", + "children": + { + "layer_height": + { + "label": "Layer Height", + "description": "The height of each layer in mm. Higher values produce faster prints in lower resolution, lower values produce slower prints in higher resolution.", + "unit": "mm", + "type": "float", + "default_value": 0.1, + "minimum_value": "0.001", + "minimum_value_warning": "0.04", + "maximum_value_warning": "0.8 * machine_nozzle_size", + "global_only": "True" + }, + "layer_height_0": + { + "label": "Initial Layer Height", + "description": "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0.001", + "minimum_value_warning": "0.04", + "maximum_value_warning": "0.8 * machine_nozzle_size", + "global_only": "True" + }, + "line_width": + { + "label": "Line Width", + "description": "Width of a single line. Generally, the width of each line should correspond to the width of the nozzle. However, slightly reducing this value could produce better prints.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "2 * machine_nozzle_size", + "default_value": 0.4, + "type": "float", + "value": "machine_nozzle_size", + "children": + { + "wall_line_width": + { + "label": "Wall Line Width", + "description": "Width of a single wall line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "value":"line_width", + "default_value": 0.4, + "type": "float", + "children": + { + "wall_line_width_0": + { + "label": "Outer Wall Line Width", + "description": "Width of the outermost wall line. By lowering this value, higher levels of detail can be printed.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "value":"wall_line_width", + "type": "float" + }, + "wall_line_width_x": + { + "label": "Inner Wall(s) Line Width", + "description": "Width of a single wall line for all wall lines except the outermost one.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "value":"wall_line_width", + "type": "float" + } + } + }, + "skin_line_width": + { + "label": "Top/bottom Line Width", + "description": "Width of a single top/bottom line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float", + "value": "line_width" + }, + "infill_line_width": + { + "label": "Infill Line Width", + "description": "Width of a single infill line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float", + "value": "line_width" + }, + "skirt_line_width": + { + "label": "Skirt Line Width", + "description": "Width of a single skirt line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float", + "global_only": true, + "value": "line_width" + }, + "support_line_width": + { + "label": "Support Line Width", + "description": "Width of a single support structure line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float", + "enabled": "support_enable", + "global_only": true, + "value": "line_width" + }, + "support_roof_line_width": + { + "label": "Support Roof Line Width", + "description": "Width of a single support roof line.", + "unit": "mm", + "default_value": 0.4, + "minimum_value": "0.0001", + "maximum_value_warning": "machine_nozzle_size * 2", + "type": "float", + "enabled": "support_roof_enable", + "global_only": true, + "value": "line_width" + } + } + } + } + }, + "shell": + { + "label": "Shell", + "icon": "category_shell", + "description": "Shell", + "type": "category", + "children": + { + "wall_thickness": + { + "label": "Wall Thickness", + "description": "The thickness of the outside walls in the horizontal direction. This value divided by the wall line width defines the number of walls.", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "minimum_value_warning": "line_width", + "maximum_value_warning": "5 * line_width", + "type": "float", + "children": + { + "wall_line_count": + { + "label": "Wall Line Count", + "description": "The number of walls. When calculated by the wall thickness, this value is rounded to a whole number.", + "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)" + } + } + }, + "top_bottom_thickness": + { + "label": "Top/Bottom Thickness", + "description": "The thickness of the top/bottom layers in the print. This value divided by the layer height defines the number of top/bottom layers.", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "maximum_value": "5", + "minimum_value_warning": "0.6", + "type": "float", + "children": + { + "top_thickness": + { + "label": "Top Thickness", + "description": "The thickness of the top layers in the print. This value divided by the layer height defines the number of top layers.", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "value": "top_bottom_thickness", + "children": + { + "top_layers": + { + "label": "Top Layers", + "description": "The number of top layers. When calculated by the top thickness, this value is rounded to a whole number.", + "default_value": 8, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "int", + "value": "0 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" + } + } + }, + "bottom_thickness": + { + "label": "Bottom Thickness", + "description": "The thickness of the bottom layers in the print. This value divided by the layer height defines the number of bottom layers.", + "unit": "mm", + "default_value": 0.6, + "minimum_value": "0", + "type": "float", + "value": "top_bottom_thickness", + "children": + { + "bottom_layers": + { + "label": "Bottom Layers", + "description": "The number of bottom layers. When calculated by the bottom thickness, this value is rounded to a whole number.", + "minimum_value": "0", + "default_value": 6, + "type": "int", + "value": "999999 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" + } + } + } + } + }, + "top_bottom_pattern": + { + "label": "Top/Bottom Pattern", + "description": "The pattern of the top/bottom layers.", + "type": "enum", + "options": + { + "lines": "Lines", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "lines" + }, + "wall_0_inset": + { + "label": "Outer Wall Inset", + "description": "Inset applied to the path of the outer wall. If the outer wall is smaller than the nozzle, and printed after the inner walls, use this offset to get the hole in the nozzle to overlap with the inner walls instead of the outside of the object.", + "unit": "mm", + "type": "float", + "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" + }, + "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 + }, + "remove_overlapping_walls_enabled": + { + "label": "Remove Overlapping Wall Parts", + "description": "Remove parts of a wall which share an overlap which would result in overextrusion in some places. These overlaps occur in thin parts and sharp corners in models.", + "type": "bool", + "default_value": false, + "enabled": "False", + "children": + { + "remove_overlapping_walls_0_enabled": + { + "label": "Remove Overlapping Outer Wall Parts", + "description": "Remove parts of an outer wall which share an overlap which would result in overextrusion in some places. These overlaps occur in thin pieces in a model and sharp corners.", + "type": "bool", + "default_value": false, + "value": "remove_overlapping_walls_enabled", + "enabled": "False" + }, + "remove_overlapping_walls_x_enabled": + { + "label": "Remove Overlapping Inner Wall Parts", + "description": "Remove parts of an inner wall that would otherwise overlap and cause over-extrusion. These overlaps occur in thin pieces in a model and sharp corners.", + "type": "bool", + "default_value": true, + "value": "remove_overlapping_walls_enabled" + } + } + }, + "fill_perimeter_gaps": + { + "label": "Fill Gaps Between Walls", + "description": "Fills the gaps between walls when overlapping inner wall parts are removed.", + "type": "enum", + "options": + { + "nowhere": "Nowhere", + "everywhere": "Everywhere", + "skin": "Skin" + }, + "default_value": "everywhere", + "enabled": "remove_overlapping_walls_x_enabled" + }, + "travel_compensate_overlapping_walls_enabled": + { + "label": "Compensate Wall Overlaps", + "description": "Compensate the flow for parts of a wall being printed where there is already a wall in place.", + "type": "bool", + "default_value": true + }, + "xy_offset": + { + "label": "Horizontal Expansion", + "description": "Amount of offset applied to all polygons in each layer. Positive values can compensate for too big holes; negative values can compensate for too small holes.", + "unit": "mm", + "type": "float", + "minimum_value_warning": "-10", + "maximum_value_warning": "10", + "default_value": 0 + }, + "z_seam_type": + { + "label": "Z Seam Alignment", + "description": "Starting point of each path in a layer. When paths in consecutive layers start at the same point a vertical seam may show on the print. When aligning these at the back, the seam is easiest to remove. When placed randomly the inaccuracies at the paths' start will be less noticeable. When taking the shortest path the print will be quicker.", + "type": "enum", + "options": + { + "back": "Back", + "shortest": "Shortest", + "random": "Random" + }, + "default_value": "shortest" + }, + "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 + } + } + }, + "infill": + { + "label": "Infill", + "icon": "category_infill", + "description": "Infill", + "type": "category", + "children": + { + "infill_sparse_density": + { + "label": "Infill Density", + "description": "Adjusts the density of infill of the print.", + "unit": "%", + "type": "float", + "default_value": 20, + "minimum_value": "0", + "maximum_value_warning": "100", + "children": + { + "infill_line_distance": + { + "label": "Infill Line Distance", + "description": "Distance between the printed infill lines. This setting is calculated by the infill density and the infill line width.", + "unit": "mm", + "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))" + } + } + }, + "infill_pattern": + { + "label": "Infill Pattern", + "description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle and concentric patterns are fully printed every layer.", + "type": "enum", + "options": + { + "grid": "Grid", + "lines": "Lines", + "triangles": "Triangles", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "grid", + "value": "'lines' if infill_sparse_density > 25 else 'grid'" + }, + "infill_overlap": + { + "label": "Infill Overlap Percentage", + "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", + "unit": "%", + "type": "float", + "default_value": 10, + "value": "10 if infill_sparse_density < 95 else 0", + "minimum_value_warning": "-50", + "maximum_value_warning": "100", + "children": + { + "infill_overlap_mm": + { + "label": "Infill Overlap", + "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", + "unit": "mm", + "type": "float", + "default_value": 0.04, + "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 else 0" + } + } + }, + "infill_wipe_dist": + { + "label": "Infill Wipe Distance", + "description": "Distance of a travel move inserted after every infill line, to make the infill stick to the walls better. This option is similar to infill overlap, but without extrusion and only on one end of the infill line.", + "unit": "mm", + "type": "float", + "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" + }, + "infill_sparse_thickness": + { + "label": "Infill Layer Thickness", + "description": "The thickness per layer of infill material. This value should always be a multiple of the layer height and is otherwise rounded.", + "unit": "mm", + "type": "float", + "default_value": 0.1, + "minimum_value": "0.0001", + "maximum_value_warning": "0.32", + "maximum_value": "layer_height * 8", + "value": "layer_height" + }, + "infill_before_walls": + { + "label": "Infill Before Walls", + "description": "Print the infill before printing the walls. Printing the walls first may lead to more accurate walls, but overhangs print worse. Printing the infill first leads to sturdier walls, but the infill pattern might sometimes show through the surface.", + "type": "bool", + "default_value": true + } + } + }, + "material": + { + "label": "Material", + "icon": "category_material", + "description": "Material", + "type": "category", + "children": + { + "material_flow_dependent_temperature": + { + "label": "Auto Temperature", + "description": "Change the temperature for each layer automatically with the average flow speed of that layer.", + "type": "bool", + "default_value": false, + "enabled": "False", + "global_only": true + }, + "material_print_temperature": + { + "label": "Printing Temperature", + "description": "The temperature used for printing. Set at 0 to pre-heat the printer manually.", + "unit": "°C", + "type": "float", + "default_value": 210, + "minimum_value": "0", + "maximum_value_warning": "260", + "enabled": "not (material_flow_dependent_temperature)" + }, + "material_flow_temp_graph": + { + "label": "Flow Temperature Graph", + "description": "Data linking material flow (in mm3 per second) to temperature (degrees Celsius).", + "unit": "", + "type": "str", + "default_value": "[[3.5,200],[7.0,240]]", + "enabled": "False", + "comments": "old enabled function: material_flow_dependent_temperature", + "global_only": true + }, + "material_extrusion_cool_down_speed": { + "label": "Extrusion Cool Down Speed Modifier", + "description": "The extra speed by which the nozzle cools while extruding. The same value is used to signify the heat up speed lost when heating up while extruding.", + "unit": "°C/s", + "type": "float", + "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" + }, + "material_bed_temperature": { + "label": "Bed Temperature", + "description": "The temperature used for the heated bed. Set at 0 to pre-heat the printer manually.", + "unit": "°C", + "type": "float", + "default_value": 60, + "minimum_value": "0", + "maximum_value_warning": "260", + "enabled": "machine_heated_bed", + "global_only": "True" + }, + "material_diameter": { + "label": "Diameter", + "description": "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament.", + "unit": "mm", + "type": "float", + "default_value": 2.85, + "minimum_value": "0.0001", + "minimum_value_warning": "0.4", + "maximum_value_warning": "3.5", + "global_only": "True" + }, + "material_flow": { + "label": "Flow", + "description": "Flow compensation: the amount of material extruded is multiplied by this value.", + "unit": "%", + "default_value": 100, + "type": "float", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150" + }, + "retraction_enable": { + "label": "Enable Retraction", + "description": "Retract the filament when the nozzle is moving over a non-printed area. ", + "type": "bool", + "default_value": true + }, + "retraction_amount": { + "label": "Retraction Distance", + "description": "The length of material retracted during a retraction move.", + "unit": "mm", + "type": "float", + "default_value": 6.5, + "minimum_value_warning": "-0.0001", + "maximum_value_warning": "10.0", + "enabled": "retraction_enable" + }, + "retraction_speed": { + "label": "Retraction Speed", + "description": "The speed at which the filament is retracted and primed during a retraction move.", + "unit": "mm/s", + "type": "float", + "default_value": 25, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "enabled": "retraction_enable", + "children": { + "retraction_retract_speed": { + "label": "Retraction Retract Speed", + "description": "The speed at which the filament is retracted during a retraction move.", + "unit": "mm/s", + "type": "float", + "default_value": 25, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "enabled": "retraction_enable", + "value": "retraction_speed" + }, + "retraction_prime_speed": { + "label": "Retraction Prime Speed", + "description": "The speed at which the filament is primed during a retraction move.", + "unit": "mm/s", + "type": "float", + "default_value": 25, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "enabled": "retraction_enable", + "value": "retraction_speed" + } + } + }, + "retraction_extra_prime_amount": { + "label": "Retraction Extra Prime Amount", + "description": "Some material can ooze away during a travel move, which can be compensated for here.", + "unit": "mm³", + "type": "float", + "default_value": 0, + "minimum_value_warning": "-0.0001", + "maximum_value_warning": "5.0", + "enabled": "retraction_enable" + }, + "retraction_min_travel": { + "label": "Retraction Minimum Travel", + "description": "The minimum distance of travel needed for a retraction to happen at all. This helps to get fewer retractions in a small area.", + "unit": "mm", + "type": "float", + "default_value": 1.5, + "value": "line_width * 2", + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "retraction_enable" + }, + "retraction_count_max": { + "label": "Maximum Retraction Count", + "description": "This setting limits the number of retractions occurring within the minimum extrusion distance window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament, as that can flatten the filament and cause grinding issues.", + "default_value": 45, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "int", + "enabled": "retraction_enable" + }, + "retraction_extrusion_window": { + "label": "Minimum Extrusion Distance Window", + "description": "The window in which the maximum retraction count is enforced. This value should be approximately the same as the retraction distance, so that effectively the number of times a retraction passes the same patch of material is limited.", + "unit": "mm", + "type": "float", + "default_value": 4.5, + "minimum_value": "0", + "maximum_value_warning": "retraction_amount * 2", + "value": "retraction_amount", + "enabled": "retraction_enable" + }, + "retraction_hop": { + "label": "Z Hop when Retracting", + "description": "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.", + "unit": "mm", + "type": "float", + "default_value": 0, + "minimum_value_warning": "-0.0001", + "maximum_value_warning": "10", + "enabled": "retraction_enable" + } + } + }, + "speed": + { + "label": "Speed", + "icon": "category_speed", + "description": "Speed", + "type": "category", + "children": + { + "speed_print": + { + "label": "Print Speed", + "description": "The speed at which printing happens.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value_warning": "150", + "maximum_value": "299792458000", + "default_value": 60, + "children": + { + "speed_infill": + { + "label": "Infill Speed", + "description": "The speed at which infill is printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 60, + "value": "speed_print" + }, + "speed_wall": + { + "label": "Wall Speed", + "description": "The speed at which the walls are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 30, + "value": "speed_print / 2", + "children": + { + "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.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 30, + "value": "speed_wall" + }, + "speed_wall_x": + { + "label": "Inner Wall Speed", + "description": "The speed at which all inner walls are printed Printing the inner wall faster than the outer wall will reduce printing time. It works well to set this in between the outer wall speed and the infill speed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 60, + "value": "speed_wall * 2" + } + } + }, + "speed_topbottom": + { + "label": "Top/Bottom Speed", + "description": "The speed at which top/bottom layers are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 30, + "value": "speed_print / 2" + }, + "speed_support": + { + "label": "Support Speed", + "description": "The speed at which the support structure is printed. Printing support at higher speeds can greatly reduce printing time. The surface quality of the support structure is not important since it is removed after printing.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 60, + "value": "speed_print", + "enabled": "support_roof_enable", + "children": + { + "speed_support_infill": + { + "label": "Support Infill Speed", + "description": "The speed at which the infill of support is printed. Printing the infill at lower speeds improves stability.", + "unit": "mm/s", + "type": "float", + "default_value": 60, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "value": "speed_support", + "enabled": "support_enable", + "global_only": true + }, + "speed_support_roof": + { + "label": "Support Roof Speed", + "description": "The speed at which the roofs of support are printed. Printing the support roof at lower speeds can improve overhang quality.", + "unit": "mm/s", + "type": "float", + "default_value": 40, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "enabled": "support_roof_enable", + "value": "speed_support / 1.5", + "global_only": true + } + } + } + } + }, + "speed_travel": + { + "label": "Travel Speed", + "description": "The speed at which travel moves are made.", + "unit": "mm/s", + "type": "float", + "default_value": 120, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "300", + "value": "speed_print if magic_spiralize else 120", + "global_only": true + }, + "speed_layer_0": { + "label": "Initial Layer Speed", + "description": "The print speed for the initial layer. A lower value is advised to improve adhesion to the build plate.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "300" + }, + "skirt_speed": { + "label": "Skirt Speed", + "description": "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed, but sometimes you might want to print the skirt at a different speed.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "300", + "value": "speed_layer_0", + "global_only": true + }, + "speed_slowdown_layers": + { + "label": "Number of Slower Layers", + "description": "The first few layers are printed slower than the rest of the object, to get better adhesion to the build plate and improve the overall success rate of prints. The speed is gradually increased over these layers.", + "type": "int", + "default_value": 2, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "300", + "global_only": true + } + } + }, + "travel": + { + "label": "Travel", + "icon": "category_travel", + "description": "travel", + "type": "category", + "children": + { + "retraction_combing": + { + "label": "Combing Mode", + "description": "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only.", + "type": "enum", + "options": + { + "off": "Off", + "all": "All", + "noskin": "No Skin" + }, + "default_value": "all", + "global_only": true + }, + "travel_avoid_other_parts": + { + "label": "Avoid Printed Parts when Traveling", + "description": "The nozzle avoids already printed parts when traveling. This option is only available when combing is enabled.", + "type": "bool", + "default_value": true, + "enabled": "retraction_combing != \"off\"", + "global_only": "True" + }, + "travel_avoid_distance": + { + "label": "Travel Avoid Distance", + "description": "The distance between the nozzle and already printed parts when avoiding during travel moves.", + "unit": "mm", + "type": "float", + "default_value": 1.5, + "value": "machine_nozzle_tip_outer_diameter / 2 * 1.25", + "minimum_value": "0", + "maximum_value_warning": "machine_nozzle_tip_outer_diameter * 5", + "enabled": "retraction_combing != \"off\" and travel_avoid_other_parts", + "global_only": "True" + } + } + }, + "cooling": + { + "label": "Cooling", + "icon": "category_cool", + "description": "Cooling", + "type": "category", + "children": + { + "cool_fan_enabled": + { + "label": "Enable Cooling Fans", + "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" + }, + "cool_fan_speed": + { + "label": "Fan Speed", + "description": "The speed at which the cooling fans spin.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 100, + "value": "100.0 if cool_fan_enabled else 0.0", + "enabled": "cool_fan_enabled", + "global_only": "True", + "children": + { + "cool_fan_speed_min": + { + "label": "Regular Fan Speed", + "description": "The speed at which the fans spin before hitting the threshold. When a layer prints faster than the threshold, the fan speed gradually inclines towards the maximum fan speed.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "value": "cool_fan_speed", + "default_value": 100, + "enabled": "cool_fan_enabled", + "global_only": "True" + }, + "cool_fan_speed_max": + { + "label": "Maximum Fan Speed", + "description": "The speed at which the fans spin on the minimum layer time. The fan speed gradually increases between the regular fan speed and maximum fan speed when the threshold is hit.", + "unit": "%", + "type": "float", + "minimum_value": "max(0, cool_fan_speed_min)", + "maximum_value": "100", + "default_value": 100, + "enabled": "cool_fan_enabled", + "global_only": "True", + "value": "cool_fan_speed" + } + } + }, + "cool_min_layer_time_fan_speed_max": + { + "label": "Regular/Maximum Fan Speed Threshold", + "description": "The layer time which sets the threshold between regular fan speed and maximum fan speed. Layers that print slower than this time use regular fan speed. For faster layers the fan speed gradually increases towards the maximum fan speed.", + "unit": "sec", + "type": "float", + "default_value": 10, + "minimum_value": "cool_min_layer_time", + "maximum_value_warning": "600", + "global_only": "True" + }, + "cool_fan_full_at_height": + { + "label": "Regular Fan Speed at Height", + "description": "The height at which the fans spin on regular fan speed. At the layers below the fan speed gradually increases from zero to regular fan speed.", + "unit": "mm", + "type": "float", + "default_value": 0.5, + "value": "layer_height_0", + "minimum_value": "0", + "maximum_value_warning": "10.0", + "global_only": "True", + "children": + { + "cool_fan_full_layer": + { + "label": "Regular Fan Speed at Layer", + "description": "The layer at which the fans spin on regular fan speed. If regular fan speed at height is set, this value is calculated and rounded to a whole number.", + "type": "int", + "default_value": 1, + "minimum_value": "0", + "maximum_value_warning": "100", + "value": "int((cool_fan_full_at_height - layer_height_0 + 0.001) / layer_height) + 1", + "global_only": "True" + } + } + }, + "cool_min_layer_time": + { + "label": "Minimum Layer Time", + "description": "The minimum time spent in a layer. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer.", + "unit": "sec", + "type": "float", + "default_value": 5, + "minimum_value": "0", + "maximum_value_warning": "600", + "global_only": "True" + }, + "cool_min_speed": + { + "label": "Minimum Speed", + "description": "The minimum print speed, despite slowing down due to the minimum layer time. When the printer would slow down too much, the pressure in the nozzle would be too low and result in bad print quality.", + "unit": "mm/s", + "type": "float", + "default_value": 10, + "minimum_value": "0", + "maximum_value_warning": "100", + "global_only": "True" + }, + "cool_lift_head": + { + "label": "Lift Head", + "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" + } + } + }, + "support": + { + "label": "Support", + "type": "category", + "icon": "category_support", + "description": "Support", + "children": + { + "support_enable": + { + "label": "Enable Support", + "description": "Enable support structures. These structures support parts of the model with severe overhangs.", + "type": "bool", + "default_value": false + }, + "support_type": + { + "label": "Support Placement", + "description": "Adjusts the placement of the support structures. The placement can be set to touching build plate or everywhere. When set to everywhere the support structures will also be printed on the model.", + "type": "enum", + "options": + { + "buildplate": "Touching Buildplate", + "everywhere": "Everywhere" + }, + "default_value": "everywhere", + "enabled": "support_enable" + }, + "support_angle": + { + "label": "Support Overhang Angle", + "description": "The minimum angle of overhangs for which support is added. At a value of 0° all overhangs are supported, 90° will not provide any support.", + "unit": "°", + "type": "float", + "minimum_value": "0", + "maximum_value": "90", + "default_value": 50, + "enabled": "support_enable" + }, + "support_pattern": + { + "label": "Support Pattern", + "description": "The pattern of the support structures of the print. The different options available result in sturdy or easy to remove support.", + "type": "enum", + "options": + { + "lines": "Lines", + "grid": "Grid", + "triangles": "Triangles", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "zigzag", + "enabled": "support_enable", + "global_only": true + }, + "support_connect_zigzags": + { + "label": "Connect Support ZigZags", + "description": "Connect the ZigZags. This will increase the strength of the zig zag support structure.", + "type": "bool", + "default_value": true, + "enabled": "support_enable and (support_pattern == \"zigzag\")", + "global_only": true + }, + "support_infill_rate": + { + "label": "Support Density", + "description": "Adjusts the density of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "100", + "default_value": 15, + "enabled": "support_enable", + "global_only": true, + "children": { + "support_line_distance": + { + "label": "Support Line Distance", + "description": "Distance between the printed support structure lines. This setting is calculated by the support density.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "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 + } + } + }, + "support_xy_distance": + { + "label": "Support X/Y Distance", + "description": "Distance of the support structure from the print in the X/Y directions.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.7, + "enabled": "support_enable" + }, + "support_z_distance": + { + "label": "Support Z Distance", + "description": "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded down to a multiple of the layer height.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.15, + "enabled": "support_enable", + + "children": + { + "support_top_distance": + { + "label": "Support Top Distance", + "description": "Distance from the top of the support to the print.", + "unit": "mm", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.15, + "type": "float", + "enabled": "support_enable", + "value": "support_z_distance" + }, + "support_bottom_distance": + { + "label": "Support Bottom Distance", + "description": "Distance from the print to the bottom of the support.", + "unit": "mm", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.1, + "value": "0.1 if support_type == 'everywhere' else 0", + "type": "float", + "enabled": "support_enable and support_type == 'everywhere'" + } + } + }, + "support_bottom_stair_step_height": + { + "label": "Support Stair Step Height", + "description": "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0", + "maximum_value_warning": "1.0", + "enabled": "support_enable" + }, + "support_join_distance": + { + "label": "Support Join Distance", + "description": "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one.", + "unit": "mm", + "type": "float", + "default_value": 2.0, + "minimum_value_warning": "0", + "maximum_value_warning": "10", + "enabled": "support_enable" + }, + "support_offset": + { + "label": "Support Horizontal Expansion", + "description": "Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support.", + "unit": "mm", + "type": "float", + "default_value": 0.2, + "minimum_value_warning": "-0.5", + "maximum_value_warning": "5.0", + "enabled": "support_enable" + }, + "support_area_smoothing": + { + "label": "Support Area Smoothing", + "description": "Maximum distance in the X/Y directions of a line segment which is to be smoothed out. Ragged lines are introduced by the join distance and support bridge, which cause the machine to resonate. Smoothing the support areas won't cause them to break with the constraints, except it might change the overhang.", + "unit": "mm", + "type": "float", + "default_value": 0.6, + "minimum_value": "0", + "maximum_value_warning": "1.0", + "enabled": "support_enable" + }, + "support_roof_enable": + { + "label": "Enable Support Roof", + "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" + }, + "support_roof_height": + { + "label": "Support Roof Thickness", + "description": "The thickness of the support roofs.", + "unit": "mm", + "type": "float", + "default_value": 1, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "support_roof_enable" + }, + "support_roof_density": + { + "label": "Support Roof Density", + "description": "Adjusts the density of the roof of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", + "unit": "%", + "type": "float", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "enabled":"support_roof_enable", + "global_only": true, + "children": + { + "support_roof_line_distance": + { + "label": "Support Roof Line Distance", + "description": "Distance between the printed support roof lines. This setting is calculated by the support roof Density, but can be adjusted separately.", + "unit": "mm", + "type": "float", + "default_value": 0.4, + "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 + } + } + }, + "support_roof_pattern": + { + "label": "Support Roof Pattern", + "description": "The pattern with which the top of the support is printed.", + "type": "enum", + "options": + { + "lines": "Lines", + "grid": "Grid", + "triangles": "Triangles", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "concentric", + "enabled": "support_roof_enable", + "global_only": true + }, + "support_use_towers": + { + "label": "Use Towers", + "description": "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof.", + "type": "bool", + "default_value": true, + "enabled": "support_enable" + }, + "support_tower_diameter": + { + "label": "Tower Diameter", + "description": "The diameter of a special tower.", + "unit": "mm", + "type": "float", + "default_value": 3.0, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "support_enable and support_use_towers" + }, + "support_minimal_diameter": + { + "label": "Minimum Diameter", + "description": "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.", + "unit": "mm", + "type": "float", + "default_value": 3.0, + "minimum_value": "0", + "maximum_value_warning": "10", + "maximum_value": "support_tower_diameter", + "enabled": "support_enable and support_use_towers" + }, + "support_tower_roof_angle": + { + "label": "Tower Roof Angle", + "description": "The angle of a rooftop of a tower. A higher value results in pointed tower roofs, a lower value results in flattened tower roofs.", + "unit": "°", + "type": "int", + "minimum_value": "0", + "maximum_value": "90", + "default_value": 65, + "enabled": "support_enable and support_use_towers" + } + } + }, + "platform_adhesion": + { + "label": "Platform Adhesion", + "type": "category", + "icon": "category_adhesion", + "description": "Adhesion", + "children": + { + "adhesion_type": + { + "label": "Platform Adhesion Type", + "description": "Different options that help to improve both priming your extrusion and adhesion to the build plate. Brim adds a single layer flat area around the base of your object to prevent warping. Raft adds a thick grid with a roof below the object. Skirt is a line printed around the object, but not connected to the model.", + "type": "enum", + "options": + { + "skirt": "Skirt", + "brim": "Brim", + "raft": "Raft" + }, + "default_value": "brim", + "global_only": "True" + }, + "skirt_line_count": + { + "label": "Skirt Line Count", + "description": "Multiple skirt lines help to prime your extrusion better for small objects. Setting this to 0 will disable the skirt.", + "type": "int", + "default_value": 1, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "adhesion_type == \"skirt\"", + "global_only": "True" + }, + "skirt_gap": + { + "label": "Skirt Distance", + "description": "The horizontal distance between the skirt and the first layer of the print.\nThis is the minimum distance, multiple skirt lines will extend outwards from this distance.", + "unit": "mm", + "type": "float", + "default_value": 3, + "minimum_value_warning": "0", + "maximum_value_warning": "100", + "enabled": "adhesion_type == \"skirt\"", + "global_only": "True" + }, + "skirt_minimal_length": + { + "label": "Skirt Minimum Length", + "description": "The minimum length of the skirt. If this length is not reached by the skirt line count, more skirt lines will be added until the minimum length is reached. Note: If the line count is set to 0 this is ignored.", + "unit": "mm", + "type": "float", + "default_value": 250, + "minimum_value": "0", + "minimum_value_warning": "25", + "maximum_value_warning": "2500", + "enabled": "adhesion_type == \"skirt\"", + "global_only": "True" + }, + "brim_width": + { + "label": "Brim Width", + "description": "The distance from the model to the outermost brim line. A larger brim enhances adhesion to the build plate, but also reduces the effective print area.", + "type": "float", + "unit": "mm", + "default_value": 8.0, + "minimum_value": "0.0", + "maximum_value_warning": "100.0", + "enabled": "adhesion_type == \"brim\"", + "global_only": "True", + "children": + { + "brim_line_count": + { + "label": "Brim Line Count", + "description": "The number of lines used for a brim. More brim lines enhance adhesion to the build plate, but also reduces the effective print area.", + "type": "int", + "default_value": 20, + "minimum_value": "0", + "maximum_value_warning": "300", + "value": "math.ceil(brim_width / skirt_line_width)", + "enabled": "adhesion_type == \"brim\"", + "global_only": "True" + } + } + }, + "raft_margin": + { + "label": "Raft Extra Margin", + "description": "If the raft is enabled, this is the extra raft area around the object which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print.", + "unit": "mm", + "type": "float", + "default_value": 5, + "minimum_value_warning": "0", + "maximum_value_warning": "10", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_airgap": + { + "label": "Raft Air Gap", + "description": "The gap between the final raft layer and the first layer of the object. Only the first layer is raised by this amount to lower the bonding between the raft layer and the object. Makes it easier to peel off the raft.", + "unit": "mm", + "type": "float", + "default_value": 0.35, + "minimum_value": "0", + "maximum_value_warning": "1.0", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_surface_layers": + { + "label": "Raft Top Layers", + "description": "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the object sits on. 2 layers result in a smoother top surface than 1.", + "type": "int", + "default_value": 2, + "minimum_value": "0", + "maximum_value_warning": "20", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_surface_thickness": + { + "label": "Raft Top Layer Thickness", + "description": "Layer thickness of the top raft layers.", + "unit": "mm", + "type": "float", + "default_value": 0.1, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_surface_line_width": + { + "label": "Raft Top Line Width", + "description": "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0.0001", + "maximum_value_warning": "machine_nozzle_size * 2", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_surface_line_spacing": + { + "label": "Raft Top Spacing", + "description": "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0.0001", + "maximum_value_warning": "5.0", + "enabled": "adhesion_type == \"raft\"", + "value": "raft_surface_line_width", + "global_only": "True" + }, + "raft_interface_thickness": + { + "label": "Raft Middle Thickness", + "description": "Layer thickness of the middle raft layer.", + "unit": "mm", + "type": "float", + "default_value": 0.27, + "minimum_value": "0", + "maximum_value_warning": "5.0", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_interface_line_width": + { + "label": "Raft Middle Line Width", + "description": "Width of the lines in the middle raft layer. Making the second layer extrude more causes the lines to stick to the bed.", + "unit": "mm", + "type": "float", + "default_value": 1, + "value": "line_width", + "minimum_value": "0.0001", + "maximum_value_warning": "machine_nozzle_size * 2", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_interface_line_spacing": + { + "label": "Raft Middle Spacing", + "description": "The distance between the raft lines for the middle raft layer. The spacing of the middle should be quite wide, while being dense enough to support the top raft layers.", + "unit": "mm", + "type": "float", + "default_value": 1.0, + "minimum_value": "0", + "maximum_value_warning": "15.0", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_base_thickness": + { + "label": "Raft Base Thickness", + "description": "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer bed.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0", + "maximum_value_warning": "5.0", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_base_line_width": + { + "label": "Raft Base Line Width", + "description": "Width of the lines in the base raft layer. These should be thick lines to assist in bed adhesion.", + "unit": "mm", + "type": "float", + "default_value": 1, + "minimum_value": "0.0001", + "value": "line_width", + "maximum_value_warning": "machine_nozzle_size * 2", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_base_line_spacing": + { + "label": "Raft Line Spacing", + "description": "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate.", + "unit": "mm", + "type": "float", + "default_value": 3.0, + "minimum_value": "0.0001", + "maximum_value_warning": "100", + "enabled": "adhesion_type == \"raft\"", + "global_only": "True" + }, + "raft_speed": + { + "label": "Raft Print Speed", + "description": "The speed at which the raft is printed.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "200", + "enabled": "adhesion_type == \"raft\"", + "value": "speed_print / 60 * 30", + "global_only": "True", + "children": + { + "raft_surface_speed": + { + "label": "Raft Surface Print Speed", + "description": "The speed at which the surface raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "enabled": "adhesion_type == \"raft\"", + "value": "raft_speed", + "global_only": "True" + }, + "raft_interface_speed": + { + "label": "Raft Interface Print Speed", + "description": "The speed at which the interface raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", + "unit": "mm/s", + "type": "float", + "default_value": 15, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "enabled": "adhesion_type == \"raft\"", + "value": "0.5 * raft_speed", + "global_only": "True" + }, + "raft_base_speed": + { + "label": "Raft Base Print Speed", + "description": "The speed at which the base raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", + "unit": "mm/s", + "type": "float", + "default_value": 15, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "200", + "enabled": "adhesion_type == \"raft\"", + "value": "0.5 * raft_speed", + "global_only": "True" + } + } + }, + "raft_fan_speed": + { + "label": "Raft Fan Speed", + "description": "The fan speed for the raft.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 100, + "global_only": "True", + "enabled": "adhesion_type == \"raft\"", + "children": + { + "raft_surface_fan_speed": + { + "label": "Raft Surface Fan Speed", + "description": "The fan speed for the surface raft layers.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 100, + "global_only": "True", + "value": "raft_fan_speed", + "enabled": "adhesion_type == \"raft\"" + }, + "raft_interface_fan_speed": + { + "label": "Raft Interface Fan Speed", + "description": "The fan speed for the interface raft layer.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 100, + "global_only": "True", + "value": "raft_fan_speed", + "enabled": "adhesion_type == \"raft\"" + }, + "raft_base_fan_speed": + { + "label": "Raft Base Fan Speed", + "description": "The fan speed for the base raft layer.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 100, + "global_only": "True", + "value": "raft_fan_speed", + "enabled": "adhesion_type == \"raft\"" + } + } + } + } + }, + "meshfix": + { + "label": "Mesh Fixes", + "type": "category", + "icon": "category_fixes", + "description": "category_fixes", + "children": + { + "meshfix_union_all": + { + "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 + }, + "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 + }, + "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 + }, + "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 + } + } + }, + "blackmagic": + { + "label": "Special Modes", + "type": "category", + "icon": "category_blackmagic", + "description": "category_blackmagic", + "children": + { + "print_sequence": + { + "label": "Print Sequence", + "description": "Whether to print all objects one layer at a time or to wait for one object to finish, before moving on to the next. One at a time mode is only possible if all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes.", + "type": "enum", + "options": + { + "all_at_once": "All at Once", + "one_at_a_time": "One at a Time" + }, + "default_value": "all_at_once", + "global_only": true + }, + "magic_mesh_surface_mode": + { + "label": "Surface Mode", + "description": "Treat the model as a surface only, a volume, or volumes with loose surfaces. The normal print mode only prints enclosed volumes. \"Surface\" prints a single wall tracing the mesh surface with no infill and no top/bottom skin. \"Both\" prints enclosed volumes like normal and any remaining polygons as surfaces.", + "type": "enum", + "options": + { + "normal": "Normal", + "surface": "Surface", + "both": "Both" + }, + "default_value": "normal" + }, + "magic_spiralize": + { + "label": "Spiralize Outer Contour", + "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" + } + } + }, + "experimental": + { + "label": "Experimental Modes", + "type": "category", + "icon": "category_blackmagic", + "description": "experimental!", + "children": + { + "draft_shield_enabled": + { + "label": "Enable Draft Shield", + "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 + }, + "draft_shield_dist": + { + "label": "Draft Shield X/Y Distance", + "description": "Distance of the draft shield from the print, in the X/Y directions.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "100", + "default_value": 10, + "enabled": "draft_shield_enabled", + "global_only": true + }, + "draft_shield_height_limitation": + { + "label": "Draft Shield Limitation", + "description": "Set the height of the draft shield. Choose to print the draft shield at the full height of the object or at a limited height.", + "type": "enum", + "options": + { + "full": "Full", + "limited": "Limited" + }, + "default_value": "full", + "enabled": "draft_shield_enabled", + "global_only": true + }, + "draft_shield_height": + { + "label": "Draft Shield Height", + "description": "Height limitation of the draft shield. Above this height no draft shield will be printed.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "9999", + "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 + }, + "coasting_enable": + { + "label": "Enable Coasting", + "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 + }, + "coasting_volume": + { + "label": "Coasting Volume", + "description": "The volume otherwise oozed. This value should generally be close to the nozzle diameter cubed.", + "unit": "mm³", + "type": "float", + "default_value": 0.064, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "enabled": "coasting_enable", + "global_only": true + }, + "coasting_min_volume": + { + "label": "Minimum Volume Before Coasting", + "description": "The smallest volume an extrusion path should have before allowing coasting. For smaller extrusion paths, less pressure has been built up in the bowden tube and so the coasted volume is scaled linearly. This value should always be larger than the Coasting Volume.", + "unit": "mm³", + "type": "float", + "default_value": 0.8, + "minimum_value": "0", + "maximum_value_warning": "10.0", + "enabled": "coasting_enable", + "global_only": true + }, + "coasting_speed": + { + "label": "Coasting Speed", + "description": "The speed by which to move during coasting, relative to the speed of the extrusion path. A value slightly under 100% is advised, since during the coasting move the pressure in the bowden tube drops.", + "unit": "%", + "type": "float", + "default_value": 90, + "minimum_value": "0.0001", + "maximum_value_warning": "100", + "enabled": "coasting_enable", + "global_only": true + }, + "skin_outline_count": + { + "label": "Extra Skin Wall Count", + "description": "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material.", + "default_value": 0, + "minimum_value": "0", + "maximum_value_warning": "10", + "type": "int" + }, + "skin_alternate_rotation": + { + "label": "Alternate Skin Rotation", + "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\"" + }, + "support_conical_enabled": + { + "label": "Enable Conical Support", + "description": "Experimental feature: Make support areas smaller at the bottom than at the overhang.", + "type": "bool", + "default_value": false, + "enabled": "support_enable" + }, + "support_conical_angle": + { + "label": "Conical Support Angle", + "description": "The angle of the tilt of conical support. With 0 degrees being vertical, and 90 degrees being horizontal. Smaller angles cause the support to be more sturdy, but consist of more material. Negative angles cause the base of the support to be wider than the top.", + "unit": "°", + "type": "float", + "minimum_value": "-90", + "minimum_value_warning": "-45", + "maximum_value_warning": "45", + "maximum_value": "90", + "default_value": 30, + "enabled": "support_conical_enabled and support_enable" + }, + "support_conical_min_width": + { + "label": "Conical Support Minimum Width", + "description": "Minimum width to which the base of the conical support area is reduced. Small widths can lead to unstable support structures.", + "unit": "mm", + "default_value": 5.0, + "minimum_value": "0", + "minimum_value_warning": "machine_nozzle_size * 3", + "maximum_value_warning": "100.0", + "type": "float", + "enabled": "support_conical_enabled and support_enable" + }, + "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 + }, + "magic_fuzzy_skin_thickness": + { + "label": "Fuzzy Skin Thickness", + "description": "The width within which to jitter. It's advised to keep this below the outer wall width, since the inner walls are unaltered.", + "type": "float", + "unit": "mm", + "default_value": 0.3, + "minimum_value": "0.001", + "maximum_value_warning": "wall_line_width_0", + "enabled": "magic_fuzzy_skin_enabled" + }, + "magic_fuzzy_skin_point_density": + { + "label": "Fuzzy Skin Density", + "description": "The average density of points introduced on each polygon in a layer. Note that the original points of the polygon are discarded, so a low density results in a reduction of the resolution.", + "type": "float", + "unit": "1/mm", + "default_value": 1.25, + "minimum_value": "0.008", + "minimum_value_warning": "0.1", + "maximum_value_warning": "10", + "maximum_value": "2 / magic_fuzzy_skin_thickness", + "enabled": "magic_fuzzy_skin_enabled", + "children": + { + "magic_fuzzy_skin_point_dist": + { + "label": "Fuzzy Skin Point Distance", + "description": "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness.", + "type": "float", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "magic_fuzzy_skin_thickness / 2", + "minimum_value_warning": "0.1", + "maximum_value_warning": "10", + "value": "10000 if parent_value == 0 else 1 / magic_fuzzy_skin_point_density", + "enabled": "magic_fuzzy_skin_enabled" + } + } + }, + "wireframe_enabled": + { + "label": "Wire Printing", + "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" + }, + "wireframe_height": + { + "label": "WP Connection Height", + "description": "The height of the upward and diagonally downward lines between two horizontal parts. This determines the overall density of the net structure. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 3, + "minimum_value": "0.0001", + "maximum_value_warning": "20", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_roof_inset": + { + "label": "WP Roof Inset Distance", + "description": "The distance covered when making a connection from a roof outline inward. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 3, + "minimum_value": "0", + "minimum_value_warning": "machine_nozzle_size", + "maximum_value_warning": "20", + "enabled": "wireframe_enabled", + "value": "wireframe_height", + "global_only": "True" + }, + "wireframe_printspeed": + { + "label": "WP Speed", + "description": "Speed at which the nozzle moves when extruding material. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "enabled": "wireframe_enabled", + "global_only": "True", + "children": + { + "wireframe_printspeed_bottom": + { + "label": "WP Bottom Printing Speed", + "description": "Speed of printing the first layer, which is the only layer touching the build platform. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "enabled": "wireframe_enabled", + "global_only": "True", + "value": "wireframe_printspeed" + }, + "wireframe_printspeed_up": + { + "label": "WP Upward Printing Speed", + "description": "Speed of printing a line upward 'in thin air'. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "enabled": "wireframe_enabled", + "global_only": "True", + "value": "wireframe_printspeed" + }, + "wireframe_printspeed_down": + { + "label": "WP Downward Printing Speed", + "description": "Speed of printing a line diagonally downward. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "enabled": "wireframe_enabled", + "global_only": "True", + "value": "wireframe_printspeed" + }, + "wireframe_printspeed_flat": + { + "label": "WP Horizontal Printing Speed", + "description": "Speed of printing the horizontal contours of the object. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "value": "wireframe_printspeed", + "enabled": "wireframe_enabled", + "global_only": "True" + } + } + }, + "wireframe_flow": + { + "label": "WP Flow", + "description": "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing.", + "unit": "%", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "enabled": "wireframe_enabled", + "global_only": "True", + "children": + { + "wireframe_flow_connection": + { + "label": "WP Connection Flow", + "description": "Flow compensation when going up or down. Only applies to Wire Printing.", + "unit": "%", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "enabled": "wireframe_enabled", + "global_only": "True", + "value": "wireframe_flow" + }, + "wireframe_flow_flat": + { + "label": "WP Flat Flow", + "description": "Flow compensation when printing flat lines. Only applies to Wire Printing.", + "unit": "%", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "enabled": "wireframe_enabled", + "global_only": "True", + "value": "wireframe_flow" + } + } + }, + "wireframe_top_delay": + { + "label": "WP Top Delay", + "description": "Delay time after an upward move, so that the upward line can harden. Only applies to Wire Printing.", + "unit": "sec", + "type": "float", + "default_value": 0, + "minimum_value": "0", + "maximum_value_warning": "1", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_bottom_delay": + { + "label": "WP Bottom Delay", + "description": "Delay time after a downward move. Only applies to Wire Printing.", + "unit": "sec", + "type": "float", + "default_value": 0, + "minimum_value": "0", + "maximum_value_warning": "1", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_flat_delay": + { + "label": "WP Flat Delay", + "description": "Delay time between two horizontal segments. Introducing such a delay can cause better adhesion to previous layers at the connection points, while too long delays cause sagging. Only applies to Wire Printing.", + "unit": "sec", + "type": "float", + "default_value": 0.1, + "minimum_value": "0", + "maximum_value_warning": "0.5", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_up_half_speed": + { + "label": "WP Ease Upward", + "description": "Distance of an upward move which is extruded with half speed.\nThis can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.3, + "minimum_value": "0", + "maximum_value_warning": "5.0", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_top_jump": + { + "label": "WP Knot Size", + "description": "Creates a small knot at the top of an upward line, so that the consecutive horizontal layer has a better chance to connect to it. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.6, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_fall_down": + { + "label": "WP Fall Down", + "description": "Distance with which the material falls down after an upward extrusion. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.5, + "minimum_value": "0", + "maximum_value_warning": "wireframe_height", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_drag_along": + { + "label": "WP Drag Along", + "description": "Distance with which the material of an upward extrusion is dragged along with the diagonally downward extrusion. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.6, + "minimum_value": "0", + "maximum_value_warning": "wireframe_height", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_strategy": + { + "label": "WP Strategy", + "description": "Strategy for making sure two consecutive layers connect at each connection point. Retraction lets the upward lines harden in the right position, but may cause filament grinding. A knot can be made at the end of an upward line to heighten the chance of connecting to it and to let the line cool; however, it may require slow printing speeds. Another strategy is to compensate for the sagging of the top of an upward line; however, the lines won't always fall down as predicted.", + "type": "enum", + "options": + { + "compensate": "Compensate", + "knot": "Knot", + "retract": "Retract" + }, + "default_value": "compensate", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_straight_before_down": + { + "label": "WP Straighten Downward Lines", + "description": "Percentage of a diagonally downward line which is covered by a horizontal line piece. This can prevent sagging of the top most point of upward lines. Only applies to Wire Printing.", + "type": "float", + "unit": "%", + "default_value": 20, + "minimum_value": "0", + "maximum_value": "100", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_roof_fall_down": + { + "label": "WP Roof Fall Down", + "description": "The distance which horizontal roof lines printed 'in thin air' fall down when being printed. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 2, + "minimum_value_warning": "0", + "maximum_value_warning": "wireframe_roof_inset", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_roof_drag_along": + { + "label": "WP Roof Drag Along", + "description": "The distance of the end piece of an inward line which gets dragged along when going back to the outer outline of the roof. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_roof_outer_delay": + { + "label": "WP Roof Outer Delay", + "description": "Time spent at the outer perimeters of hole which is to become a roof. Longer times can ensure a better connection. Only applies to Wire Printing.", + "type": "float", + "unit": "sec", + "default_value": 0.2, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "enabled": "wireframe_enabled", + "global_only": "True" + }, + "wireframe_nozzle_clearance": + { + "label": "WP Nozzle Clearance", + "description": "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 1, + "minimum_value_warning": "0", + "maximum_value_warning": "10.0", + "enabled": "wireframe_enabled", + "global_only": "True" + } + } + } + } +} From 6dc74768397c1621f02ff5c598ac2ad50b0d4e47 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 9 May 2016 15:45:58 +0200 Subject: [PATCH 011/224] Removed final parent_value from functions CURA-1278 --- resources/definitions/fdmprinter.def.json | 6 +- resources/machines/fdmprinter.def.json | 2468 --------------------- 2 files changed, 3 insertions(+), 2471 deletions(-) delete mode 100644 resources/machines/fdmprinter.def.json diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index cf92aa847f..00895fd056 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -457,7 +457,7 @@ "minimum_value": "0", "maximum_value_warning": "100", "type": "int", - "value": "0 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" + "value": "0 if infill_sparse_density == 100 else math.ceil(round(top_thickness / layer_height, 4))" } } }, @@ -479,7 +479,7 @@ "minimum_value": "0", "default_value": 6, "type": "int", - "value": "999999 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" + "value": "999999 if infill_sparse_density == 100 else math.ceil(round(bottom_thickness / layer_height, 4))" } } } @@ -2151,7 +2151,7 @@ "minimum_value": "magic_fuzzy_skin_thickness / 2", "minimum_value_warning": "0.1", "maximum_value_warning": "10", - "value": "10000 if parent_value == 0 else 1 / magic_fuzzy_skin_point_density", + "value": "10000 if magic_fuzzy_skin_point_density == 0 else 1 / magic_fuzzy_skin_point_density", "enabled": "magic_fuzzy_skin_enabled" } } diff --git a/resources/machines/fdmprinter.def.json b/resources/machines/fdmprinter.def.json deleted file mode 100644 index cf92aa847f..0000000000 --- a/resources/machines/fdmprinter.def.json +++ /dev/null @@ -1,2468 +0,0 @@ -{ - "id": "fdmprinter", - "version": 2, - "metadata": - { - "category": "Ultimaker", - "manufacturer": "Ultimaker", - "visible": false - }, - "name": "FDM Printer Base Description", - "author": "Ultimaker B.V.", - "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", - "settings": - { - "machine_settings": - { - "label": "Machine", - "type": "category", - "description": "Machine specific settings", - "children": - { - "machine_show_variants": - { - "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" - }, - "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" - }, - "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" - }, - "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" - }, - "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" - }, - "machine_width": - { - "description": "The width (X-direction) of the printable area.", - "default_value": 100, - "global_only": true, - "type": "float", - "label": "Machine width" - }, - "machine_depth": - { - "description": "The depth (Y-direction) of the printable area.", - "default_value": 100, - "global_only": true, - "type": "float", - "label": "Machine depth" - }, - "machine_height": - { - "description": "The height (Z-direction) of the printable area.", - "default_value": 100, - "global_only": true, - "type": "float", - "label": "Machine height" - }, - "machine_heated_bed": - { - "description": "Whether the machine has a heated bed present.", - "default_value": false, - "global_only": true, - "label": "Has heated bed", - "type": "bool" - }, - "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" - }, - "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": "bool", - "label": "Number extruders" - }, - "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" - }, - "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" - }, - "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" - }, - "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" - }, - "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" - }, - "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" - }, - "machine_gcode_flavor": - { - "description": "The type of gcode to be generated.", - "default_value": "RepRap", - "global_only": true, - "type": "str", - "label": "Gcode flavour" - }, - "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" - }, - "machine_head_polygon": - { - "description": "A 2D silhouette of the print head (fan caps excluded).", - "type": "polygon", - "default_value": - [ - [ - -1, - 1 - ], - [ - -1, - -1 - ], - [ - 1, - -1 - ], - [ - 1, - 1 - ] - ], - "global_only": true, - "label": "Machine head polygon" - }, - "machine_head_with_fans_polygon": - { - "description": "A 2D silhouette of the print head (fan caps included).", - "type": "polygon", - "default_value": - [ - [ - -20, - 10 - ], - [ - 10, - 10 - ], - [ - 10, - -10 - ], - [ - -20, - -10 - ] - ], - "global_only": true, - "label": "Machine head & Fan polygon" - }, - "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" - }, - "machine_nozzle_size": - { - "label": "Nozzle Diameter", - "description": "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size.", - "unit": "mm", - "type": "float", - "default_value": 0.4, - "minimum_value": "0.001", - "maximum_value_warning": "10" - } - } - }, - "resolution": - { - "label": "Quality", - "type": "category", - "icon": "category_layer_height", - "description": "All settings that influence the resolution of the print. These settings have a large impact on the quality (and print time)", - "children": - { - "layer_height": - { - "label": "Layer Height", - "description": "The height of each layer in mm. Higher values produce faster prints in lower resolution, lower values produce slower prints in higher resolution.", - "unit": "mm", - "type": "float", - "default_value": 0.1, - "minimum_value": "0.001", - "minimum_value_warning": "0.04", - "maximum_value_warning": "0.8 * machine_nozzle_size", - "global_only": "True" - }, - "layer_height_0": - { - "label": "Initial Layer Height", - "description": "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier.", - "unit": "mm", - "type": "float", - "default_value": 0.3, - "minimum_value": "0.001", - "minimum_value_warning": "0.04", - "maximum_value_warning": "0.8 * machine_nozzle_size", - "global_only": "True" - }, - "line_width": - { - "label": "Line Width", - "description": "Width of a single line. Generally, the width of each line should correspond to the width of the nozzle. However, slightly reducing this value could produce better prints.", - "unit": "mm", - "minimum_value": "0.0001", - "minimum_value_warning": "0.2", - "maximum_value_warning": "2 * machine_nozzle_size", - "default_value": 0.4, - "type": "float", - "value": "machine_nozzle_size", - "children": - { - "wall_line_width": - { - "label": "Wall Line Width", - "description": "Width of a single wall line.", - "unit": "mm", - "minimum_value": "0.0001", - "minimum_value_warning": "0.2", - "maximum_value_warning": "5", - "value":"line_width", - "default_value": 0.4, - "type": "float", - "children": - { - "wall_line_width_0": - { - "label": "Outer Wall Line Width", - "description": "Width of the outermost wall line. By lowering this value, higher levels of detail can be printed.", - "unit": "mm", - "minimum_value": "0.0001", - "minimum_value_warning": "0.2", - "maximum_value_warning": "5", - "default_value": 0.4, - "value":"wall_line_width", - "type": "float" - }, - "wall_line_width_x": - { - "label": "Inner Wall(s) Line Width", - "description": "Width of a single wall line for all wall lines except the outermost one.", - "unit": "mm", - "minimum_value": "0.0001", - "minimum_value_warning": "0.2", - "maximum_value_warning": "5", - "default_value": 0.4, - "value":"wall_line_width", - "type": "float" - } - } - }, - "skin_line_width": - { - "label": "Top/bottom Line Width", - "description": "Width of a single top/bottom line.", - "unit": "mm", - "minimum_value": "0.0001", - "minimum_value_warning": "0.2", - "maximum_value_warning": "5", - "default_value": 0.4, - "type": "float", - "value": "line_width" - }, - "infill_line_width": - { - "label": "Infill Line Width", - "description": "Width of a single infill line.", - "unit": "mm", - "minimum_value": "0.0001", - "minimum_value_warning": "0.2", - "maximum_value_warning": "5", - "default_value": 0.4, - "type": "float", - "value": "line_width" - }, - "skirt_line_width": - { - "label": "Skirt Line Width", - "description": "Width of a single skirt line.", - "unit": "mm", - "minimum_value": "0.0001", - "minimum_value_warning": "0.2", - "maximum_value_warning": "5", - "default_value": 0.4, - "type": "float", - "global_only": true, - "value": "line_width" - }, - "support_line_width": - { - "label": "Support Line Width", - "description": "Width of a single support structure line.", - "unit": "mm", - "minimum_value": "0.0001", - "minimum_value_warning": "0.2", - "maximum_value_warning": "5", - "default_value": 0.4, - "type": "float", - "enabled": "support_enable", - "global_only": true, - "value": "line_width" - }, - "support_roof_line_width": - { - "label": "Support Roof Line Width", - "description": "Width of a single support roof line.", - "unit": "mm", - "default_value": 0.4, - "minimum_value": "0.0001", - "maximum_value_warning": "machine_nozzle_size * 2", - "type": "float", - "enabled": "support_roof_enable", - "global_only": true, - "value": "line_width" - } - } - } - } - }, - "shell": - { - "label": "Shell", - "icon": "category_shell", - "description": "Shell", - "type": "category", - "children": - { - "wall_thickness": - { - "label": "Wall Thickness", - "description": "The thickness of the outside walls in the horizontal direction. This value divided by the wall line width defines the number of walls.", - "unit": "mm", - "default_value": 0.8, - "minimum_value": "0", - "minimum_value_warning": "line_width", - "maximum_value_warning": "5 * line_width", - "type": "float", - "children": - { - "wall_line_count": - { - "label": "Wall Line Count", - "description": "The number of walls. When calculated by the wall thickness, this value is rounded to a whole number.", - "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)" - } - } - }, - "top_bottom_thickness": - { - "label": "Top/Bottom Thickness", - "description": "The thickness of the top/bottom layers in the print. This value divided by the layer height defines the number of top/bottom layers.", - "unit": "mm", - "default_value": 0.8, - "minimum_value": "0", - "maximum_value": "5", - "minimum_value_warning": "0.6", - "type": "float", - "children": - { - "top_thickness": - { - "label": "Top Thickness", - "description": "The thickness of the top layers in the print. This value divided by the layer height defines the number of top layers.", - "unit": "mm", - "default_value": 0.8, - "minimum_value": "0", - "maximum_value_warning": "100", - "type": "float", - "value": "top_bottom_thickness", - "children": - { - "top_layers": - { - "label": "Top Layers", - "description": "The number of top layers. When calculated by the top thickness, this value is rounded to a whole number.", - "default_value": 8, - "minimum_value": "0", - "maximum_value_warning": "100", - "type": "int", - "value": "0 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" - } - } - }, - "bottom_thickness": - { - "label": "Bottom Thickness", - "description": "The thickness of the bottom layers in the print. This value divided by the layer height defines the number of bottom layers.", - "unit": "mm", - "default_value": 0.6, - "minimum_value": "0", - "type": "float", - "value": "top_bottom_thickness", - "children": - { - "bottom_layers": - { - "label": "Bottom Layers", - "description": "The number of bottom layers. When calculated by the bottom thickness, this value is rounded to a whole number.", - "minimum_value": "0", - "default_value": 6, - "type": "int", - "value": "999999 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" - } - } - } - } - }, - "top_bottom_pattern": - { - "label": "Top/Bottom Pattern", - "description": "The pattern of the top/bottom layers.", - "type": "enum", - "options": - { - "lines": "Lines", - "concentric": "Concentric", - "zigzag": "Zig Zag" - }, - "default_value": "lines" - }, - "wall_0_inset": - { - "label": "Outer Wall Inset", - "description": "Inset applied to the path of the outer wall. If the outer wall is smaller than the nozzle, and printed after the inner walls, use this offset to get the hole in the nozzle to overlap with the inner walls instead of the outside of the object.", - "unit": "mm", - "type": "float", - "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" - }, - "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 - }, - "remove_overlapping_walls_enabled": - { - "label": "Remove Overlapping Wall Parts", - "description": "Remove parts of a wall which share an overlap which would result in overextrusion in some places. These overlaps occur in thin parts and sharp corners in models.", - "type": "bool", - "default_value": false, - "enabled": "False", - "children": - { - "remove_overlapping_walls_0_enabled": - { - "label": "Remove Overlapping Outer Wall Parts", - "description": "Remove parts of an outer wall which share an overlap which would result in overextrusion in some places. These overlaps occur in thin pieces in a model and sharp corners.", - "type": "bool", - "default_value": false, - "value": "remove_overlapping_walls_enabled", - "enabled": "False" - }, - "remove_overlapping_walls_x_enabled": - { - "label": "Remove Overlapping Inner Wall Parts", - "description": "Remove parts of an inner wall that would otherwise overlap and cause over-extrusion. These overlaps occur in thin pieces in a model and sharp corners.", - "type": "bool", - "default_value": true, - "value": "remove_overlapping_walls_enabled" - } - } - }, - "fill_perimeter_gaps": - { - "label": "Fill Gaps Between Walls", - "description": "Fills the gaps between walls when overlapping inner wall parts are removed.", - "type": "enum", - "options": - { - "nowhere": "Nowhere", - "everywhere": "Everywhere", - "skin": "Skin" - }, - "default_value": "everywhere", - "enabled": "remove_overlapping_walls_x_enabled" - }, - "travel_compensate_overlapping_walls_enabled": - { - "label": "Compensate Wall Overlaps", - "description": "Compensate the flow for parts of a wall being printed where there is already a wall in place.", - "type": "bool", - "default_value": true - }, - "xy_offset": - { - "label": "Horizontal Expansion", - "description": "Amount of offset applied to all polygons in each layer. Positive values can compensate for too big holes; negative values can compensate for too small holes.", - "unit": "mm", - "type": "float", - "minimum_value_warning": "-10", - "maximum_value_warning": "10", - "default_value": 0 - }, - "z_seam_type": - { - "label": "Z Seam Alignment", - "description": "Starting point of each path in a layer. When paths in consecutive layers start at the same point a vertical seam may show on the print. When aligning these at the back, the seam is easiest to remove. When placed randomly the inaccuracies at the paths' start will be less noticeable. When taking the shortest path the print will be quicker.", - "type": "enum", - "options": - { - "back": "Back", - "shortest": "Shortest", - "random": "Random" - }, - "default_value": "shortest" - }, - "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 - } - } - }, - "infill": - { - "label": "Infill", - "icon": "category_infill", - "description": "Infill", - "type": "category", - "children": - { - "infill_sparse_density": - { - "label": "Infill Density", - "description": "Adjusts the density of infill of the print.", - "unit": "%", - "type": "float", - "default_value": 20, - "minimum_value": "0", - "maximum_value_warning": "100", - "children": - { - "infill_line_distance": - { - "label": "Infill Line Distance", - "description": "Distance between the printed infill lines. This setting is calculated by the infill density and the infill line width.", - "unit": "mm", - "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))" - } - } - }, - "infill_pattern": - { - "label": "Infill Pattern", - "description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle and concentric patterns are fully printed every layer.", - "type": "enum", - "options": - { - "grid": "Grid", - "lines": "Lines", - "triangles": "Triangles", - "concentric": "Concentric", - "zigzag": "Zig Zag" - }, - "default_value": "grid", - "value": "'lines' if infill_sparse_density > 25 else 'grid'" - }, - "infill_overlap": - { - "label": "Infill Overlap Percentage", - "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", - "unit": "%", - "type": "float", - "default_value": 10, - "value": "10 if infill_sparse_density < 95 else 0", - "minimum_value_warning": "-50", - "maximum_value_warning": "100", - "children": - { - "infill_overlap_mm": - { - "label": "Infill Overlap", - "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", - "unit": "mm", - "type": "float", - "default_value": 0.04, - "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 else 0" - } - } - }, - "infill_wipe_dist": - { - "label": "Infill Wipe Distance", - "description": "Distance of a travel move inserted after every infill line, to make the infill stick to the walls better. This option is similar to infill overlap, but without extrusion and only on one end of the infill line.", - "unit": "mm", - "type": "float", - "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" - }, - "infill_sparse_thickness": - { - "label": "Infill Layer Thickness", - "description": "The thickness per layer of infill material. This value should always be a multiple of the layer height and is otherwise rounded.", - "unit": "mm", - "type": "float", - "default_value": 0.1, - "minimum_value": "0.0001", - "maximum_value_warning": "0.32", - "maximum_value": "layer_height * 8", - "value": "layer_height" - }, - "infill_before_walls": - { - "label": "Infill Before Walls", - "description": "Print the infill before printing the walls. Printing the walls first may lead to more accurate walls, but overhangs print worse. Printing the infill first leads to sturdier walls, but the infill pattern might sometimes show through the surface.", - "type": "bool", - "default_value": true - } - } - }, - "material": - { - "label": "Material", - "icon": "category_material", - "description": "Material", - "type": "category", - "children": - { - "material_flow_dependent_temperature": - { - "label": "Auto Temperature", - "description": "Change the temperature for each layer automatically with the average flow speed of that layer.", - "type": "bool", - "default_value": false, - "enabled": "False", - "global_only": true - }, - "material_print_temperature": - { - "label": "Printing Temperature", - "description": "The temperature used for printing. Set at 0 to pre-heat the printer manually.", - "unit": "°C", - "type": "float", - "default_value": 210, - "minimum_value": "0", - "maximum_value_warning": "260", - "enabled": "not (material_flow_dependent_temperature)" - }, - "material_flow_temp_graph": - { - "label": "Flow Temperature Graph", - "description": "Data linking material flow (in mm3 per second) to temperature (degrees Celsius).", - "unit": "", - "type": "str", - "default_value": "[[3.5,200],[7.0,240]]", - "enabled": "False", - "comments": "old enabled function: material_flow_dependent_temperature", - "global_only": true - }, - "material_extrusion_cool_down_speed": { - "label": "Extrusion Cool Down Speed Modifier", - "description": "The extra speed by which the nozzle cools while extruding. The same value is used to signify the heat up speed lost when heating up while extruding.", - "unit": "°C/s", - "type": "float", - "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" - }, - "material_bed_temperature": { - "label": "Bed Temperature", - "description": "The temperature used for the heated bed. Set at 0 to pre-heat the printer manually.", - "unit": "°C", - "type": "float", - "default_value": 60, - "minimum_value": "0", - "maximum_value_warning": "260", - "enabled": "machine_heated_bed", - "global_only": "True" - }, - "material_diameter": { - "label": "Diameter", - "description": "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament.", - "unit": "mm", - "type": "float", - "default_value": 2.85, - "minimum_value": "0.0001", - "minimum_value_warning": "0.4", - "maximum_value_warning": "3.5", - "global_only": "True" - }, - "material_flow": { - "label": "Flow", - "description": "Flow compensation: the amount of material extruded is multiplied by this value.", - "unit": "%", - "default_value": 100, - "type": "float", - "minimum_value": "5", - "minimum_value_warning": "50", - "maximum_value_warning": "150" - }, - "retraction_enable": { - "label": "Enable Retraction", - "description": "Retract the filament when the nozzle is moving over a non-printed area. ", - "type": "bool", - "default_value": true - }, - "retraction_amount": { - "label": "Retraction Distance", - "description": "The length of material retracted during a retraction move.", - "unit": "mm", - "type": "float", - "default_value": 6.5, - "minimum_value_warning": "-0.0001", - "maximum_value_warning": "10.0", - "enabled": "retraction_enable" - }, - "retraction_speed": { - "label": "Retraction Speed", - "description": "The speed at which the filament is retracted and primed during a retraction move.", - "unit": "mm/s", - "type": "float", - "default_value": 25, - "minimum_value": "0", - "maximum_value": "299792458000", - "maximum_value_warning": "100", - "enabled": "retraction_enable", - "children": { - "retraction_retract_speed": { - "label": "Retraction Retract Speed", - "description": "The speed at which the filament is retracted during a retraction move.", - "unit": "mm/s", - "type": "float", - "default_value": 25, - "minimum_value": "0", - "maximum_value": "299792458000", - "maximum_value_warning": "100", - "enabled": "retraction_enable", - "value": "retraction_speed" - }, - "retraction_prime_speed": { - "label": "Retraction Prime Speed", - "description": "The speed at which the filament is primed during a retraction move.", - "unit": "mm/s", - "type": "float", - "default_value": 25, - "minimum_value": "0", - "maximum_value": "299792458000", - "maximum_value_warning": "100", - "enabled": "retraction_enable", - "value": "retraction_speed" - } - } - }, - "retraction_extra_prime_amount": { - "label": "Retraction Extra Prime Amount", - "description": "Some material can ooze away during a travel move, which can be compensated for here.", - "unit": "mm³", - "type": "float", - "default_value": 0, - "minimum_value_warning": "-0.0001", - "maximum_value_warning": "5.0", - "enabled": "retraction_enable" - }, - "retraction_min_travel": { - "label": "Retraction Minimum Travel", - "description": "The minimum distance of travel needed for a retraction to happen at all. This helps to get fewer retractions in a small area.", - "unit": "mm", - "type": "float", - "default_value": 1.5, - "value": "line_width * 2", - "minimum_value": "0", - "maximum_value_warning": "10", - "enabled": "retraction_enable" - }, - "retraction_count_max": { - "label": "Maximum Retraction Count", - "description": "This setting limits the number of retractions occurring within the minimum extrusion distance window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament, as that can flatten the filament and cause grinding issues.", - "default_value": 45, - "minimum_value": "0", - "maximum_value_warning": "100", - "type": "int", - "enabled": "retraction_enable" - }, - "retraction_extrusion_window": { - "label": "Minimum Extrusion Distance Window", - "description": "The window in which the maximum retraction count is enforced. This value should be approximately the same as the retraction distance, so that effectively the number of times a retraction passes the same patch of material is limited.", - "unit": "mm", - "type": "float", - "default_value": 4.5, - "minimum_value": "0", - "maximum_value_warning": "retraction_amount * 2", - "value": "retraction_amount", - "enabled": "retraction_enable" - }, - "retraction_hop": { - "label": "Z Hop when Retracting", - "description": "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.", - "unit": "mm", - "type": "float", - "default_value": 0, - "minimum_value_warning": "-0.0001", - "maximum_value_warning": "10", - "enabled": "retraction_enable" - } - } - }, - "speed": - { - "label": "Speed", - "icon": "category_speed", - "description": "Speed", - "type": "category", - "children": - { - "speed_print": - { - "label": "Print Speed", - "description": "The speed at which printing happens.", - "unit": "mm/s", - "type": "float", - "minimum_value": "0.1", - "maximum_value_warning": "150", - "maximum_value": "299792458000", - "default_value": 60, - "children": - { - "speed_infill": - { - "label": "Infill Speed", - "description": "The speed at which infill is printed.", - "unit": "mm/s", - "type": "float", - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "150", - "default_value": 60, - "value": "speed_print" - }, - "speed_wall": - { - "label": "Wall Speed", - "description": "The speed at which the walls are printed.", - "unit": "mm/s", - "type": "float", - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "150", - "default_value": 30, - "value": "speed_print / 2", - "children": - { - "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.", - "unit": "mm/s", - "type": "float", - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "150", - "default_value": 30, - "value": "speed_wall" - }, - "speed_wall_x": - { - "label": "Inner Wall Speed", - "description": "The speed at which all inner walls are printed Printing the inner wall faster than the outer wall will reduce printing time. It works well to set this in between the outer wall speed and the infill speed.", - "unit": "mm/s", - "type": "float", - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "150", - "default_value": 60, - "value": "speed_wall * 2" - } - } - }, - "speed_topbottom": - { - "label": "Top/Bottom Speed", - "description": "The speed at which top/bottom layers are printed.", - "unit": "mm/s", - "type": "float", - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "150", - "default_value": 30, - "value": "speed_print / 2" - }, - "speed_support": - { - "label": "Support Speed", - "description": "The speed at which the support structure is printed. Printing support at higher speeds can greatly reduce printing time. The surface quality of the support structure is not important since it is removed after printing.", - "unit": "mm/s", - "type": "float", - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "150", - "default_value": 60, - "value": "speed_print", - "enabled": "support_roof_enable", - "children": - { - "speed_support_infill": - { - "label": "Support Infill Speed", - "description": "The speed at which the infill of support is printed. Printing the infill at lower speeds improves stability.", - "unit": "mm/s", - "type": "float", - "default_value": 60, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "150", - "value": "speed_support", - "enabled": "support_enable", - "global_only": true - }, - "speed_support_roof": - { - "label": "Support Roof Speed", - "description": "The speed at which the roofs of support are printed. Printing the support roof at lower speeds can improve overhang quality.", - "unit": "mm/s", - "type": "float", - "default_value": 40, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "150", - "enabled": "support_roof_enable", - "value": "speed_support / 1.5", - "global_only": true - } - } - } - } - }, - "speed_travel": - { - "label": "Travel Speed", - "description": "The speed at which travel moves are made.", - "unit": "mm/s", - "type": "float", - "default_value": 120, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "300", - "value": "speed_print if magic_spiralize else 120", - "global_only": true - }, - "speed_layer_0": { - "label": "Initial Layer Speed", - "description": "The print speed for the initial layer. A lower value is advised to improve adhesion to the build plate.", - "unit": "mm/s", - "type": "float", - "default_value": 30, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "300" - }, - "skirt_speed": { - "label": "Skirt Speed", - "description": "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed, but sometimes you might want to print the skirt at a different speed.", - "unit": "mm/s", - "type": "float", - "default_value": 30, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "300", - "value": "speed_layer_0", - "global_only": true - }, - "speed_slowdown_layers": - { - "label": "Number of Slower Layers", - "description": "The first few layers are printed slower than the rest of the object, to get better adhesion to the build plate and improve the overall success rate of prints. The speed is gradually increased over these layers.", - "type": "int", - "default_value": 2, - "minimum_value": "0", - "maximum_value": "299792458000", - "maximum_value_warning": "300", - "global_only": true - } - } - }, - "travel": - { - "label": "Travel", - "icon": "category_travel", - "description": "travel", - "type": "category", - "children": - { - "retraction_combing": - { - "label": "Combing Mode", - "description": "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only.", - "type": "enum", - "options": - { - "off": "Off", - "all": "All", - "noskin": "No Skin" - }, - "default_value": "all", - "global_only": true - }, - "travel_avoid_other_parts": - { - "label": "Avoid Printed Parts when Traveling", - "description": "The nozzle avoids already printed parts when traveling. This option is only available when combing is enabled.", - "type": "bool", - "default_value": true, - "enabled": "retraction_combing != \"off\"", - "global_only": "True" - }, - "travel_avoid_distance": - { - "label": "Travel Avoid Distance", - "description": "The distance between the nozzle and already printed parts when avoiding during travel moves.", - "unit": "mm", - "type": "float", - "default_value": 1.5, - "value": "machine_nozzle_tip_outer_diameter / 2 * 1.25", - "minimum_value": "0", - "maximum_value_warning": "machine_nozzle_tip_outer_diameter * 5", - "enabled": "retraction_combing != \"off\" and travel_avoid_other_parts", - "global_only": "True" - } - } - }, - "cooling": - { - "label": "Cooling", - "icon": "category_cool", - "description": "Cooling", - "type": "category", - "children": - { - "cool_fan_enabled": - { - "label": "Enable Cooling Fans", - "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" - }, - "cool_fan_speed": - { - "label": "Fan Speed", - "description": "The speed at which the cooling fans spin.", - "unit": "%", - "type": "float", - "minimum_value": "0", - "maximum_value": "100", - "default_value": 100, - "value": "100.0 if cool_fan_enabled else 0.0", - "enabled": "cool_fan_enabled", - "global_only": "True", - "children": - { - "cool_fan_speed_min": - { - "label": "Regular Fan Speed", - "description": "The speed at which the fans spin before hitting the threshold. When a layer prints faster than the threshold, the fan speed gradually inclines towards the maximum fan speed.", - "unit": "%", - "type": "float", - "minimum_value": "0", - "maximum_value": "100", - "value": "cool_fan_speed", - "default_value": 100, - "enabled": "cool_fan_enabled", - "global_only": "True" - }, - "cool_fan_speed_max": - { - "label": "Maximum Fan Speed", - "description": "The speed at which the fans spin on the minimum layer time. The fan speed gradually increases between the regular fan speed and maximum fan speed when the threshold is hit.", - "unit": "%", - "type": "float", - "minimum_value": "max(0, cool_fan_speed_min)", - "maximum_value": "100", - "default_value": 100, - "enabled": "cool_fan_enabled", - "global_only": "True", - "value": "cool_fan_speed" - } - } - }, - "cool_min_layer_time_fan_speed_max": - { - "label": "Regular/Maximum Fan Speed Threshold", - "description": "The layer time which sets the threshold between regular fan speed and maximum fan speed. Layers that print slower than this time use regular fan speed. For faster layers the fan speed gradually increases towards the maximum fan speed.", - "unit": "sec", - "type": "float", - "default_value": 10, - "minimum_value": "cool_min_layer_time", - "maximum_value_warning": "600", - "global_only": "True" - }, - "cool_fan_full_at_height": - { - "label": "Regular Fan Speed at Height", - "description": "The height at which the fans spin on regular fan speed. At the layers below the fan speed gradually increases from zero to regular fan speed.", - "unit": "mm", - "type": "float", - "default_value": 0.5, - "value": "layer_height_0", - "minimum_value": "0", - "maximum_value_warning": "10.0", - "global_only": "True", - "children": - { - "cool_fan_full_layer": - { - "label": "Regular Fan Speed at Layer", - "description": "The layer at which the fans spin on regular fan speed. If regular fan speed at height is set, this value is calculated and rounded to a whole number.", - "type": "int", - "default_value": 1, - "minimum_value": "0", - "maximum_value_warning": "100", - "value": "int((cool_fan_full_at_height - layer_height_0 + 0.001) / layer_height) + 1", - "global_only": "True" - } - } - }, - "cool_min_layer_time": - { - "label": "Minimum Layer Time", - "description": "The minimum time spent in a layer. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer.", - "unit": "sec", - "type": "float", - "default_value": 5, - "minimum_value": "0", - "maximum_value_warning": "600", - "global_only": "True" - }, - "cool_min_speed": - { - "label": "Minimum Speed", - "description": "The minimum print speed, despite slowing down due to the minimum layer time. When the printer would slow down too much, the pressure in the nozzle would be too low and result in bad print quality.", - "unit": "mm/s", - "type": "float", - "default_value": 10, - "minimum_value": "0", - "maximum_value_warning": "100", - "global_only": "True" - }, - "cool_lift_head": - { - "label": "Lift Head", - "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" - } - } - }, - "support": - { - "label": "Support", - "type": "category", - "icon": "category_support", - "description": "Support", - "children": - { - "support_enable": - { - "label": "Enable Support", - "description": "Enable support structures. These structures support parts of the model with severe overhangs.", - "type": "bool", - "default_value": false - }, - "support_type": - { - "label": "Support Placement", - "description": "Adjusts the placement of the support structures. The placement can be set to touching build plate or everywhere. When set to everywhere the support structures will also be printed on the model.", - "type": "enum", - "options": - { - "buildplate": "Touching Buildplate", - "everywhere": "Everywhere" - }, - "default_value": "everywhere", - "enabled": "support_enable" - }, - "support_angle": - { - "label": "Support Overhang Angle", - "description": "The minimum angle of overhangs for which support is added. At a value of 0° all overhangs are supported, 90° will not provide any support.", - "unit": "°", - "type": "float", - "minimum_value": "0", - "maximum_value": "90", - "default_value": 50, - "enabled": "support_enable" - }, - "support_pattern": - { - "label": "Support Pattern", - "description": "The pattern of the support structures of the print. The different options available result in sturdy or easy to remove support.", - "type": "enum", - "options": - { - "lines": "Lines", - "grid": "Grid", - "triangles": "Triangles", - "concentric": "Concentric", - "zigzag": "Zig Zag" - }, - "default_value": "zigzag", - "enabled": "support_enable", - "global_only": true - }, - "support_connect_zigzags": - { - "label": "Connect Support ZigZags", - "description": "Connect the ZigZags. This will increase the strength of the zig zag support structure.", - "type": "bool", - "default_value": true, - "enabled": "support_enable and (support_pattern == \"zigzag\")", - "global_only": true - }, - "support_infill_rate": - { - "label": "Support Density", - "description": "Adjusts the density of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", - "unit": "%", - "type": "float", - "minimum_value": "0", - "maximum_value_warning": "100", - "default_value": 15, - "enabled": "support_enable", - "global_only": true, - "children": { - "support_line_distance": - { - "label": "Support Line Distance", - "description": "Distance between the printed support structure lines. This setting is calculated by the support density.", - "unit": "mm", - "type": "float", - "minimum_value": "0", - "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 - } - } - }, - "support_xy_distance": - { - "label": "Support X/Y Distance", - "description": "Distance of the support structure from the print in the X/Y directions.", - "unit": "mm", - "type": "float", - "minimum_value": "0", - "maximum_value_warning": "10", - "default_value": 0.7, - "enabled": "support_enable" - }, - "support_z_distance": - { - "label": "Support Z Distance", - "description": "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded down to a multiple of the layer height.", - "unit": "mm", - "type": "float", - "minimum_value": "0", - "maximum_value_warning": "10", - "default_value": 0.15, - "enabled": "support_enable", - - "children": - { - "support_top_distance": - { - "label": "Support Top Distance", - "description": "Distance from the top of the support to the print.", - "unit": "mm", - "minimum_value": "0", - "maximum_value_warning": "10", - "default_value": 0.15, - "type": "float", - "enabled": "support_enable", - "value": "support_z_distance" - }, - "support_bottom_distance": - { - "label": "Support Bottom Distance", - "description": "Distance from the print to the bottom of the support.", - "unit": "mm", - "minimum_value": "0", - "maximum_value_warning": "10", - "default_value": 0.1, - "value": "0.1 if support_type == 'everywhere' else 0", - "type": "float", - "enabled": "support_enable and support_type == 'everywhere'" - } - } - }, - "support_bottom_stair_step_height": - { - "label": "Support Stair Step Height", - "description": "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures.", - "unit": "mm", - "type": "float", - "default_value": 0.3, - "minimum_value": "0", - "maximum_value_warning": "1.0", - "enabled": "support_enable" - }, - "support_join_distance": - { - "label": "Support Join Distance", - "description": "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one.", - "unit": "mm", - "type": "float", - "default_value": 2.0, - "minimum_value_warning": "0", - "maximum_value_warning": "10", - "enabled": "support_enable" - }, - "support_offset": - { - "label": "Support Horizontal Expansion", - "description": "Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support.", - "unit": "mm", - "type": "float", - "default_value": 0.2, - "minimum_value_warning": "-0.5", - "maximum_value_warning": "5.0", - "enabled": "support_enable" - }, - "support_area_smoothing": - { - "label": "Support Area Smoothing", - "description": "Maximum distance in the X/Y directions of a line segment which is to be smoothed out. Ragged lines are introduced by the join distance and support bridge, which cause the machine to resonate. Smoothing the support areas won't cause them to break with the constraints, except it might change the overhang.", - "unit": "mm", - "type": "float", - "default_value": 0.6, - "minimum_value": "0", - "maximum_value_warning": "1.0", - "enabled": "support_enable" - }, - "support_roof_enable": - { - "label": "Enable Support Roof", - "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" - }, - "support_roof_height": - { - "label": "Support Roof Thickness", - "description": "The thickness of the support roofs.", - "unit": "mm", - "type": "float", - "default_value": 1, - "minimum_value": "0", - "maximum_value_warning": "10", - "enabled": "support_roof_enable" - }, - "support_roof_density": - { - "label": "Support Roof Density", - "description": "Adjusts the density of the roof of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", - "unit": "%", - "type": "float", - "default_value": 100, - "minimum_value": "0", - "maximum_value_warning": "100", - "enabled":"support_roof_enable", - "global_only": true, - "children": - { - "support_roof_line_distance": - { - "label": "Support Roof Line Distance", - "description": "Distance between the printed support roof lines. This setting is calculated by the support roof Density, but can be adjusted separately.", - "unit": "mm", - "type": "float", - "default_value": 0.4, - "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 - } - } - }, - "support_roof_pattern": - { - "label": "Support Roof Pattern", - "description": "The pattern with which the top of the support is printed.", - "type": "enum", - "options": - { - "lines": "Lines", - "grid": "Grid", - "triangles": "Triangles", - "concentric": "Concentric", - "zigzag": "Zig Zag" - }, - "default_value": "concentric", - "enabled": "support_roof_enable", - "global_only": true - }, - "support_use_towers": - { - "label": "Use Towers", - "description": "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof.", - "type": "bool", - "default_value": true, - "enabled": "support_enable" - }, - "support_tower_diameter": - { - "label": "Tower Diameter", - "description": "The diameter of a special tower.", - "unit": "mm", - "type": "float", - "default_value": 3.0, - "minimum_value": "0", - "maximum_value_warning": "10", - "enabled": "support_enable and support_use_towers" - }, - "support_minimal_diameter": - { - "label": "Minimum Diameter", - "description": "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.", - "unit": "mm", - "type": "float", - "default_value": 3.0, - "minimum_value": "0", - "maximum_value_warning": "10", - "maximum_value": "support_tower_diameter", - "enabled": "support_enable and support_use_towers" - }, - "support_tower_roof_angle": - { - "label": "Tower Roof Angle", - "description": "The angle of a rooftop of a tower. A higher value results in pointed tower roofs, a lower value results in flattened tower roofs.", - "unit": "°", - "type": "int", - "minimum_value": "0", - "maximum_value": "90", - "default_value": 65, - "enabled": "support_enable and support_use_towers" - } - } - }, - "platform_adhesion": - { - "label": "Platform Adhesion", - "type": "category", - "icon": "category_adhesion", - "description": "Adhesion", - "children": - { - "adhesion_type": - { - "label": "Platform Adhesion Type", - "description": "Different options that help to improve both priming your extrusion and adhesion to the build plate. Brim adds a single layer flat area around the base of your object to prevent warping. Raft adds a thick grid with a roof below the object. Skirt is a line printed around the object, but not connected to the model.", - "type": "enum", - "options": - { - "skirt": "Skirt", - "brim": "Brim", - "raft": "Raft" - }, - "default_value": "brim", - "global_only": "True" - }, - "skirt_line_count": - { - "label": "Skirt Line Count", - "description": "Multiple skirt lines help to prime your extrusion better for small objects. Setting this to 0 will disable the skirt.", - "type": "int", - "default_value": 1, - "minimum_value": "0", - "maximum_value_warning": "10", - "enabled": "adhesion_type == \"skirt\"", - "global_only": "True" - }, - "skirt_gap": - { - "label": "Skirt Distance", - "description": "The horizontal distance between the skirt and the first layer of the print.\nThis is the minimum distance, multiple skirt lines will extend outwards from this distance.", - "unit": "mm", - "type": "float", - "default_value": 3, - "minimum_value_warning": "0", - "maximum_value_warning": "100", - "enabled": "adhesion_type == \"skirt\"", - "global_only": "True" - }, - "skirt_minimal_length": - { - "label": "Skirt Minimum Length", - "description": "The minimum length of the skirt. If this length is not reached by the skirt line count, more skirt lines will be added until the minimum length is reached. Note: If the line count is set to 0 this is ignored.", - "unit": "mm", - "type": "float", - "default_value": 250, - "minimum_value": "0", - "minimum_value_warning": "25", - "maximum_value_warning": "2500", - "enabled": "adhesion_type == \"skirt\"", - "global_only": "True" - }, - "brim_width": - { - "label": "Brim Width", - "description": "The distance from the model to the outermost brim line. A larger brim enhances adhesion to the build plate, but also reduces the effective print area.", - "type": "float", - "unit": "mm", - "default_value": 8.0, - "minimum_value": "0.0", - "maximum_value_warning": "100.0", - "enabled": "adhesion_type == \"brim\"", - "global_only": "True", - "children": - { - "brim_line_count": - { - "label": "Brim Line Count", - "description": "The number of lines used for a brim. More brim lines enhance adhesion to the build plate, but also reduces the effective print area.", - "type": "int", - "default_value": 20, - "minimum_value": "0", - "maximum_value_warning": "300", - "value": "math.ceil(brim_width / skirt_line_width)", - "enabled": "adhesion_type == \"brim\"", - "global_only": "True" - } - } - }, - "raft_margin": - { - "label": "Raft Extra Margin", - "description": "If the raft is enabled, this is the extra raft area around the object which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print.", - "unit": "mm", - "type": "float", - "default_value": 5, - "minimum_value_warning": "0", - "maximum_value_warning": "10", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" - }, - "raft_airgap": - { - "label": "Raft Air Gap", - "description": "The gap between the final raft layer and the first layer of the object. Only the first layer is raised by this amount to lower the bonding between the raft layer and the object. Makes it easier to peel off the raft.", - "unit": "mm", - "type": "float", - "default_value": 0.35, - "minimum_value": "0", - "maximum_value_warning": "1.0", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" - }, - "raft_surface_layers": - { - "label": "Raft Top Layers", - "description": "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the object sits on. 2 layers result in a smoother top surface than 1.", - "type": "int", - "default_value": 2, - "minimum_value": "0", - "maximum_value_warning": "20", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" - }, - "raft_surface_thickness": - { - "label": "Raft Top Layer Thickness", - "description": "Layer thickness of the top raft layers.", - "unit": "mm", - "type": "float", - "default_value": 0.1, - "minimum_value": "0", - "maximum_value_warning": "2.0", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" - }, - "raft_surface_line_width": - { - "label": "Raft Top Line Width", - "description": "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth.", - "unit": "mm", - "type": "float", - "default_value": 0.3, - "minimum_value": "0.0001", - "maximum_value_warning": "machine_nozzle_size * 2", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" - }, - "raft_surface_line_spacing": - { - "label": "Raft Top Spacing", - "description": "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid.", - "unit": "mm", - "type": "float", - "default_value": 0.3, - "minimum_value": "0.0001", - "maximum_value_warning": "5.0", - "enabled": "adhesion_type == \"raft\"", - "value": "raft_surface_line_width", - "global_only": "True" - }, - "raft_interface_thickness": - { - "label": "Raft Middle Thickness", - "description": "Layer thickness of the middle raft layer.", - "unit": "mm", - "type": "float", - "default_value": 0.27, - "minimum_value": "0", - "maximum_value_warning": "5.0", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" - }, - "raft_interface_line_width": - { - "label": "Raft Middle Line Width", - "description": "Width of the lines in the middle raft layer. Making the second layer extrude more causes the lines to stick to the bed.", - "unit": "mm", - "type": "float", - "default_value": 1, - "value": "line_width", - "minimum_value": "0.0001", - "maximum_value_warning": "machine_nozzle_size * 2", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" - }, - "raft_interface_line_spacing": - { - "label": "Raft Middle Spacing", - "description": "The distance between the raft lines for the middle raft layer. The spacing of the middle should be quite wide, while being dense enough to support the top raft layers.", - "unit": "mm", - "type": "float", - "default_value": 1.0, - "minimum_value": "0", - "maximum_value_warning": "15.0", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" - }, - "raft_base_thickness": - { - "label": "Raft Base Thickness", - "description": "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer bed.", - "unit": "mm", - "type": "float", - "default_value": 0.3, - "minimum_value": "0", - "maximum_value_warning": "5.0", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" - }, - "raft_base_line_width": - { - "label": "Raft Base Line Width", - "description": "Width of the lines in the base raft layer. These should be thick lines to assist in bed adhesion.", - "unit": "mm", - "type": "float", - "default_value": 1, - "minimum_value": "0.0001", - "value": "line_width", - "maximum_value_warning": "machine_nozzle_size * 2", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" - }, - "raft_base_line_spacing": - { - "label": "Raft Line Spacing", - "description": "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate.", - "unit": "mm", - "type": "float", - "default_value": 3.0, - "minimum_value": "0.0001", - "maximum_value_warning": "100", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True" - }, - "raft_speed": - { - "label": "Raft Print Speed", - "description": "The speed at which the raft is printed.", - "unit": "mm/s", - "type": "float", - "default_value": 30, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "200", - "enabled": "adhesion_type == \"raft\"", - "value": "speed_print / 60 * 30", - "global_only": "True", - "children": - { - "raft_surface_speed": - { - "label": "Raft Surface Print Speed", - "description": "The speed at which the surface raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines.", - "unit": "mm/s", - "type": "float", - "default_value": 30, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "100", - "enabled": "adhesion_type == \"raft\"", - "value": "raft_speed", - "global_only": "True" - }, - "raft_interface_speed": - { - "label": "Raft Interface Print Speed", - "description": "The speed at which the interface raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", - "unit": "mm/s", - "type": "float", - "default_value": 15, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "150", - "enabled": "adhesion_type == \"raft\"", - "value": "0.5 * raft_speed", - "global_only": "True" - }, - "raft_base_speed": - { - "label": "Raft Base Print Speed", - "description": "The speed at which the base raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", - "unit": "mm/s", - "type": "float", - "default_value": 15, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "200", - "enabled": "adhesion_type == \"raft\"", - "value": "0.5 * raft_speed", - "global_only": "True" - } - } - }, - "raft_fan_speed": - { - "label": "Raft Fan Speed", - "description": "The fan speed for the raft.", - "unit": "%", - "type": "float", - "minimum_value": "0", - "maximum_value": "100", - "default_value": 100, - "global_only": "True", - "enabled": "adhesion_type == \"raft\"", - "children": - { - "raft_surface_fan_speed": - { - "label": "Raft Surface Fan Speed", - "description": "The fan speed for the surface raft layers.", - "unit": "%", - "type": "float", - "minimum_value": "0", - "maximum_value": "100", - "default_value": 100, - "global_only": "True", - "value": "raft_fan_speed", - "enabled": "adhesion_type == \"raft\"" - }, - "raft_interface_fan_speed": - { - "label": "Raft Interface Fan Speed", - "description": "The fan speed for the interface raft layer.", - "unit": "%", - "type": "float", - "minimum_value": "0", - "maximum_value": "100", - "default_value": 100, - "global_only": "True", - "value": "raft_fan_speed", - "enabled": "adhesion_type == \"raft\"" - }, - "raft_base_fan_speed": - { - "label": "Raft Base Fan Speed", - "description": "The fan speed for the base raft layer.", - "unit": "%", - "type": "float", - "minimum_value": "0", - "maximum_value": "100", - "default_value": 100, - "global_only": "True", - "value": "raft_fan_speed", - "enabled": "adhesion_type == \"raft\"" - } - } - } - } - }, - "meshfix": - { - "label": "Mesh Fixes", - "type": "category", - "icon": "category_fixes", - "description": "category_fixes", - "children": - { - "meshfix_union_all": - { - "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 - }, - "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 - }, - "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 - }, - "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 - } - } - }, - "blackmagic": - { - "label": "Special Modes", - "type": "category", - "icon": "category_blackmagic", - "description": "category_blackmagic", - "children": - { - "print_sequence": - { - "label": "Print Sequence", - "description": "Whether to print all objects one layer at a time or to wait for one object to finish, before moving on to the next. One at a time mode is only possible if all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes.", - "type": "enum", - "options": - { - "all_at_once": "All at Once", - "one_at_a_time": "One at a Time" - }, - "default_value": "all_at_once", - "global_only": true - }, - "magic_mesh_surface_mode": - { - "label": "Surface Mode", - "description": "Treat the model as a surface only, a volume, or volumes with loose surfaces. The normal print mode only prints enclosed volumes. \"Surface\" prints a single wall tracing the mesh surface with no infill and no top/bottom skin. \"Both\" prints enclosed volumes like normal and any remaining polygons as surfaces.", - "type": "enum", - "options": - { - "normal": "Normal", - "surface": "Surface", - "both": "Both" - }, - "default_value": "normal" - }, - "magic_spiralize": - { - "label": "Spiralize Outer Contour", - "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" - } - } - }, - "experimental": - { - "label": "Experimental Modes", - "type": "category", - "icon": "category_blackmagic", - "description": "experimental!", - "children": - { - "draft_shield_enabled": - { - "label": "Enable Draft Shield", - "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 - }, - "draft_shield_dist": - { - "label": "Draft Shield X/Y Distance", - "description": "Distance of the draft shield from the print, in the X/Y directions.", - "unit": "mm", - "type": "float", - "minimum_value": "0", - "maximum_value_warning": "100", - "default_value": 10, - "enabled": "draft_shield_enabled", - "global_only": true - }, - "draft_shield_height_limitation": - { - "label": "Draft Shield Limitation", - "description": "Set the height of the draft shield. Choose to print the draft shield at the full height of the object or at a limited height.", - "type": "enum", - "options": - { - "full": "Full", - "limited": "Limited" - }, - "default_value": "full", - "enabled": "draft_shield_enabled", - "global_only": true - }, - "draft_shield_height": - { - "label": "Draft Shield Height", - "description": "Height limitation of the draft shield. Above this height no draft shield will be printed.", - "unit": "mm", - "type": "float", - "minimum_value": "0", - "maximum_value_warning": "9999", - "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 - }, - "coasting_enable": - { - "label": "Enable Coasting", - "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 - }, - "coasting_volume": - { - "label": "Coasting Volume", - "description": "The volume otherwise oozed. This value should generally be close to the nozzle diameter cubed.", - "unit": "mm³", - "type": "float", - "default_value": 0.064, - "minimum_value": "0", - "maximum_value_warning": "2.0", - "enabled": "coasting_enable", - "global_only": true - }, - "coasting_min_volume": - { - "label": "Minimum Volume Before Coasting", - "description": "The smallest volume an extrusion path should have before allowing coasting. For smaller extrusion paths, less pressure has been built up in the bowden tube and so the coasted volume is scaled linearly. This value should always be larger than the Coasting Volume.", - "unit": "mm³", - "type": "float", - "default_value": 0.8, - "minimum_value": "0", - "maximum_value_warning": "10.0", - "enabled": "coasting_enable", - "global_only": true - }, - "coasting_speed": - { - "label": "Coasting Speed", - "description": "The speed by which to move during coasting, relative to the speed of the extrusion path. A value slightly under 100% is advised, since during the coasting move the pressure in the bowden tube drops.", - "unit": "%", - "type": "float", - "default_value": 90, - "minimum_value": "0.0001", - "maximum_value_warning": "100", - "enabled": "coasting_enable", - "global_only": true - }, - "skin_outline_count": - { - "label": "Extra Skin Wall Count", - "description": "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material.", - "default_value": 0, - "minimum_value": "0", - "maximum_value_warning": "10", - "type": "int" - }, - "skin_alternate_rotation": - { - "label": "Alternate Skin Rotation", - "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\"" - }, - "support_conical_enabled": - { - "label": "Enable Conical Support", - "description": "Experimental feature: Make support areas smaller at the bottom than at the overhang.", - "type": "bool", - "default_value": false, - "enabled": "support_enable" - }, - "support_conical_angle": - { - "label": "Conical Support Angle", - "description": "The angle of the tilt of conical support. With 0 degrees being vertical, and 90 degrees being horizontal. Smaller angles cause the support to be more sturdy, but consist of more material. Negative angles cause the base of the support to be wider than the top.", - "unit": "°", - "type": "float", - "minimum_value": "-90", - "minimum_value_warning": "-45", - "maximum_value_warning": "45", - "maximum_value": "90", - "default_value": 30, - "enabled": "support_conical_enabled and support_enable" - }, - "support_conical_min_width": - { - "label": "Conical Support Minimum Width", - "description": "Minimum width to which the base of the conical support area is reduced. Small widths can lead to unstable support structures.", - "unit": "mm", - "default_value": 5.0, - "minimum_value": "0", - "minimum_value_warning": "machine_nozzle_size * 3", - "maximum_value_warning": "100.0", - "type": "float", - "enabled": "support_conical_enabled and support_enable" - }, - "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 - }, - "magic_fuzzy_skin_thickness": - { - "label": "Fuzzy Skin Thickness", - "description": "The width within which to jitter. It's advised to keep this below the outer wall width, since the inner walls are unaltered.", - "type": "float", - "unit": "mm", - "default_value": 0.3, - "minimum_value": "0.001", - "maximum_value_warning": "wall_line_width_0", - "enabled": "magic_fuzzy_skin_enabled" - }, - "magic_fuzzy_skin_point_density": - { - "label": "Fuzzy Skin Density", - "description": "The average density of points introduced on each polygon in a layer. Note that the original points of the polygon are discarded, so a low density results in a reduction of the resolution.", - "type": "float", - "unit": "1/mm", - "default_value": 1.25, - "minimum_value": "0.008", - "minimum_value_warning": "0.1", - "maximum_value_warning": "10", - "maximum_value": "2 / magic_fuzzy_skin_thickness", - "enabled": "magic_fuzzy_skin_enabled", - "children": - { - "magic_fuzzy_skin_point_dist": - { - "label": "Fuzzy Skin Point Distance", - "description": "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness.", - "type": "float", - "unit": "mm", - "default_value": 0.8, - "minimum_value": "magic_fuzzy_skin_thickness / 2", - "minimum_value_warning": "0.1", - "maximum_value_warning": "10", - "value": "10000 if parent_value == 0 else 1 / magic_fuzzy_skin_point_density", - "enabled": "magic_fuzzy_skin_enabled" - } - } - }, - "wireframe_enabled": - { - "label": "Wire Printing", - "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" - }, - "wireframe_height": - { - "label": "WP Connection Height", - "description": "The height of the upward and diagonally downward lines between two horizontal parts. This determines the overall density of the net structure. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default_value": 3, - "minimum_value": "0.0001", - "maximum_value_warning": "20", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_roof_inset": - { - "label": "WP Roof Inset Distance", - "description": "The distance covered when making a connection from a roof outline inward. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default_value": 3, - "minimum_value": "0", - "minimum_value_warning": "machine_nozzle_size", - "maximum_value_warning": "20", - "enabled": "wireframe_enabled", - "value": "wireframe_height", - "global_only": "True" - }, - "wireframe_printspeed": - { - "label": "WP Speed", - "description": "Speed at which the nozzle moves when extruding material. Only applies to Wire Printing.", - "unit": "mm/s", - "type": "float", - "default_value": 5, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "50", - "enabled": "wireframe_enabled", - "global_only": "True", - "children": - { - "wireframe_printspeed_bottom": - { - "label": "WP Bottom Printing Speed", - "description": "Speed of printing the first layer, which is the only layer touching the build platform. Only applies to Wire Printing.", - "unit": "mm/s", - "type": "float", - "default_value": 5, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "50", - "enabled": "wireframe_enabled", - "global_only": "True", - "value": "wireframe_printspeed" - }, - "wireframe_printspeed_up": - { - "label": "WP Upward Printing Speed", - "description": "Speed of printing a line upward 'in thin air'. Only applies to Wire Printing.", - "unit": "mm/s", - "type": "float", - "default_value": 5, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "50", - "enabled": "wireframe_enabled", - "global_only": "True", - "value": "wireframe_printspeed" - }, - "wireframe_printspeed_down": - { - "label": "WP Downward Printing Speed", - "description": "Speed of printing a line diagonally downward. Only applies to Wire Printing.", - "unit": "mm/s", - "type": "float", - "default_value": 5, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "50", - "enabled": "wireframe_enabled", - "global_only": "True", - "value": "wireframe_printspeed" - }, - "wireframe_printspeed_flat": - { - "label": "WP Horizontal Printing Speed", - "description": "Speed of printing the horizontal contours of the object. Only applies to Wire Printing.", - "unit": "mm/s", - "type": "float", - "default_value": 5, - "minimum_value": "0.1", - "maximum_value": "299792458000", - "maximum_value_warning": "100", - "value": "wireframe_printspeed", - "enabled": "wireframe_enabled", - "global_only": "True" - } - } - }, - "wireframe_flow": - { - "label": "WP Flow", - "description": "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing.", - "unit": "%", - "default_value": 100, - "minimum_value": "0", - "maximum_value_warning": "100", - "type": "float", - "enabled": "wireframe_enabled", - "global_only": "True", - "children": - { - "wireframe_flow_connection": - { - "label": "WP Connection Flow", - "description": "Flow compensation when going up or down. Only applies to Wire Printing.", - "unit": "%", - "default_value": 100, - "minimum_value": "0", - "maximum_value_warning": "100", - "type": "float", - "enabled": "wireframe_enabled", - "global_only": "True", - "value": "wireframe_flow" - }, - "wireframe_flow_flat": - { - "label": "WP Flat Flow", - "description": "Flow compensation when printing flat lines. Only applies to Wire Printing.", - "unit": "%", - "default_value": 100, - "minimum_value": "0", - "maximum_value_warning": "100", - "type": "float", - "enabled": "wireframe_enabled", - "global_only": "True", - "value": "wireframe_flow" - } - } - }, - "wireframe_top_delay": - { - "label": "WP Top Delay", - "description": "Delay time after an upward move, so that the upward line can harden. Only applies to Wire Printing.", - "unit": "sec", - "type": "float", - "default_value": 0, - "minimum_value": "0", - "maximum_value_warning": "1", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_bottom_delay": - { - "label": "WP Bottom Delay", - "description": "Delay time after a downward move. Only applies to Wire Printing.", - "unit": "sec", - "type": "float", - "default_value": 0, - "minimum_value": "0", - "maximum_value_warning": "1", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_flat_delay": - { - "label": "WP Flat Delay", - "description": "Delay time between two horizontal segments. Introducing such a delay can cause better adhesion to previous layers at the connection points, while too long delays cause sagging. Only applies to Wire Printing.", - "unit": "sec", - "type": "float", - "default_value": 0.1, - "minimum_value": "0", - "maximum_value_warning": "0.5", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_up_half_speed": - { - "label": "WP Ease Upward", - "description": "Distance of an upward move which is extruded with half speed.\nThis can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default_value": 0.3, - "minimum_value": "0", - "maximum_value_warning": "5.0", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_top_jump": - { - "label": "WP Knot Size", - "description": "Creates a small knot at the top of an upward line, so that the consecutive horizontal layer has a better chance to connect to it. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default_value": 0.6, - "minimum_value": "0", - "maximum_value_warning": "2.0", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_fall_down": - { - "label": "WP Fall Down", - "description": "Distance with which the material falls down after an upward extrusion. This distance is compensated for. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default_value": 0.5, - "minimum_value": "0", - "maximum_value_warning": "wireframe_height", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_drag_along": - { - "label": "WP Drag Along", - "description": "Distance with which the material of an upward extrusion is dragged along with the diagonally downward extrusion. This distance is compensated for. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default_value": 0.6, - "minimum_value": "0", - "maximum_value_warning": "wireframe_height", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_strategy": - { - "label": "WP Strategy", - "description": "Strategy for making sure two consecutive layers connect at each connection point. Retraction lets the upward lines harden in the right position, but may cause filament grinding. A knot can be made at the end of an upward line to heighten the chance of connecting to it and to let the line cool; however, it may require slow printing speeds. Another strategy is to compensate for the sagging of the top of an upward line; however, the lines won't always fall down as predicted.", - "type": "enum", - "options": - { - "compensate": "Compensate", - "knot": "Knot", - "retract": "Retract" - }, - "default_value": "compensate", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_straight_before_down": - { - "label": "WP Straighten Downward Lines", - "description": "Percentage of a diagonally downward line which is covered by a horizontal line piece. This can prevent sagging of the top most point of upward lines. Only applies to Wire Printing.", - "type": "float", - "unit": "%", - "default_value": 20, - "minimum_value": "0", - "maximum_value": "100", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_roof_fall_down": - { - "label": "WP Roof Fall Down", - "description": "The distance which horizontal roof lines printed 'in thin air' fall down when being printed. This distance is compensated for. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default_value": 2, - "minimum_value_warning": "0", - "maximum_value_warning": "wireframe_roof_inset", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_roof_drag_along": - { - "label": "WP Roof Drag Along", - "description": "The distance of the end piece of an inward line which gets dragged along when going back to the outer outline of the roof. This distance is compensated for. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default_value": 0.8, - "minimum_value": "0", - "maximum_value_warning": "10", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_roof_outer_delay": - { - "label": "WP Roof Outer Delay", - "description": "Time spent at the outer perimeters of hole which is to become a roof. Longer times can ensure a better connection. Only applies to Wire Printing.", - "type": "float", - "unit": "sec", - "default_value": 0.2, - "minimum_value": "0", - "maximum_value_warning": "2.0", - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_nozzle_clearance": - { - "label": "WP Nozzle Clearance", - "description": "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default_value": 1, - "minimum_value_warning": "0", - "maximum_value_warning": "10.0", - "enabled": "wireframe_enabled", - "global_only": "True" - } - } - } - } -} From c0c24f1f706315583bc5d75a7f2ce2c2548003ef Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 10 May 2016 09:36:48 +0200 Subject: [PATCH 012/224] BuildVolume now uses StackContainer CURA-1278 --- cura/BuildVolume.py | 78 +++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 46 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index e700b8d7be..351d67c104 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -39,11 +39,8 @@ class BuildVolume(SceneNode): self._active_profile = None self._active_instance = None - Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveInstanceChanged) - self._onActiveInstanceChanged() - - Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged) - self._onActiveProfileChanged() + Application.getInstance().activeContainerStackChanged.connect(self._onActiveContainerStackChanged) + self._onActiveContainerStackChanged() def setWidth(self, width): if width: self._width = width @@ -148,9 +145,9 @@ class BuildVolume(SceneNode): skirt_size = 0.0 - profile = Application.getInstance().getMachineManager().getWorkingProfile() - if profile: - skirt_size = self._getSkirtSize(profile) + container_stack = Application.getInstance().getActiveContainerStack() + if container_stack: + skirt_size = self._getSkirtSize(container_stack) # As this works better for UM machines, we only add the disallowed_area_size for the z direction. # This is probably wrong in all other cases. TODO! @@ -162,52 +159,41 @@ class BuildVolume(SceneNode): Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds - def _onActiveInstanceChanged(self): - self._active_instance = Application.getInstance().getMachineManager().getActiveMachineInstance() + def _onActiveContainerStackChanged(self): + self._active_container_stack = Application.getInstance().getActiveContainerStack() - if self._active_instance: - self._width = self._active_instance.getMachineSettingValue("machine_width") - if Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("print_sequence") == "one_at_a_time": - self._height = Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("gantry_height") + if self._active_container_stack: + self._width = self._active_container_stack.getValue("machine_width") + if self._active_container_stack.getValue("print_sequence") == "one_at_a_time": + self._height = self._active_container_stack.getValue("gantry_height") else: - self._height = self._active_instance.getMachineSettingValue("machine_height") - self._depth = self._active_instance.getMachineSettingValue("machine_depth") + self._height = self._active_container_stack.getValue("machine_height") + self._depth = self._active_container_stack.getValue("machine_depth") self._updateDisallowedAreas() self.rebuild() - def _onActiveProfileChanged(self): - if self._active_profile: - self._active_profile.settingValueChanged.disconnect(self._onSettingValueChanged) - - self._active_profile = Application.getInstance().getMachineManager().getWorkingProfile() - if self._active_profile: - self._active_profile.settingValueChanged.connect(self._onSettingValueChanged) - self._updateDisallowedAreas() - self.rebuild() - def _onSettingValueChanged(self, setting_key): if setting_key == "print_sequence": - if Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("print_sequence") == "one_at_a_time": - self._height = Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("gantry_height") + if Application.getInstance().getActiveContainerStack().getValue("print_sequence") == "one_at_a_time": + self._height = self._active_container_stack.getValue("gantry_height") else: - self._height = self._active_instance.getMachineSettingValue("machine_depth") + self._height = self._active_container_stack.getValue("machine_depth") self.rebuild() if setting_key in self._skirt_settings: self._updateDisallowedAreas() self.rebuild() def _updateDisallowedAreas(self): - if not self._active_instance or not self._active_profile: + if not self._active_container_stack: return - disallowed_areas = self._active_instance.getMachineSettingValue("machine_disallowed_areas") + disallowed_areas = self._active_container_stack.getValue("machine_disallowed_areas") areas = [] skirt_size = 0.0 - if self._active_profile: - skirt_size = self._getSkirtSize(self._active_profile) + skirt_size = self._getSkirtSize(self._active_container_stack) if disallowed_areas: # Extend every area already in the disallowed_areas with the skirt size. @@ -228,8 +214,8 @@ class BuildVolume(SceneNode): # Add the skirt areas around the borders of the build plate. if skirt_size > 0: - half_machine_width = self._active_instance.getMachineSettingValue("machine_width") / 2 - half_machine_depth = self._active_instance.getMachineSettingValue("machine_depth") / 2 + half_machine_width = self._active_container_stack.getValue("machine_width") / 2 + half_machine_depth = self._active_container_stack.getValue("machine_depth") / 2 areas.append(Polygon(numpy.array([ [-half_machine_width, -half_machine_depth], @@ -262,24 +248,24 @@ class BuildVolume(SceneNode): self._disallowed_areas = areas ## Convenience function to calculate the size of the bed adhesion. - def _getSkirtSize(self, profile): + def _getSkirtSize(self, container_stack): skirt_size = 0.0 - adhesion_type = profile.getSettingValue("adhesion_type") + adhesion_type = container_stack.getValue("adhesion_type") if adhesion_type == "skirt": - skirt_distance = profile.getSettingValue("skirt_gap") - skirt_line_count = profile.getSettingValue("skirt_line_count") - skirt_size = skirt_distance + (skirt_line_count * profile.getSettingValue("skirt_line_width")) + skirt_distance = container_stack.getValue("skirt_gap") + skirt_line_count = container_stack.getValue("skirt_line_count") + skirt_size = skirt_distance + (skirt_line_count * container_stack.getValue("skirt_line_width")) elif adhesion_type == "brim": - skirt_size = profile.getSettingValue("brim_line_count") * profile.getSettingValue("skirt_line_width") + skirt_size = container_stack.getValue("brim_line_count") * container_stack.getValue("skirt_line_width") elif adhesion_type == "raft": - skirt_size = profile.getSettingValue("raft_margin") + skirt_size = container_stack.getValue("raft_margin") - if profile.getSettingValue("draft_shield_enabled"): - skirt_size += profile.getSettingValue("draft_shield_dist") + if container_stack.getValue("draft_shield_enabled"): + skirt_size += container_stack.getValue("draft_shield_dist") - if profile.getSettingValue("xy_offset"): - skirt_size += profile.getSettingValue("xy_offset") + if container_stack.getValue("xy_offset"): + skirt_size += container_stack.getValue("xy_offset") return skirt_size From dbd2c911ce4cec9d003671c8f91873ff7bd57088 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 10 May 2016 10:34:02 +0200 Subject: [PATCH 013/224] Renamed active containerstack to global containerstac Cura-1278 --- cura/BuildVolume.py | 6 +++--- plugins/SolidView/SolidView.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 351d67c104..2a84675a48 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -145,7 +145,7 @@ class BuildVolume(SceneNode): skirt_size = 0.0 - container_stack = Application.getInstance().getActiveContainerStack() + container_stack = Application.getInstance().getGlobalContainerStack() if container_stack: skirt_size = self._getSkirtSize(container_stack) @@ -160,7 +160,7 @@ class BuildVolume(SceneNode): Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds def _onActiveContainerStackChanged(self): - self._active_container_stack = Application.getInstance().getActiveContainerStack() + self._active_container_stack = Application.getInstance().getGlobalContainerStack() if self._active_container_stack: self._width = self._active_container_stack.getValue("machine_width") @@ -176,7 +176,7 @@ class BuildVolume(SceneNode): def _onSettingValueChanged(self, setting_key): if setting_key == "print_sequence": - if Application.getInstance().getActiveContainerStack().getValue("print_sequence") == "one_at_a_time": + if Application.getInstance().getGlobalContainerStack().getValue("print_sequence") == "one_at_a_time": self._height = self._active_container_stack.getValue("gantry_height") else: self._height = self._active_container_stack.getValue("machine_depth") diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 561d194dd3..1c65ea5dfe 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -34,10 +34,10 @@ class SolidView(View): self._disabled_shader.setUniformValue("u_diffuseColor", [0.68, 0.68, 0.68, 1.0]) self._disabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) - if Application.getInstance().getActiveContainerStack(): + if Application.getInstance().getGlobalContainerStack(): if Preferences.getInstance().getValue("view/show_overhang"): - angle = Application.getInstance().getActiveContainerStack().getValue("support_angle") + angle = Application.getInstance().getGlobalContainerStack().getValue("support_angle") if angle is not None: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle))) else: From 04f1e8d27cdb56a2e9e6d4d3753b8966cc2dfc96 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 10 May 2016 11:16:35 +0200 Subject: [PATCH 014/224] Renames to from activeStack to global stack CURA-1278 --- cura/BuildVolume.py | 8 +++----- cura/CuraApplication.py | 7 +++---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 2a84675a48..4007ee0007 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -37,10 +37,8 @@ class BuildVolume(SceneNode): self.setCalculateBoundingBox(False) - self._active_profile = None - self._active_instance = None - Application.getInstance().activeContainerStackChanged.connect(self._onActiveContainerStackChanged) - self._onActiveContainerStackChanged() + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged) + self._onGlobalContainerStackChanged() def setWidth(self, width): if width: self._width = width @@ -159,7 +157,7 @@ class BuildVolume(SceneNode): Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds - def _onActiveContainerStackChanged(self): + def _onGlobalContainerStackChanged(self): self._active_container_stack = Application.getInstance().getGlobalContainerStack() if self._active_container_stack: diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1f83cd1f3d..fe250aea16 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -101,7 +101,7 @@ class CuraApplication(QtApplication): self._camera_animation = None self._cura_actions = None - #self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged) + #self.getMachineManager().activeMachineInstanceChanged.connect(self._onGlobalContainerStackChanged) #self.getMachineManager().addMachineRequested.connect(self._onAddMachineRequested) self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) @@ -508,10 +508,9 @@ class CuraApplication(QtApplication): @pyqtSlot(str, result = "QVariant") def getSettingValue(self, key): - if not self.getMachineManager().getWorkingProfile(): + if not self._global_container_stack: return None - return self.getMachineManager().getWorkingProfile().getSettingValue(key) - #return self.getActiveMachine().getSettingValueByKey(key) + return self._global_container_stack.getValue(key) ## Change setting by key value pair @pyqtSlot(str, "QVariant") From 93227c0b560c259bf19d36da1c97e8576c91c512 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 10 May 2016 11:28:57 +0200 Subject: [PATCH 015/224] Updated removabledrive plugin to use metadata CURA-1278 --- .../RemovableDriveOutputDevice.py | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py index 27859bd145..c6fc277234 100644 --- a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py +++ b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py @@ -29,17 +29,26 @@ class RemovableDriveOutputDevice(OutputDevice): if self._writing: raise OutputDeviceError.DeviceBusyError() - file_formats = Application.getInstance().getMeshFileHandler().getSupportedFileTypesWrite() #Formats supported by this application. + # Formats supported by this application (File types that we can actually write) + file_formats = Application.getInstance().getMeshFileHandler().getSupportedFileTypesWrite() if filter_by_machine: - machine_file_formats = Application.getInstance().getMachineManager().getActiveMachineInstance().getMachineDefinition().getFileFormats() - file_formats = list(filter(lambda file_format: file_format["mime_type"] in machine_file_formats, file_formats)) #Take the intersection between file_formats and machine_file_formats. + container = Application.getInstance().getGlobalContainerStack().findContainer({"file_formats": "*"}) + + # Create a list from supported file formats string + machine_file_formats = [file_type.strip() for file_type in container.getMetaDataEntry("file_formats").split(";")] + + # Take the intersection between file_formats and machine_file_formats. + file_formats = list(filter(lambda file_format: file_format["mime_type"] in machine_file_formats, file_formats)) + if len(file_formats) == 0: Logger.log("e", "There are no file formats available to write with!") raise OutputDeviceError.WriteRequestFailedError() - writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType(file_formats[0]["mime_type"]) #Just take the first file format available. + + # Just take the first file format available. + writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType(file_formats[0]["mime_type"]) extension = file_formats[0]["extension"] - if file_name == None: + if file_name is None: for n in BreadthFirstIterator(node): if n.getMeshData(): file_name = n.getName() @@ -50,7 +59,7 @@ class RemovableDriveOutputDevice(OutputDevice): Logger.log("e", "Could not determine a proper file name when trying to write to %s, aborting", self.getName()) raise OutputDeviceError.WriteRequestFailedError() - if extension: #Not empty string. + if extension: # Not empty string. extension = "." + extension file_name = os.path.join(self.getId(), os.path.splitext(file_name)[0] + extension) From 170df747b3710d9491547e874253cc9316d3d1e8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 10 May 2016 11:40:36 +0200 Subject: [PATCH 016/224] Use globalContainer stack instead of activeInstance CURA-1278 --- cura/CuraApplication.py | 2 -- cura/PrintInformation.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index fe250aea16..0fcbeaea5e 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -101,8 +101,6 @@ class CuraApplication(QtApplication): self._camera_animation = None self._cura_actions = None - #self.getMachineManager().activeMachineInstanceChanged.connect(self._onGlobalContainerStackChanged) - #self.getMachineManager().addMachineRequested.connect(self._onAddMachineRequested) self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index d3eaab662c..994dac69d0 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -63,6 +63,6 @@ class PrintInformation(QObject): self.currentPrintTimeChanged.emit() # Material amount is sent as an amount of mm^3, so calculate length from that - r = Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("material_diameter") / 2 + r = Application.getInstance().getGlobalContainerStack().getValue("material_diameter") / 2 self._material_amount = round((amount / (math.pi * r ** 2)) / 1000, 2) self.materialAmountChanged.emit() From 162295da8e73494411edaea36a11919e9aae76bf Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 10 May 2016 13:31:26 +0200 Subject: [PATCH 017/224] Actually adding a new machine is now possible CURA-1278 --- resources/qml/AddMachineDialog.qml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml index c6e852aa3e..2aa966d5e9 100644 --- a/resources/qml/AddMachineDialog.qml +++ b/resources/qml/AddMachineDialog.qml @@ -152,6 +152,19 @@ UM.Dialog anchors.bottom:parent.bottom } + Button + { + text:"save" + anchors.bottom: parent.bottom + anchors.right: parent.right + onClicked: + { + base.visible = false + var item = machineList.model.getItem(machineList.currentIndex); + machineList.model.setNewGlobalStackFromDefinition(machineName.text, item.id) + } + } + Item { UM.I18nCatalog From 67b6c5aa2915979032ef84f9840242fe2c710d03 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 10 May 2016 13:47:27 +0200 Subject: [PATCH 018/224] Re-added platform again CURA-1278 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 0fcbeaea5e..a9eb3eece4 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -173,7 +173,7 @@ class CuraApplication(QtApplication): Selection.selectionChanged.connect(self.onSelectionChanged) root = controller.getScene().getRoot() - #self._platform = Platform(root) + self._platform = Platform(root) #self._volume = BuildVolume.BuildVolume(root) From 5fdd0e81560fb2c0bae33af62d4fe3dd55b80266 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 10 May 2016 14:34:07 +0200 Subject: [PATCH 019/224] BuildVolume no longer crashes when width/height/depth is None CURA-1278 --- cura/BuildVolume.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 4007ee0007..4397c798f7 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -71,7 +71,7 @@ class BuildVolume(SceneNode): ## Recalculates the build volume & disallowed areas. def rebuild(self): - if self._width == 0 or self._height == 0 or self._depth == 0: + if not self._width or not self._height or not self._depth: return min_w = -self._width / 2 From bdccab4b600fd3a51a4cc00502f8cea69759ce77 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 10 May 2016 14:35:45 +0200 Subject: [PATCH 020/224] Re-added BuildVolume CURA-1278 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a9eb3eece4..ceb7a42b72 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -175,7 +175,7 @@ class CuraApplication(QtApplication): root = controller.getScene().getRoot() self._platform = Platform(root) - #self._volume = BuildVolume.BuildVolume(root) + self._volume = BuildVolume.BuildVolume(root) self.getRenderer().setBackgroundColor(QColor(245, 245, 245)) From fa8fbb25605242407518c7ef7ccaa6f4f843d095 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 10 May 2016 14:42:53 +0200 Subject: [PATCH 021/224] Added global only to setting type for CuraApplication CURA-1278 --- cura/CuraApplication.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ceb7a42b72..174621be03 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -24,6 +24,8 @@ from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation +from UM.Settings.SettingDefinition import SettingDefinition + from UM.i18n import i18nCatalog from . import PlatformPhysics @@ -160,6 +162,8 @@ class CuraApplication(QtApplication): self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene...")) + SettingDefinition.addSupportedProperty("global_only", "bool") + controller = self.getController() controller.setActiveView("SolidView") From 3a99a2bc45888ba03eb496c15d6daad95e80e554 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 10 May 2016 17:28:41 +0200 Subject: [PATCH 022/224] Import the right version of the UM module Since it was changed to 1.2 for the setting models --- resources/qml/AddMachineDialog.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml index 2aa966d5e9..476df2178c 100644 --- a/resources/qml/AddMachineDialog.qml +++ b/resources/qml/AddMachineDialog.qml @@ -8,7 +8,7 @@ import QtQuick.Window 2.1 import QtQuick.Controls.Styles 1.1 -import UM 1.1 as UM +import UM 1.2 as UM import Cura 1.0 as Cura @@ -175,4 +175,4 @@ UM.Dialog SystemPalette { id: palette } ExclusiveGroup { id: printerGroup; } } -} \ No newline at end of file +} From 199a30099efd2614e5f94479f0ea22bf60d17050 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 10 May 2016 17:29:29 +0200 Subject: [PATCH 023/224] Comment away everything related to activeprofile and machine manager in SidebarSimple To make SidebarSimple at least display again --- resources/qml/SidebarSimple.qml | 50 ++++++++++++++++----------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 9387872276..21aa315dd1 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -61,7 +61,7 @@ Item return -1; } - var density = parseInt(UM.ActiveProfile.settingValues.getValue("infill_sparse_density")); +// var density = parseInt(UM.ActiveProfile.settingValues.getValue("infill_sparse_density")); for(var i = 0; i < infillModel.count; ++i) { if(density > infillModel.get(i).percentageMin && density <= infillModel.get(i).percentageMax ) @@ -116,7 +116,7 @@ Item onClicked: { if (infillListView.activeIndex != index) { - UM.MachineManager.setSettingValue("infill_sparse_density", model.percentage) +// UM.MachineManager.setSettingValue("infill_sparse_density", model.percentage) } } onEntered: { @@ -213,13 +213,13 @@ Item text: catalog.i18nc("@option:check","Generate Brim"); style: UM.Theme.styles.checkbox; - checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("adhesion_type") == "brim" : false; +// checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("adhesion_type") == "brim" : false; MouseArea { anchors.fill: parent hoverEnabled: true onClicked: { - UM.MachineManager.setSettingValue("adhesion_type", !parent.checked?"brim":"skirt") +// UM.MachineManager.setSettingValue("adhesion_type", !parent.checked?"brim":"skirt") } onEntered: { @@ -246,13 +246,13 @@ Item text: catalog.i18nc("@option:check","Generate Support Structure"); style: UM.Theme.styles.checkbox; - checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("support_enable") : false; +// checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("support_enable") : false; MouseArea { anchors.fill: parent hoverEnabled: true onClicked: { - UM.MachineManager.setSettingValue("support_enable", !parent.checked) +// UM.MachineManager.setSettingValue("support_enable", !parent.checked) } onEntered: { @@ -271,15 +271,15 @@ Item function populateExtruderModel() { - extruderModel.clear() - var extruder_count = UM.MachineManager.getSettingValue("machine_extruder_count"); - for(var extruder = 0; extruder < extruder_count ; extruder++) { - extruderModel.append({ - name: catalog.i18nc("@label", "Extruder %1").arg(extruder), - text: catalog.i18nc("@label", "Extruder %1").arg(extruder), - value: extruder - }) - } +// extruderModel.clear() +// var extruder_count = UM.MachineManager.getSettingValue("machine_extruder_count"); +// for(var extruder = 0; extruder < extruder_count ; extruder++) { +// extruderModel.append({ +// name: catalog.i18nc("@label", "Extruder %1").arg(extruder), +// text: catalog.i18nc("@label", "Extruder %1").arg(extruder), +// value: extruder +// }) +// } } Rectangle { @@ -290,7 +290,7 @@ Item width: parent.width height: childrenRect.height // Use both UM.ActiveProfile and UM.MachineManager to force UM.MachineManager.getSettingValue() to be reevaluated - visible: UM.ActiveProfile.settingValues.getValue("machine_extruder_count") || (UM.MachineManager.getSettingValue("machine_extruder_count") > 1) +// visible: UM.ActiveProfile.settingValues.getValue("machine_extruder_count") || (UM.MachineManager.getSettingValue("machine_extruder_count") > 1) Label { id: mainExtruderLabel @@ -308,9 +308,9 @@ Item anchors.top: parent.top anchors.left: supportExtruderLabel.right style: UM.Theme.styles.combobox - currentIndex: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("extruder_nr") : 0 +// currentIndex: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("extruder_nr") : 0 onActivated: { - UM.MachineManager.setSettingValue("extruder_nr", index) +// UM.MachineManager.setSettingValue("extruder_nr", index) } } @@ -331,7 +331,7 @@ Item anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: supportExtruderLabel.right style: UM.Theme.styles.combobox - currentIndex: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("support_extruder_nr") : 0 +// currentIndex: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("support_extruder_nr") : 0 onActivated: { UM.MachineManager.setSettingValue("support_extruder_nr", index) } @@ -341,12 +341,12 @@ Item id: extruderModel Component.onCompleted: populateExtruderModel() } - Connections - { - id: machineChange - target: UM.MachineManager - onActiveMachineInstanceChanged: populateExtruderModel() - } +// Connections +// { +// id: machineChange +// target: UM.MachineManager +// onActiveMachineInstanceChanged: populateExtruderModel() +// } } Rectangle { From fa7e186b2f91d3c575f104f093de2a3216295004 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 10 May 2016 17:31:18 +0200 Subject: [PATCH 024/224] Import Uranium's SettingView related files and start making them work This is too cura-specific now so we should not put it in Uranium. --- resources/qml/Settings/SettingCategory.qml | 79 ++++++++ resources/qml/Settings/SettingCheckBox.qml | 77 ++++++++ resources/qml/Settings/SettingComboBox.qml | 114 ++++++++++++ resources/qml/Settings/SettingItem.qml | 168 ++++++++++++++++++ resources/qml/Settings/SettingTextField.qml | 153 ++++++++++++++++ resources/qml/Settings/SettingUnknown.qml | 13 ++ resources/qml/Settings/SettingView.qml | 92 ++++++++++ .../Settings/SettingsConfigurationPage.qml | 119 +++++++++++++ 8 files changed, 815 insertions(+) create mode 100644 resources/qml/Settings/SettingCategory.qml create mode 100644 resources/qml/Settings/SettingCheckBox.qml create mode 100644 resources/qml/Settings/SettingComboBox.qml create mode 100644 resources/qml/Settings/SettingItem.qml create mode 100644 resources/qml/Settings/SettingTextField.qml create mode 100644 resources/qml/Settings/SettingUnknown.qml create mode 100644 resources/qml/Settings/SettingView.qml create mode 100644 resources/qml/Settings/SettingsConfigurationPage.qml diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml new file mode 100644 index 0000000000..b4c0263149 --- /dev/null +++ b/resources/qml/Settings/SettingCategory.qml @@ -0,0 +1,79 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium 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.1 as UM + +Button { + id: base; + + style: UM.Theme.styles.sidebar_category; + + signal showTooltip(); + signal hideTooltip(); + signal contextMenuRequested() + + text: definition.label + iconSource: UM.Theme.getIcon(definition.icon) + + checkable: true + checked: definition.expanded + + onClicked: definition.expanded ? settingDefinitionsModel.collapse(definition.key) : settingDefinitionsModel.expandAll(definition.key) + + UM.SimpleButton { + id: settingsButton + + visible: base.hovered || settingsButton.hovered + height: base.height * 0.6 + width: base.height * 0.6 + + anchors { + right: inheritButton.visible ? inheritButton.left : parent.right + rightMargin: inheritButton.visible? UM.Theme.getSize("default_margin").width / 2 : UM.Theme.getSize("setting_preferences_button_margin").width + verticalCenter: parent.verticalCenter; + } + + color: UM.Theme.getColor("setting_control_button"); + hoverColor: UM.Theme.getColor("setting_control_button_hover") + iconSource: UM.Theme.getIcon("settings"); + + onClicked: { + Actions.configureSettingVisibility() + } + } + + UM.SimpleButton + { + // This button shows when the setting has an inherited function, but is overriden by profile. + id: inheritButton; + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("setting_preferences_button_margin").width + + visible: hiddenValuesCount > 0 + height: parent.height / 2; + width: height; + + onClicked: { + base.showAllHidenInheritedSettings() + } + + color: UM.Theme.getColor("setting_control_button") + hoverColor: UM.Theme.getColor("setting_control_button_hover") + iconSource: UM.Theme.getIcon("notice") + + onEntered: { + base.showTooltip() + } + + onExited: { + base.hideTooltip(); + } + } +} diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml new file mode 100644 index 0000000000..b2bbc68ec1 --- /dev/null +++ b/resources/qml/Settings/SettingCheckBox.qml @@ -0,0 +1,77 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.2 as UM + +SettingItem +{ + id: base + + MouseArea + { + id: control + + property bool checked: + { + if(value == "True") + { + return true; + } + else if(value == "False") + { + return false; + } + else + { + return value; + } + } + + Rectangle + { + anchors + { + top: parent.top + bottom: parent.bottom + left: parent.left + } + width: height + + color: + { + if (!enabled) + { + return base.style.controlDisabledColor + } + if(base.containsMouse || base.activeFocus) + { + return base.style.controlHighlightColor + } + else + { + return base.style.controlColor + } + } + border.width: base.style.controlBorderWidth; + border.color: !enabled ? base.style.controlDisabledBorderColor : control.containsMouse ? base.style.controlBorderHighlightColor : base.style.controlBorderColor; + + UM.RecolorImage { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width/2.5 + height: parent.height/2.5 + sourceSize.width: width + sourceSize.height: width + color: !enabled ? base.style.controlDisabledTextColor : base.style.controlTextColor; + source: UM.Theme.getIcon("check") + opacity: control.checked + Behavior on opacity { NumberAnimation { duration: 100; } } + } + } + } +} diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml new file mode 100644 index 0000000000..85935c3471 --- /dev/null +++ b/resources/qml/Settings/SettingComboBox.qml @@ -0,0 +1,114 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.1 as UM + +SettingItem +{ + id: base + + ComboBox + { +// signal valueChanged(string value); +// id: base + model: definition.options + textRole: "name"; + + MouseArea + { + anchors.fill: parent; + acceptedButtons: Qt.NoButton; + onWheel: wheel.accepted = true; + } + + style: ComboBoxStyle + { + background: Rectangle + { + color: + { + if (!enabled) + { + return base.style.controlDisabledColor + } + if(control.hovered || base.activeFocus) + { + return base.style.controlHighlightColor + } + else + { + return base.style.controlColor + } + } + border.width: base.style.controlBorderWidth; + border.color: !enabled ? base.style.controlDisabledBorderColor : control.hovered ? base.style.controlBorderHighlightColor : base.style.controlBorderColor; + } + label: Item + { + Label + { + anchors.left: parent.left; + anchors.leftMargin: base.style.controlBorderWidth + anchors.right: downArrow.left; + anchors.rightMargin: base.style.controlBorderWidth; + anchors.verticalCenter: parent.verticalCenter; + + text: control.currentText; + font: base.style.controlFont; + color: !enabled ? base.style.controlDisabledTextColor : base.style.controlTextColor; + + elide: Text.ElideRight; + verticalAlignment: Text.AlignVCenter; + } + + UM.RecolorImage + { + id: downArrow + anchors.right: parent.right; + anchors.rightMargin: base.style.controlBorderWidth * 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: base.style.controlTextColor; + + } + } + } +/* + onActivated: { + valueChanged(options.getItem(index).value); + } + + onModelChanged: { + updateCurrentIndex(); + } + + Component.onCompleted: { + parent.parent.valueChanged.connect(updateCurrentIndex) + } + + function updateCurrentIndex() { + if (!options) { + return; + } + + for(var i = 0; i < options.rowCount(); ++i) { + if(options.getItem(i).value == value) { + currentIndex = i; + return; + } + } + + currentIndex = -1; + }*/ + } +} diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml new file mode 100644 index 0000000000..845f35853e --- /dev/null +++ b/resources/qml/Settings/SettingItem.qml @@ -0,0 +1,168 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.1 as UM + +import "." + +Item { + id: base; + + height: UM.Theme.getSize("section").height; + + property alias contents: controlContainer.children + + signal contextMenuRequested() + signal showTooltip(var position); + signal hideTooltip(); + + MouseArea + { + id: mouse; + + anchors.fill: parent; + + acceptedButtons: Qt.RightButton; + hoverEnabled: true; + + onClicked: base.contextMenuRequested(); + + onEntered: { + hoverTimer.start(); + } + + onExited: { + if(controlContainer.item && controlContainer.item.hovered) { + return; + } + hoverTimer.stop(); + base.hideTooltip(); + } + + Timer { + id: hoverTimer; + interval: 500; + repeat: false; + + onTriggered: base.showTooltip({ x: mouse.mouseX, y: mouse.mouseY }); + } + } + + Label + { + id: label; + + anchors.left: parent.left; + anchors.leftMargin: (UM.Theme.getSize("section_icon_column").width + 5) + ((definition.depth - 1) * UM.Theme.getSize("setting_control_depth_margin").width) + anchors.right: settingControls.left; + anchors.verticalCenter: parent.verticalCenter + + height: UM.Theme.getSize("section").height; + verticalAlignment: Text.AlignVCenter; + + text: definition.label + elide: Text.ElideMiddle; + + color: UM.Theme.getColor("setting_control_text"); + font: UM.Theme.getFont("default"); + } + + Row + { + id: settingControls + + height: parent.height / 2 + spacing: UM.Theme.getSize("default_margin").width / 2 + + anchors { + right: controlContainer.left + rightMargin: UM.Theme.getSize("default_margin").width / 2 + verticalCenter: parent.verticalCenter + } + + UM.SimpleButton + { + id: revertButton; + +// visible: base.overridden && base.is_enabled + + height: parent.height; + width: height; + + backgroundColor: UM.Theme.getColor("setting_control"); + hoverBackgroundColor: UM.Theme.getColor("setting_control_highlight") + color: UM.Theme.getColor("setting_control_button") + hoverColor: UM.Theme.getColor("setting_control_button_hover") + + iconSource: UM.Theme.getIcon("reset") + + onClicked: { + base.resetRequested() + controlContainer.notifyReset(); + } + + onEntered: base.showResetTooltip({ x: mouse.mouseX, y: mouse.mouseY }) + onExited: + { + if(controlContainer.item && controlContainer.item.hovered) + { + return; + } + + base.hovered = false; + base.hideTooltip(); + } + } + + UM.SimpleButton + { + // This button shows when the setting has an inherited function, but is overriden by profile. + id: inheritButton; + +// visible: has_profile_value && base.has_inherit_function && base.is_enabled + height: parent.height; + width: height; + + onClicked: { + base.resetToDefaultRequested(); + controlContainer.notifyReset(); + } + + backgroundColor: UM.Theme.getColor("setting_control"); + hoverBackgroundColor: UM.Theme.getColor("setting_control_highlight") + color: UM.Theme.getColor("setting_control_button") + hoverColor: UM.Theme.getColor("setting_control_button_hover") + + iconSource: UM.Theme.getIcon("notice"); + + onEntered: base.showInheritanceTooltip({ x: mouse.mouseX, y: mouse.mouseY }) + + onExited: { + if(controlContainer.item && controlContainer.item.hovered) { + return; + } + + base.hovered = false; + base.hideTooltip(); + } + } + + } + + Rectangle + { + id: controlContainer; + + color: "red" + + anchors.right: parent.right; + anchors.verticalCenter: parent.verticalCenter; + width: UM.Theme.getSize("setting_control").width; + height: UM.Theme.getSize("setting_contorl").height + } +} diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml new file mode 100644 index 0000000000..62f03b087d --- /dev/null +++ b/resources/qml/Settings/SettingTextField.qml @@ -0,0 +1,153 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.2 + +import UM 1.1 as UM + +SettingItem +{ + id: base + + contents: Rectangle + { + id: control + + anchors.fill: parent + + property alias hovered: mouseArea.containsMouse; + + border.width: base.style.controlBorderWidth; + border.color: !enabled ? base.style.controlDisabledBorderColor : hovered ? base.style.controlBorderHighlightColor : base.style.controlBorderColor + + property variant parentValue: value //From parent loader + function notifyReset() { + input.text = format(parentValue) + } + +// color: { +// if (!enabled) +// { +// return base.style.controlDisabledColor +// } +// switch(definition.validationState) //From parent loader +// { +// case 0: +// return base.style.validationErrorColor; +// case 1: +// return base.style.validationErrorColor; +// case 2: +// return base.style.validationErrorColor; +// case 3: +// return base.style.validationWarningColor; +// case 4: +// return base.style.validationWarningColor; +// case 5: +// return base.style.validationOkColor; +// +// default: +// return base.style.controlTextColor; +// } +// } + + Rectangle + { + anchors.fill: parent; + anchors.margins: base.style.controlBorderWidth; + color: base.style.controlHighlightColor; + opacity: 0.35 +// opacity: !control.hovered ? 0 : valid == 5 ? 1.0 : 0.35; + } + + Label + { + anchors.right: parent.right; + anchors.rightMargin: base.style.unitRightMargin; + anchors.verticalCenter: parent.verticalCenter; + + text: definition.unit; + color: base.style.unitColor + font: base.style.unitFont; + } + + MouseArea + { + id: mouseArea + anchors.fill: parent; + hoverEnabled: true; + cursorShape: Qt.IBeamCursor + } + + TextInput + { + id: input + + anchors + { + left: parent.left + leftMargin: base.style.unitRightMargin + right: parent.right + verticalCenter: parent.verticalCenter + } + + Keys.onReleased: + { + text = text.replace(",", ".") // User convenience. We use dots for decimal values + if(parseFloat(text) != base.parentValue) + { + base.valueChanged(parseFloat(text)); + } + } + + onEditingFinished: + { + if(parseFloat(text) != base.parentValue) + { + base.valueChanged(parseFloat(text)); + } + } + + color: !enabled ? base.style.controlDisabledTextColor : base.style.controlTextColor; + font: base.style.controlFont; + + selectByMouse: true; + + maximumLength: 10; + + validator: RegExpValidator { regExp: /[0-9.,-]{0,10}/ } + +// Binding +// { +// target: input +// property: "text" +// value: format(base.parentValue) +// when: !input.activeFocus +// } + } + + //Rounds a floating point number to 4 decimals. This prevents floating + //point rounding errors. + // + //input: The number to round. + //decimals: The number of decimals (digits after the radix) to round to. + //return: The rounded number. + function roundFloat(input, decimals) + { + //First convert to fixed-point notation to round the number to 4 decimals and not introduce new floating point errors. + //Then convert to a string (is implicit). The fixed-point notation will be something like "3.200". + //Then remove any trailing zeroes and the radix. + return input.toFixed(decimals).replace(/\.?0*$/, ""); //Match on periods, if any ( \.? ), followed by any number of zeros ( 0* ), then the end of string ( $ ). + } + + //Formats a value for display in the text field. + // + //This correctly handles formatting of float values. + // + //input: The string value to format. + //return: The formatted string. + function format(inputValue) { + return parseFloat(inputValue) ? roundFloat(parseFloat(inputValue), 4) : inputValue //If it's a float, round to four decimals. + } + } +} diff --git a/resources/qml/Settings/SettingUnknown.qml b/resources/qml/Settings/SettingUnknown.qml new file mode 100644 index 0000000000..4b403e522f --- /dev/null +++ b/resources/qml/Settings/SettingUnknown.qml @@ -0,0 +1,13 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 + +SettingItem +{ + Label + { + text: value + " " + unit; + } +} diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml new file mode 100644 index 0000000000..49beba0990 --- /dev/null +++ b/resources/qml/Settings/SettingView.qml @@ -0,0 +1,92 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium 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 + +ScrollView +{ + id: base; + + style: UM.Theme.styles.scrollview; + flickableItem.flickableDirection: Flickable.VerticalFlick; + + property Action configureSettings; + signal showTooltip(Item item, point location, string text); + signal hideTooltip(); + + ListView + { + id: contents + spacing: UM.Theme.getSize("default_lining").height; + + model: UM.SettingDefinitionsModel { id: definitionsModel; containerId: "fdmprinter" } + + delegate: Loader + { + id: delegate + + width: ListView.view.width + + property var definition: model + property var settingDefinitionsModel: definitionsModel + + source: + { + switch(model.type) + { + case "int": + return "SettingTextField.qml" + case "float": + return "SettingTextField.qml" + case "double": + return "SettingTextField.qml" + case "enum": + return "SettingComboBox.qml" + case "boolean": + return "SettingCheckBox.qml" + case "string": + return "SettingTextField.qml" + case "category": + return "SettingCategory.qml" + default: + return "SettingUnknown.qml" + } + } + + Connections + { + target: item + onContextMenuRequested: { contextMenu.key = model.key; contextMenu.popup() } + onShowTooltip: base.showTooltip(delegate, position, model.description) + } + } + + UM.I18nCatalog { id: catalog; name: "uranium"; } + + Menu + { + id: contextMenu; + + property string key; + + MenuItem + { + //: Settings context menu action + text: catalog.i18nc("@action:menu", "Hide this setting"); + onTriggered: definitionsModel.hide(contextMenu.key); + } + MenuItem + { + //: Settings context menu action + text: catalog.i18nc("@action:menu", "Configure setting visiblity..."); + + onTriggered: if(base.configureSettings) base.configureSettings.trigger(contextMenu); + } + } + } +} diff --git a/resources/qml/Settings/SettingsConfigurationPage.qml b/resources/qml/Settings/SettingsConfigurationPage.qml new file mode 100644 index 0000000000..a2889d410a --- /dev/null +++ b/resources/qml/Settings/SettingsConfigurationPage.qml @@ -0,0 +1,119 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.1 +import QtQuick.Dialogs 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQml 2.2 + +import UM 1.1 as UM + +import "../Preferences" + +PreferencesPage +{ + //: Machine configuration page title. + title: catalog.i18nc("@title:tab","Machine"); + id: base + + contents: ColumnLayout + { + z: base.z + anchors.fill: parent; + UM.I18nCatalog { id: catalog; name:"uranium"} + RowLayout + { + //: Active machine combo box label + Label { text: catalog.i18nc("@label:listbox","Active Machine:"); } + ComboBox + { + id: machineCombo; + Layout.fillWidth: true; + model: UM.Models.machinesModel; + textRole: "name"; + onActivated: + { + if(index != -1) + UM.Models.machinesModel.setActive(index); + } + + Connections + { + id: machineChange + target: UM.Application + onMachineChanged: machineCombo.currentIndex = machineCombo.find(UM.Application.machineName); + } + + Component.onCompleted: machineCombo.currentIndex = machineCombo.find(UM.Application.machineName); + } + //: Remove active machine button + Button { text: catalog.i18nc("@action:button","Remove"); onClicked: confirmRemoveDialog.open(); } + } + ScrollView + { + id: settingsScrollView + Layout.fillWidth: true; + Layout.fillHeight: true; + + ListView + { + id: settingsListView + delegate: settingDelegate + model: UM.Models.settingsModel + x: 0 + + section.property: "category" + section.delegate: Label { text: section } + } + } + } + + Component + { + id: settingDelegate + CheckBox + { + z:0 + id: settingCheckBox + text: model.name; + x: depth * 25 + checked: model.visibility + onClicked: ListView.view.model.setVisibility(model.key, checked) + //enabled: !model.disabled + + onHoveredChanged: + { + if(hovered) + { + var xPos = parent.x + settingCheckBox.width; + var yPos = parent.y; + toolTip.show(model.description, 1000, 200, undefined, undefined) //tooltip-text, hover-delay in msec, animation-length in msec, position X, position Y (both y en x == undefined: gives the tooltip a standard placement in the right corner) + } else + { + toolTip.hide(0, 0)//hover-delay in msec, animation-length in msec + } + } + } + } + + PreferencesToolTip + { + id: toolTip; + } + + MessageDialog + { + id: confirmRemoveDialog; + + icon: StandardIcon.Question; + //: Remove machine confirmation dialog title + title: catalog.i18nc("@title:window","Confirm Machine Deletion"); + //: Remove machine confirmation dialog text + text: catalog.i18nc("@label","Are you sure you wish to remove the machine?"); + standardButtons: StandardButton.Yes | StandardButton.No; + + onYes: UM.Models.machinesModel.removeMachine(machineCombo.currentIndex); + } +} From 27f31a19b57eecfadae3404b9059e8bec0fdb796 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 10 May 2016 17:31:32 +0200 Subject: [PATCH 025/224] Use the local SettingView in SidebarAdvanced --- resources/qml/SidebarAdvanced.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/qml/SidebarAdvanced.qml b/resources/qml/SidebarAdvanced.qml index 8a231aa53d..30f4e74db6 100644 --- a/resources/qml/SidebarAdvanced.qml +++ b/resources/qml/SidebarAdvanced.qml @@ -5,9 +5,9 @@ import QtQuick 2.0 import QtQuick.Controls 1.2 -import UM 1.0 as UM +import "Settings" -UM.SettingView { - expandedCategories: Printer.expandedCategories; - onExpandedCategoriesChanged: Printer.setExpandedCategories(expandedCategories); +SettingView { +// expandedCategories: Printer.expandedCategories; +// onExpandedCategoriesChanged: Printer.setExpandedCategories(expandedCategories); } From 9fcc3930ffb8c7f38b6df07297d3cbe560e048b3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 11 May 2016 14:30:44 +0200 Subject: [PATCH 026/224] ContainerStackModel is now used for listing all added machines CURA-1278 --- resources/qml/SidebarHeader.qml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 1c17233acb..92be44bc51 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -5,7 +5,7 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 -import UM 1.1 as UM +import UM 1.2 as UM Item { @@ -71,7 +71,10 @@ Item id: machineSelectionMenu Instantiator { -// model: UM.MachineInstancesModel { } + model: UM.ContainerStacksModel + { + filter: {"type": "machine"} + } MenuItem { text: model.name; From 573c1c1a5a491fb89e5071f5e682b0bada1fdb45 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 11 May 2016 15:35:41 +0200 Subject: [PATCH 027/224] Added MachineManagerModel to Cura CURA-1278 --- cura/CuraApplication.py | 6 +++++- cura/MachineManagerModel.py | 25 +++++++++++++++++++++++++ resources/qml/SidebarHeader.qml | 5 +++-- 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 cura/MachineManagerModel.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 174621be03..9a0071a41f 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -36,10 +36,11 @@ from . import CuraActions from . import MultiMaterialDecorator from . import ZOffsetDecorator from . import CuraSplashScreen +from . import MachineManagerModel from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS from PyQt5.QtGui import QColor, QIcon -from PyQt5.QtQml import qmlRegisterUncreatableType +from PyQt5.QtQml import qmlRegisterUncreatableType, qmlRegisterSingletonType import platform import sys @@ -201,6 +202,9 @@ class CuraApplication(QtApplication): self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self.initializeEngine() + qmlRegisterSingletonType(MachineManagerModel.MachineManagerModel, "Cura", 1, 0, "MachineManager", + MachineManagerModel.createMachineManagerModel) + if self._engine.rootObjects: self.closeSplash() diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py new file mode 100644 index 0000000000..3b89ae8048 --- /dev/null +++ b/cura/MachineManagerModel.py @@ -0,0 +1,25 @@ + +from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal +from UM.Application import Application +from UM.Signal import Signal, signalemitter + +class MachineManagerModel(QObject): + def __init__(self, parent = None): + super().__init__(parent) + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) + + globalContainerChanged = pyqtSignal() + + def _onGlobalContainerChanged(self): + self.globalContainerChanged.emit() + + @pyqtSlot(str) + def setActiveMachine(self, stack_id): + pass + + @pyqtProperty(str, notify = globalContainerChanged) + def activeMachineId(self): + return Application.getInstance().getGlobalContainerStack().getId() + +def createMachineManagerModel(engine, script_engine): + return MachineManagerModel() \ No newline at end of file diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 92be44bc51..b66aea084a 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -6,6 +6,7 @@ import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import UM 1.2 as UM +import Cura 1.0 as Cura Item { @@ -79,9 +80,9 @@ Item { text: model.name; checkable: true; - checked: model.active; + checked: Cura.MachineManager.activeMachineId == model.id exclusiveGroup: machineSelectionMenuGroup; - onTriggered: UM.MachineManager.setActiveMachineInstance(model.name); + onTriggered: Cura.MachineManager.setActiveMachine(model.id); } onObjectAdded: machineSelectionMenu.insertItem(index, object) onObjectRemoved: machineSelectionMenu.removeItem(object) From f91a4f9369c0ab24098d1aea42ee4ba741369f46 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 11 May 2016 16:13:30 +0200 Subject: [PATCH 028/224] Moved registration of MachineManager model to before QML is read Else the model is undefined on first run, which caused a number of silly issues. CURA-1278 --- cura/CuraApplication.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 9a0071a41f..17450029a3 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -199,12 +199,12 @@ class CuraApplication(QtApplication): self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading interface...")) - self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) - self.initializeEngine() - qmlRegisterSingletonType(MachineManagerModel.MachineManagerModel, "Cura", 1, 0, "MachineManager", MachineManagerModel.createMachineManagerModel) + self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) + self.initializeEngine() + if self._engine.rootObjects: self.closeSplash() From 66a29a2f1c112d7805091df928df46a73a928db5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 11 May 2016 16:21:09 +0200 Subject: [PATCH 029/224] Added name for active machine CURA-1278 --- cura/MachineManagerModel.py | 12 ++++++++++-- resources/qml/SidebarHeader.qml | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 3b89ae8048..c5f2fc3fa6 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -1,7 +1,7 @@ from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from UM.Application import Application -from UM.Signal import Signal, signalemitter +from UM.Settings.ContainerRegistry import ContainerRegistry class MachineManagerModel(QObject): def __init__(self, parent = None): @@ -15,11 +15,19 @@ class MachineManagerModel(QObject): @pyqtSlot(str) def setActiveMachine(self, stack_id): - pass + containers = ContainerRegistry.getInstance().findContainerStacks(id = stack_id) + if containers: + Application.getInstance().setGlobalContainerStack(containers[0]) + + @pyqtProperty(str, notify = globalContainerChanged) + def activeMachineName(self): + return Application.getInstance().getGlobalContainerStack().getName() @pyqtProperty(str, notify = globalContainerChanged) def activeMachineId(self): return Application.getInstance().getGlobalContainerStack().getId() + + def createMachineManagerModel(engine, script_engine): return MachineManagerModel() \ No newline at end of file diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index b66aea084a..83188007cf 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -58,10 +58,10 @@ Item ToolButton { id: machineSelection - text: UM.MachineManager.activeMachineInstance; + text: Cura.MachineManager.activeMachineName; width: parent.width/100*55 height: UM.Theme.getSize("setting_control").height - tooltip: UM.MachineManager.activeMachineInstance; + tooltip: Cura.MachineManager.activeMachineName; anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter From fbbe6cde78479edb07e07cf540d198608778abb2 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 16:35:17 +0200 Subject: [PATCH 030/224] Expose the Actions object as a QML singleton This makes it much simpler to use actions from within other objects --- resources/qml/Actions.qml | 2 ++ resources/qml/qmldir | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 resources/qml/qmldir diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 003a3ceeec..ad88aa3c39 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -1,6 +1,8 @@ // Copyright (c) 2015 Ultimaker B.V. // Cura is released under the terms of the AGPLv3 or higher. +pragma Singleton + import QtQuick 2.2 import QtQuick.Controls 1.1 import UM 1.1 as UM diff --git a/resources/qml/qmldir b/resources/qml/qmldir new file mode 100644 index 0000000000..096561aca5 --- /dev/null +++ b/resources/qml/qmldir @@ -0,0 +1,3 @@ +module Cura + +singleton Actions 1.0 Actions.qml From 207bdb3cd5669e1c7f272d0ee9ee34409c4068f4 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 16:37:34 +0200 Subject: [PATCH 031/224] Update Cura.qml to use Actions as singleton instead of instantiating them --- resources/qml/Cura.qml | 287 ++++++++++++++++++++++------------------- 1 file changed, 154 insertions(+), 133 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index e39cd733d9..3b887796eb 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -9,6 +9,8 @@ import QtQuick.Dialogs 1.1 import UM 1.1 as UM +import "." + UM.MainWindow { id: base @@ -53,7 +55,7 @@ UM.MainWindow title: catalog.i18nc("@title:menu menubar:toplevel","&File"); MenuItem { - action: actions.open; + action: Actions.open; } Menu @@ -115,11 +117,11 @@ UM.MainWindow } } - MenuItem { action: actions.reloadAll; } + MenuItem { action: Actions.reloadAll; } MenuSeparator { } - MenuItem { action: actions.quit; } + MenuItem { action: Actions.quit; } } Menu @@ -127,17 +129,17 @@ UM.MainWindow //: Edit menu title: catalog.i18nc("@title:menu menubar:toplevel","&Edit"); - MenuItem { action: actions.undo; } - MenuItem { action: actions.redo; } + MenuItem { action: Actions.undo; } + MenuItem { action: Actions.redo; } MenuSeparator { } - MenuItem { action: actions.deleteSelection; } - MenuItem { action: actions.deleteAll; } - MenuItem { action: actions.resetAllTranslation; } - MenuItem { action: actions.resetAll; } + MenuItem { action: Actions.deleteSelection; } + MenuItem { action: Actions.deleteAll; } + MenuItem { action: Actions.resetAllTranslation; } + MenuItem { action: Actions.resetAll; } MenuSeparator { } - MenuItem { action: actions.groupObjects;} - MenuItem { action: actions.mergeObjects;} - MenuItem { action: actions.unGroupObjects;} + MenuItem { action: Actions.groupObjects;} + MenuItem { action: Actions.mergeObjects;} + MenuItem { action: Actions.unGroupObjects;} } Menu @@ -201,10 +203,10 @@ UM.MainWindow ExclusiveGroup { id: machineVariantsGroup; } - MenuSeparator { visible: UM.MachineManager.hasVariants; } +// MenuSeparator { visible: UM.MachineManager.hasVariants; } - MenuItem { action: actions.addMachine; } - MenuItem { action: actions.configureMachines; } + MenuItem { action: Actions.addMachine; } + MenuItem { action: Actions.configureMachines; } } Menu @@ -277,11 +279,11 @@ UM.MainWindow MenuSeparator { id: profileMenuSeparator } - MenuItem { action: actions.updateProfile; } - MenuItem { action: actions.resetProfile; } - MenuItem { action: actions.addProfile; } + MenuItem { action: Actions.updateProfile; } + MenuItem { action: Actions.resetProfile; } + MenuItem { action: Actions.addProfile; } MenuSeparator { } - MenuItem { action: actions.manageProfiles; } + MenuItem { action: Actions.manageProfiles; } } Menu @@ -323,7 +325,7 @@ UM.MainWindow //: Settings menu title: catalog.i18nc("@title:menu menubar:toplevel","&Settings"); - MenuItem { action: actions.preferences; } + MenuItem { action: Actions.preferences; } } Menu @@ -331,11 +333,11 @@ UM.MainWindow //: Help menu title: catalog.i18nc("@title:menu menubar:toplevel","&Help"); - MenuItem { action: actions.showEngineLog; } - MenuItem { action: actions.documentation; } - MenuItem { action: actions.reportBug; } + MenuItem { action: Actions.showEngineLog; } + MenuItem { action: Actions.documentation; } + MenuItem { action: Actions.reportBug; } MenuSeparator { } - MenuItem { action: actions.about; } + MenuItem { action: Actions.about; } } } @@ -425,7 +427,7 @@ UM.MainWindow left: parent.left; //leftMargin: UM.Theme.getSize("loadfile_margin").width } - action: actions.open; + action: Actions.open; } Image @@ -513,22 +515,12 @@ UM.MainWindow width: UM.Theme.getSize("sidebar").width; - addMachineAction: actions.addMachine; - configureMachinesAction: actions.configureMachines; - addProfileAction: actions.addProfile; - updateProfileAction: actions.updateProfile; - resetProfileAction: actions.resetProfile; - manageProfilesAction: actions.manageProfiles; - - configureSettingsAction: Action - { - onTriggered: - { - preferences.visible = true; - preferences.setPage(2); - preferences.getCurrentItem().scrollToSection(source.key); - } - } + addMachineAction: Actions.addMachine; + configureMachinesAction: Actions.configureMachines; + addProfileAction: Actions.addProfile; + updateProfileAction: Actions.updateProfile; + resetProfileAction: Actions.resetProfile; + manageProfilesAction: Actions.manageProfiles; } } } @@ -561,73 +553,16 @@ UM.MainWindow } } - Actions + Connections { - id: actions; + target: Actions.preferences + onTriggered: preferences.visible = true + } - open.onTriggered: openDialog.open(); - - quit.onTriggered: base.visible = false; - - undo.onTriggered: UM.OperationStack.undo(); - undo.enabled: UM.OperationStack.canUndo; - redo.onTriggered: UM.OperationStack.redo(); - redo.enabled: UM.OperationStack.canRedo; - - deleteSelection.onTriggered: - { - Printer.deleteSelection(); - } - - deleteObject.onTriggered: - { - if(objectContextMenu.objectId != 0) - { - Printer.deleteObject(objectContextMenu.objectId); - objectContextMenu.objectId = 0; - } - } - - multiplyObject.onTriggered: - { - if(objectContextMenu.objectId != 0) - { - Printer.multiplyObject(objectContextMenu.objectId, 1); - objectContextMenu.objectId = 0; - } - } - - centerObject.onTriggered: - { - if(objectContextMenu.objectId != 0) - { - Printer.centerObject(objectContextMenu.objectId); - objectContextMenu.objectId = 0; - } - } - - groupObjects.onTriggered: - { - Printer.groupSelected(); - } - - unGroupObjects.onTriggered: - { - Printer.ungroupSelected(); - } - - mergeObjects.onTriggered: - { - Printer.mergeSelected(); - } - - deleteAll.onTriggered: Printer.deleteAll(); - resetAllTranslation.onTriggered: Printer.resetAllTranslation(); - resetAll.onTriggered: Printer.resetAll(); - reloadAll.onTriggered: Printer.reloadAll(); - - addMachine.onTriggered: addMachineDialog.visible = true; - addProfile.onTriggered: + Connections + { + target: Actions.addProfile + onTriggered: { UM.MachineManager.createProfile(); preferences.setPage(4); @@ -636,26 +571,37 @@ UM.MainWindow // Show the renameDialog after a very short delay so the preference page has time to initiate showProfileNameDialogTimer.start(); } - updateProfile.onTriggered: UM.ActiveProfile.updateProfile(); - resetProfile.onTriggered: UM.ActiveProfile.discardChanges(); + } - preferences.onTriggered: preferences.visible = true; - configureMachines.onTriggered: + Connections + { + target: Actions.configureMachines + onTriggered: { preferences.visible = true; preferences.setPage(3); } - manageProfiles.onTriggered: + } + + Connections + { + target: Actions.manageProfiles + onTriggered: { preferences.visible = true; preferences.setPage(4); } + } - documentation.onTriggered: CuraActions.openDocumentation(); - reportBug.onTriggered: CuraActions.openBugReportPage(); - showEngineLog.onTriggered: engineLog.visible = true; - about.onTriggered: aboutDialog.visible = true; - toggleFullScreen.onTriggered: base.toggleFullscreen(); + Connections + { + target: Actions.configureSettingVisibility + onTriggered: + { + preferences.visible = true; + preferences.setPage(2); + preferences.getCurrentItem().scrollToSection(source.key); + } } Timer @@ -672,29 +618,68 @@ UM.MainWindow id: objectContextMenu; property variant objectId: -1; - MenuItem { action: actions.centerObject; } - MenuItem { action: actions.deleteObject; } - MenuItem { action: actions.multiplyObject; } + MenuItem { action: Actions.centerObject; } + MenuItem { action: Actions.deleteObject; } + MenuItem { action: Actions.multiplyObject; } MenuSeparator { } - MenuItem { action: actions.deleteAll; } - MenuItem { action: actions.reloadAll; } - MenuItem { action: actions.resetAllTranslation; } - MenuItem { action: actions.resetAll; } - MenuItem { action: actions.groupObjects; } - MenuItem { action: actions.mergeObjects; } - MenuItem { action: actions.unGroupObjects; } + MenuItem { action: Actions.deleteAll; } + MenuItem { action: Actions.reloadAll; } + MenuItem { action: Actions.resetAllTranslation; } + MenuItem { action: Actions.resetAll; } + MenuItem { action: Actions.groupObjects; } + MenuItem { action: Actions.mergeObjects; } + MenuItem { action: Actions.unGroupObjects; } + + Connections + { + target: Actions.deleteObject + onTriggered: + { + if(objectContextMenu.objectId != 0) + { + Printer.deleteObject(objectContextMenu.objectId); + objectContextMenu.objectId = 0; + } + } + } + + Connections + { + target: Actions.multiplyObject + onTriggered: + { + if(objectContextMenu.objectId != 0) + { + Printer.multiplyObject(objectContextMenu.objectId, 1); + objectContextMenu.objectId = 0; + } + } + } + + Connections + { + target: Actions.centerObject + onTriggered: + { + if(objectContextMenu.objectId != 0) + { + Printer.centerObject(objectContextMenu.objectId); + objectContextMenu.objectId = 0; + } + } + } } Menu { id: contextMenu; - MenuItem { action: actions.deleteAll; } - MenuItem { action: actions.reloadAll; } - MenuItem { action: actions.resetAllTranslation; } - MenuItem { action: actions.resetAll; } - MenuItem { action: actions.groupObjects; } - MenuItem { action: actions.mergeObjects; } - MenuItem { action: actions.unGroupObjects; } + MenuItem { action: Actions.deleteAll; } + MenuItem { action: Actions.reloadAll; } + MenuItem { action: Actions.resetAllTranslation; } + MenuItem { action: Actions.resetAll; } + MenuItem { action: Actions.groupObjects; } + MenuItem { action: Actions.mergeObjects; } + MenuItem { action: Actions.unGroupObjects; } } Connections @@ -713,6 +698,18 @@ UM.MainWindow } } + Connections + { + target: Actions.quit + onTriggered: base.visible = false; + } + + Connections + { + target: Actions.toggleFullScreen + onTriggered: base.toggleFullscreen(); + } + FileDialog { id: openDialog; @@ -737,21 +734,45 @@ UM.MainWindow } } + Connections + { + target: Actions.open + onTriggered: openDialog.open() + } + EngineLog { id: engineLog; } + Connections + { + target: Actions.showEngineLog + onTriggered: engineLog.visible = true; + } + AddMachineDialog { id: addMachineDialog } + Connections + { + target: Actions.addMachine + onTriggered: addMachineDialog.visible = true; + } + AboutDialog { id: aboutDialog } + Connections + { + target: Actions.about + onTriggered: aboutDialog.visible = true; + } + Connections { target: Printer From 5e226038d94bf3008712fa9efe1048dfa1bc9fba Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 16:38:54 +0200 Subject: [PATCH 032/224] Instantiate models instead of using the Models object Since Models has been removed --- resources/qml/Cura.qml | 2 +- resources/qml/Toolbar.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 3b887796eb..6c54c439a9 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -294,7 +294,7 @@ UM.MainWindow Instantiator { - model: UM.Models.extensionModel + model: UM.ExtensionModel { } Menu { diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index d5274cd873..bde063de10 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -25,7 +25,7 @@ Item { Repeater { id: repeat - model: UM.Models.toolModel + model: UM.ToolModel { } Button { text: model.name From 8c5b3c8b1dfee4a1779288d50ffe73c21de78f3a Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 16:40:39 +0200 Subject: [PATCH 033/224] Directly implement onTriggered in Actions for several actions Since they use global objects we can directly call those methods. This makes it simpler to call these actions from other objects. --- resources/qml/Actions.qml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index ad88aa3c39..bc9ef89e24 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -62,6 +62,8 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit","&Undo"); iconName: "edit-undo"; shortcut: StandardKey.Undo; + onTriggered: UM.OperationStack.undo(); + enabled: UM.OperationStack.canUndo; } Action @@ -70,6 +72,8 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit","&Redo"); iconName: "edit-redo"; shortcut: StandardKey.Redo; + onTriggered: UM.OperationStack.redo(); + enabled: UM.OperationStack.canRedo; } Action @@ -105,6 +109,7 @@ Item id: updateProfileAction; enabled: UM.ActiveProfile.valid && !UM.ActiveProfile.readOnly && UM.ActiveProfile.hasCustomisedValues text: catalog.i18nc("@action:inmenu menubar:profile","&Update Current Profile"); + onTriggered: UM.ActiveProfile.updateProfile(); } Action @@ -112,6 +117,7 @@ Item id: resetProfileAction; enabled: UM.ActiveProfile.valid && UM.ActiveProfile.hasCustomisedValues text: catalog.i18nc("@action:inmenu menubar:profile","&Reload Current Profile"); + onTriggered: UM.ActiveProfile.discardChanges(); } Action @@ -134,12 +140,14 @@ Item text: catalog.i18nc("@action:inmenu menubar:help","Show Online &Documentation"); iconName: "help-contents"; shortcut: StandardKey.Help; + onTriggered: CuraActions.openDocumentation(); } Action { id: reportBugAction; text: catalog.i18nc("@action:inmenu menubar:help","Report a &Bug"); iconName: "tools-report-bug"; + onTriggered: CuraActions.openBugReportPage(); } Action @@ -156,6 +164,7 @@ Item enabled: UM.Controller.toolsEnabled; iconName: "edit-delete"; shortcut: StandardKey.Delete; + onTriggered: Printer.deleteSelection(); } Action @@ -178,6 +187,7 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit","&Group Objects"); enabled: UM.Scene.numObjectsSelected > 1 ? true: false iconName: "object-group" + onTriggered: Printer.groupSelected(); } Action @@ -186,6 +196,7 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit","Ungroup Objects"); enabled: UM.Scene.isGroupSelected iconName: "object-ungroup" + onTriggered: Printer.ungroupSelected(); } Action @@ -194,6 +205,7 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit","&Merge Objects"); enabled: UM.Scene.numObjectsSelected > 1 ? true: false iconName: "merge"; + onTriggered: Printer.mergeSelected(); } Action @@ -210,6 +222,7 @@ Item enabled: UM.Controller.toolsEnabled; iconName: "edit-delete"; shortcut: "Ctrl+D"; + onTriggered: Printer.deleteAll(); } Action @@ -217,18 +230,21 @@ Item id: reloadAllAction; text: catalog.i18nc("@action:inmenu menubar:file","Re&load All Objects"); iconName: "document-revert"; + onTriggered: Printer.reloadAll(); } Action { id: resetAllTranslationAction; text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Object Positions"); + onTriggered: Printer.resetAllTranslation(); } Action { id: resetAllAction; text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Object &Transformations"); + onTriggered: Printer.resetAll(); } Action From 3bfe18e76f35a0aea5b129518a1eced0acff0cdc Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 16:41:22 +0200 Subject: [PATCH 034/224] Add a configureSettingVisibility action --- resources/qml/Actions.qml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index bc9ef89e24..afb018fa69 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -47,6 +47,8 @@ Item property alias toggleFullScreen: toggleFullScreenAction; + property alias configureSettingVisibility: configureSettingVisibilityAction + UM.I18nCatalog{id: catalog; name:"cura"} Action @@ -262,4 +264,10 @@ Item iconName: "view-list-text"; shortcut: StandardKey.WhatsThis; } + + Action + { + id: configureSettingVisibilityAction + text: catalog.i18nc("@action:menu", "Configure setting visiblity..."); + } } From d761409bf2b1a074850766bbcec2582d96ce5b77 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 16:51:09 +0200 Subject: [PATCH 035/224] Remove SettingItemStyle from the cura theme As it is no longer needed --- resources/themes/cura/styles.qml | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index e536c38ba7..cb85abf0c1 100644 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -280,35 +280,6 @@ QtObject { } } - property variant setting_item: UM.SettingItemStyle { - labelFont: Theme.getFont("default"); - labelColor: Theme.getColor("setting_control_text"); - - spacing: Theme.getSize("default_lining").height; - fixedHeight: Theme.getSize("setting").height; - - controlWidth: Theme.getSize("setting_control").width; - controlRightMargin: Theme.getSize("setting_control_margin").width; - controlColor: Theme.getColor("setting_control"); - controlHighlightColor: Theme.getColor("setting_control_highlight"); - controlBorderColor: Theme.getColor("setting_control_border"); - controlBorderHighlightColor: Theme.getColor("setting_control_border_highlight"); - controlTextColor: Theme.getColor("setting_control_text"); - controlBorderWidth: Theme.getSize("default_lining").width; - controlDisabledColor: Theme.getColor("setting_control_disabled"); - controlDisabledTextColor: Theme.getColor("setting_control_disabled_text"); - controlDisabledBorderColor: Theme.getColor("setting_control_disabled_border"); - controlFont: Theme.getFont("default"); - - validationErrorColor: Theme.getColor("setting_validation_error"); - validationWarningColor: Theme.getColor("setting_validation_warning"); - validationOkColor: Theme.getColor("setting_validation_ok"); - - unitRightMargin: Theme.getSize("setting_unit_margin").width; - unitColor: Theme.getColor("setting_unit"); - unitFont: Theme.getFont("default"); - } - property Component combobox: Component { ComboBoxStyle { background: Rectangle { From fa9f9b41ab9eacf52802ca4c41a315a1bfffac9f Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 16:52:27 +0200 Subject: [PATCH 036/224] Fix SettingUnknown setting handler to display correctly --- resources/qml/Settings/SettingUnknown.qml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingUnknown.qml b/resources/qml/Settings/SettingUnknown.qml index 4b403e522f..55e26b6695 100644 --- a/resources/qml/Settings/SettingUnknown.qml +++ b/resources/qml/Settings/SettingUnknown.qml @@ -4,10 +4,16 @@ import QtQuick 2.1 import QtQuick.Controls 1.1 +import UM 1.2 as UM + SettingItem { - Label + contents: Label { + anchors.fill: parent text: value + " " + unit; + color: UM.Theme.getColor("setting_control_text") + + verticalAlignment: Qt.AlignVCenter } } From 4c9b9b68ef8263d2f6f577b16db36a5d0d80b8ba Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 16:52:56 +0200 Subject: [PATCH 037/224] Add add/remove transitions so expand/collapse is animated --- resources/qml/Settings/SettingView.qml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 49beba0990..92f228a9d8 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -68,6 +68,28 @@ ScrollView UM.I18nCatalog { id: catalog; name: "uranium"; } + add: Transition { + SequentialAnimation { + NumberAnimation { properties: "height"; from: 0; duration: 100 } + NumberAnimation { properties: "opacity"; from: 0; duration: 100 } + } + } + remove: Transition { + SequentialAnimation { + NumberAnimation { properties: "opacity"; to: 0; duration: 100 } + NumberAnimation { properties: "height"; to: 0; duration: 100 } + } + } + addDisplaced: Transition { + NumberAnimation { properties: "x,y"; duration: 100 } + } + removeDisplaced: Transition { + SequentialAnimation { + PauseAnimation { duration: 100; } + NumberAnimation { properties: "x,y"; duration: 100 } + } + } + Menu { id: contextMenu; From 2abb9a47c127fe9ab982260715d7cbd9f51fe703 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 16:55:45 +0200 Subject: [PATCH 038/224] Stop using SettingItemStyle Since everything is now in Cura, using SettingItemStyle does not make a lot of sense anymore --- resources/qml/Settings/SettingCheckBox.qml | 15 ++--- resources/qml/Settings/SettingComboBox.qml | 22 +++---- resources/qml/Settings/SettingTextField.qml | 68 ++++++++++----------- 3 files changed, 53 insertions(+), 52 deletions(-) diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml index b2bbc68ec1..37cad7fd4b 100644 --- a/resources/qml/Settings/SettingCheckBox.qml +++ b/resources/qml/Settings/SettingCheckBox.qml @@ -46,19 +46,20 @@ SettingItem { if (!enabled) { - return base.style.controlDisabledColor + return UM.Theme.getColor("setting_control_disabled") } if(base.containsMouse || base.activeFocus) { - return base.style.controlHighlightColor + return UM.Theme.getColor("setting_control_highlight") } else { - return base.style.controlColor + return UM.Theme.getColor("setting_control") } } - border.width: base.style.controlBorderWidth; - border.color: !enabled ? base.style.controlDisabledBorderColor : control.containsMouse ? base.style.controlBorderHighlightColor : base.style.controlBorderColor; + + border.width: UM.Theme.getSize("default_lining").width + border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : control.containsMouse ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") UM.RecolorImage { anchors.verticalCenter: parent.verticalCenter @@ -67,9 +68,9 @@ SettingItem height: parent.height/2.5 sourceSize.width: width sourceSize.height: width - color: !enabled ? base.style.controlDisabledTextColor : base.style.controlTextColor; + color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text"); source: UM.Theme.getIcon("check") - opacity: control.checked + opacity: control.checked ? 1 : 0 Behavior on opacity { NumberAnimation { duration: 100; } } } } diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index 85935c3471..6fd4c5621c 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -33,33 +33,33 @@ SettingItem { if (!enabled) { - return base.style.controlDisabledColor + return UM.Theme.getColor("setting_control_disabled") } if(control.hovered || base.activeFocus) { - return base.style.controlHighlightColor + return UM.Theme.getColor("setting_control_highlight") } else { - return base.style.controlColor + return UM.Theme.getColor("setting_control") } } - border.width: base.style.controlBorderWidth; - border.color: !enabled ? base.style.controlDisabledBorderColor : control.hovered ? base.style.controlBorderHighlightColor : base.style.controlBorderColor; + border.width: UM.Theme.getSize("default_lining").width; + border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : control.hovered ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border"); } label: Item { Label { anchors.left: parent.left; - anchors.leftMargin: base.style.controlBorderWidth + anchors.leftMargin: UM.Theme.getSize("default_lining").width anchors.right: downArrow.left; - anchors.rightMargin: base.style.controlBorderWidth; + anchors.rightMargin: UM.Theme.getSize("default_lining").width; anchors.verticalCenter: parent.verticalCenter; text: control.currentText; - font: base.style.controlFont; - color: !enabled ? base.style.controlDisabledTextColor : base.style.controlTextColor; + font: UM.Theme.getFont("default"); + color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text"); elide: Text.ElideRight; verticalAlignment: Text.AlignVCenter; @@ -69,7 +69,7 @@ SettingItem { id: downArrow anchors.right: parent.right; - anchors.rightMargin: base.style.controlBorderWidth * 2; + anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2; anchors.verticalCenter: parent.verticalCenter; source: UM.Theme.getIcon("arrow_bottom") @@ -78,7 +78,7 @@ SettingItem sourceSize.width: width + 5 sourceSize.height: width + 5 - color: base.style.controlTextColor; + color: UM.Theme.getColor("setting_control_text"); } } diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 62f03b087d..1b28ebadcc 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -18,44 +18,44 @@ SettingItem property alias hovered: mouseArea.containsMouse; - border.width: base.style.controlBorderWidth; - border.color: !enabled ? base.style.controlDisabledBorderColor : hovered ? base.style.controlBorderHighlightColor : base.style.controlBorderColor + border.width: UM.Theme.getSize("default_lining").width + border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : hovered ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") property variant parentValue: value //From parent loader function notifyReset() { input.text = format(parentValue) } -// color: { -// if (!enabled) -// { -// return base.style.controlDisabledColor -// } -// switch(definition.validationState) //From parent loader -// { -// case 0: -// return base.style.validationErrorColor; -// case 1: -// return base.style.validationErrorColor; -// case 2: -// return base.style.validationErrorColor; -// case 3: -// return base.style.validationWarningColor; -// case 4: -// return base.style.validationWarningColor; -// case 5: -// return base.style.validationOkColor; -// -// default: -// return base.style.controlTextColor; -// } -// } + color: { + if (!enabled) + { + return UM.Theme.getColor("setting_control_disabled") + } + switch(definition.validationState) + { + case 0: + return UM.Theme.getColor("setting_validation_error") + case 1: + return UM.Theme.getColor("setting_validation_error") + case 2: + return UM.Theme.getColor("setting_validation_error") + case 3: + return UM.Theme.getColor("setting_validation_warning") + case 4: + return UM.Theme.getColor("setting_validation_warning") + case 5: + return UM.Theme.getColor("setting_validation_ok") + + default: + return UM.Theme.getColor("setting_control") + } + } Rectangle { anchors.fill: parent; - anchors.margins: base.style.controlBorderWidth; - color: base.style.controlHighlightColor; + anchors.margins: UM.Theme.getSize("default_lining").width; + color: UM.Theme.getColor("setting_control_highlight") opacity: 0.35 // opacity: !control.hovered ? 0 : valid == 5 ? 1.0 : 0.35; } @@ -63,12 +63,12 @@ SettingItem Label { anchors.right: parent.right; - anchors.rightMargin: base.style.unitRightMargin; + anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width anchors.verticalCenter: parent.verticalCenter; text: definition.unit; - color: base.style.unitColor - font: base.style.unitFont; + color: UM.Theme.getColor("setting_unit") + font: UM.Theme.getFont("default") } MouseArea @@ -86,7 +86,7 @@ SettingItem anchors { left: parent.left - leftMargin: base.style.unitRightMargin + leftMargin: UM.Theme.unitRightMargin right: parent.right verticalCenter: parent.verticalCenter } @@ -108,8 +108,8 @@ SettingItem } } - color: !enabled ? base.style.controlDisabledTextColor : base.style.controlTextColor; - font: base.style.controlFont; + color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default"); selectByMouse: true; From b7fd97737c9d397cc3a37014be7a13cc843adb25 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 17:03:02 +0200 Subject: [PATCH 039/224] Simplify tooltip handling for settings Rather than use three different signals, use a single showTooltip signal with a text property. This makes it possible to show any tooltip from within a setting item. --- resources/qml/Settings/SettingCategory.qml | 6 ++++-- resources/qml/Settings/SettingItem.qml | 4 ++-- resources/qml/Settings/SettingView.qml | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml index b4c0263149..455ef3d3e1 100644 --- a/resources/qml/Settings/SettingCategory.qml +++ b/resources/qml/Settings/SettingCategory.qml @@ -13,7 +13,7 @@ Button { style: UM.Theme.styles.sidebar_category; - signal showTooltip(); + signal showTooltip(string text); signal hideTooltip(); signal contextMenuRequested() @@ -69,11 +69,13 @@ Button { iconSource: UM.Theme.getIcon("notice") onEntered: { - base.showTooltip() + base.showTooltip(catalog.i18nc("@label", "This setting is normally calculated, but it currently has an absolute value set.\n\nClick to restore the calculated value.")) } onExited: { base.hideTooltip(); } + + UM.I18nCatalog { id: catalog; name: "cura" } } } diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 845f35853e..e8c3b0b7bb 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -18,7 +18,7 @@ Item { property alias contents: controlContainer.children signal contextMenuRequested() - signal showTooltip(var position); + signal showTooltip(string text); signal hideTooltip(); MouseArea @@ -49,7 +49,7 @@ Item { interval: 500; repeat: false; - onTriggered: base.showTooltip({ x: mouse.mouseX, y: mouse.mouseY }); + onTriggered: base.showTooltip(definition.description); } } diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 92f228a9d8..6d0944e1be 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -62,7 +62,8 @@ ScrollView { target: item onContextMenuRequested: { contextMenu.key = model.key; contextMenu.popup() } - onShowTooltip: base.showTooltip(delegate, position, model.description) + onShowTooltip: base.showTooltip(delegate, { x: 0, y: delegate.height / 2 }, text) + onHideTooltip: base.hideTooltip() } } From d68f274a098d7d8669bf90f5416a35c4593b4ff6 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 17:03:54 +0200 Subject: [PATCH 040/224] Improve positioning of tooltips in advanced mode --- resources/qml/Sidebar.qml | 2 +- resources/qml/SidebarSimple.qml | 6 +++--- resources/qml/SidebarTooltip.qml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 5426125194..b98f3477dc 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -27,7 +27,7 @@ Rectangle function showTooltip(item, position, text) { tooltip.text = text; - position = item.mapToItem(base, position.x, position.y / 2); + position = item.mapToItem(base, position.x, position.y); tooltip.show(position); } diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 21aa315dd1..0e877ab09b 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -120,7 +120,7 @@ Item } } onEntered: { - base.showTooltip(infillCellRight, Qt.point(-infillCellRight.x, parent.height), model.text); + base.showTooltip(infillCellRight, Qt.point(-infillCellRight.x, 0), model.text); } onExited: { base.hideTooltip(); @@ -224,7 +224,7 @@ Item onEntered: { parent.hovered_ex = true - base.showTooltip(brimCheckBox, Qt.point(-helpersCellRight.x, parent.height), + base.showTooltip(brimCheckBox, Qt.point(-helpersCellRight.x, 0), catalog.i18nc("@label", "Enable printing a brim. This will add a single-layer-thick flat area around your object which is easy to cut off afterwards.")); } onExited: @@ -257,7 +257,7 @@ Item onEntered: { parent.hovered_ex = true - base.showTooltip(supportCheckBox, Qt.point(-helpersCellRight.x, parent.height), + base.showTooltip(supportCheckBox, Qt.point(-helpersCellRight.x, 0), catalog.i18nc("@label", "Enable printing support structures. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air.")); } onExited: diff --git a/resources/qml/SidebarTooltip.qml b/resources/qml/SidebarTooltip.qml index 1c7f4bcb76..5cb7ff1f0b 100644 --- a/resources/qml/SidebarTooltip.qml +++ b/resources/qml/SidebarTooltip.qml @@ -31,7 +31,7 @@ UM.PointingRectangle { y = position.y - UM.Theme.getSize("tooltip_arrow_margins").height; } base.opacity = 1; - target = Qt.point(40 , position.y) + target = Qt.point(40 , position.y + UM.Theme.getSize("tooltip_arrow_margins").height / 2) } function hide() { From cdc8b04c5c72cac15357dce9afa14447577de49b Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 17:05:26 +0200 Subject: [PATCH 041/224] Use the configureSettingVisiblity action from Actions when needed --- resources/qml/Settings/SettingCategory.qml | 4 +++- resources/qml/Settings/SettingView.qml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml index 455ef3d3e1..871b5c0036 100644 --- a/resources/qml/Settings/SettingCategory.qml +++ b/resources/qml/Settings/SettingCategory.qml @@ -8,6 +8,8 @@ import QtQuick.Layouts 1.1 import UM 1.1 as UM +import ".." + Button { id: base; @@ -43,7 +45,7 @@ Button { iconSource: UM.Theme.getIcon("settings"); onClicked: { - Actions.configureSettingVisibility() + Actions.configureSettingVisibility.trigger(definition) } } diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 6d0944e1be..76fd232f1a 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -8,6 +8,8 @@ import QtQuick.Layouts 1.1 import UM 1.2 as UM +import ".." + ScrollView { id: base; @@ -108,7 +110,7 @@ ScrollView //: Settings context menu action text: catalog.i18nc("@action:menu", "Configure setting visiblity..."); - onTriggered: if(base.configureSettings) base.configureSettings.trigger(contextMenu); + onTriggered: Actions.configureSettingVisibility.trigger(contextMenu); } } } From 38e9661fe1cb6645f8f076c3b9535af020eb6db0 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 17:05:38 +0200 Subject: [PATCH 042/224] Fix setting type names --- resources/qml/Settings/SettingView.qml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 76fd232f1a..6fdc5d5082 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -45,13 +45,11 @@ ScrollView return "SettingTextField.qml" case "float": return "SettingTextField.qml" - case "double": - return "SettingTextField.qml" case "enum": return "SettingComboBox.qml" - case "boolean": + case "bool": return "SettingCheckBox.qml" - case "string": + case "str": return "SettingTextField.qml" case "category": return "SettingCategory.qml" From 89928dc6a957b8de3454141fc266589f2b54f333 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 17:06:01 +0200 Subject: [PATCH 043/224] Make Setting item loading asynchronous and fix its size --- resources/qml/Settings/SettingView.qml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 6fdc5d5082..66ff30fa11 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -32,11 +32,14 @@ ScrollView { id: delegate - width: ListView.view.width + width: UM.Theme.getSize("sidebar").width; + height: UM.Theme.getSize("section").height; property var definition: model property var settingDefinitionsModel: definitionsModel + asynchronous: true + source: { switch(model.type) From 4390c6a6ff9a08900f49ffdd663058cd9cf70062 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 17:06:48 +0200 Subject: [PATCH 044/224] Remove configureSettingsAction property from sidebar as it is no longer needed --- resources/qml/Sidebar.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index b98f3477dc..81823f039d 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -247,7 +247,6 @@ Rectangle id: sidebarAdvanced; visible: false; - configureSettings: base.configureSettingsAction; onShowTooltip: base.showTooltip(item, location, text) onHideTooltip: base.hideTooltip() } From 9ec93bedabbea2efbda3e58c4ab143221f02beb9 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 17:07:27 +0200 Subject: [PATCH 045/224] Fix type and spacing of SettingItem contents --- resources/qml/Settings/SettingItem.qml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index e8c3b0b7bb..f9dac0b879 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -154,15 +154,14 @@ Item { } - Rectangle + Item { id: controlContainer; - color: "red" - anchors.right: parent.right; + anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter; width: UM.Theme.getSize("setting_control").width; - height: UM.Theme.getSize("setting_contorl").height + height: UM.Theme.getSize("setting_control").height } } From 2b479e5651680a8cadab1b5c837f9e046fc291bb Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 17:07:42 +0200 Subject: [PATCH 046/224] Add a hovered property to SettingItem --- resources/qml/Settings/SettingItem.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index f9dac0b879..5e31e0c264 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -15,7 +15,8 @@ Item { height: UM.Theme.getSize("section").height; - property alias contents: controlContainer.children + property alias contents: controlContainer.children; + property bool hovered: false signal contextMenuRequested() signal showTooltip(string text); From d4b5cd519b7a03ad35040537c506f8c94d225d6c Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 17:10:11 +0200 Subject: [PATCH 047/224] Fix SettingCheckbox so it displays correctly --- resources/qml/Settings/SettingCheckBox.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml index 37cad7fd4b..0acacb95fb 100644 --- a/resources/qml/Settings/SettingCheckBox.qml +++ b/resources/qml/Settings/SettingCheckBox.qml @@ -12,9 +12,10 @@ SettingItem { id: base - MouseArea + contents: MouseArea { id: control + anchors.fill: parent property bool checked: { @@ -48,7 +49,7 @@ SettingItem { return UM.Theme.getColor("setting_control_disabled") } - if(base.containsMouse || base.activeFocus) + if(control.containsMouse || control.activeFocus) { return UM.Theme.getColor("setting_control_highlight") } From d1d2dc04c5bb16a4ab5a4e7ede5478100062e9ed Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 17:13:36 +0200 Subject: [PATCH 048/224] Display the correct tooltips for reset and inherits buttons --- resources/qml/Settings/SettingItem.qml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 5e31e0c264..d11b0b300a 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -107,7 +107,7 @@ Item { controlContainer.notifyReset(); } - onEntered: base.showResetTooltip({ x: mouse.mouseX, y: mouse.mouseY }) + onEntered: base.showTooltip(catalog.i18nc("@label", "This setting has a value that is different from the profile.\n\nClick to restore the value of the profile.")) onExited: { if(controlContainer.item && controlContainer.item.hovered) @@ -141,7 +141,7 @@ Item { iconSource: UM.Theme.getIcon("notice"); - onEntered: base.showInheritanceTooltip({ x: mouse.mouseX, y: mouse.mouseY }) + onEntered: base.showTooltip(catalog.i18nc("@label", "This setting is normally calculated, but it currently has an absolute value set.\n\nClick to restore the calculated value.")) onExited: { if(controlContainer.item && controlContainer.item.hovered) { @@ -165,4 +165,6 @@ Item { width: UM.Theme.getSize("setting_control").width; height: UM.Theme.getSize("setting_control").height } + + UM.I18nCatalog { id: catalog; name: "cura" } } From 3514d4839d287bd4876c4f4b99b3aec8e289c9de Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 11 May 2016 17:15:04 +0200 Subject: [PATCH 049/224] Fix combo box setting item so it displays the right things --- resources/qml/Settings/SettingComboBox.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index 6fd4c5621c..0f332b2aee 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -11,12 +11,12 @@ SettingItem { id: base - ComboBox + contents: ComboBox { -// signal valueChanged(string value); -// id: base model: definition.options - textRole: "name"; + textRole: "value"; + + anchors.fill: parent MouseArea { From ac9b391e7fd1c6d868dc4fa0ddb7478fe00e3974 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 11 May 2016 17:20:09 +0200 Subject: [PATCH 050/224] Fixed available printers in dropdown menu CURA-1278 --- resources/qml/Cura.qml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index e39cd733d9..753f856163 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -7,7 +7,8 @@ import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 import QtQuick.Dialogs 1.1 -import UM 1.1 as UM +import UM 1.2 as UM +import Cura 1.0 as Cura UM.MainWindow { @@ -168,14 +169,17 @@ UM.MainWindow Instantiator { -// model: UM.MachineInstancesModel { } + model: UM.ContainerStacksModel + { + filter: {"type": "machine"} + } MenuItem { text: model.name; checkable: true; - checked: model.active; - exclusiveGroup: machineMenuGroup; - onTriggered: UM.MachineManager.setActiveMachineInstance(model.name) + checked: Cura.MachineManager.activeMachineId == model.id + exclusiveGroup: machineSelectionMenuGroup; + onTriggered: Cura.MachineManager.setActiveMachine(model.id); } onObjectAdded: machineMenu.insertItem(index, object) onObjectRemoved: machineMenu.removeItem(object) From d8e4aa90788c5ada739b17d8f06d7da392b7e162 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 12 May 2016 11:24:09 +0200 Subject: [PATCH 051/224] Moved machinePage to Cura CURA-1278 --- cura/MachineManagerModel.py | 5 +++ resources/qml/Cura.qml | 2 + resources/qml/MachinesPage.qml | 68 ++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 resources/qml/MachinesPage.qml diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index c5f2fc3fa6..ec346710af 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -27,6 +27,11 @@ class MachineManagerModel(QObject): def activeMachineId(self): return Application.getInstance().getGlobalContainerStack().getId() + @pyqtSlot(str, str) + def renameMachine(self, machine_id, new_name): + containers = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) + if containers: + containers[0].setName(new_name) def createMachineManagerModel(engine, script_engine): diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 134d06c9d7..4314dc21e6 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -542,6 +542,8 @@ UM.MainWindow //: View preferences page title insertPage(1, catalog.i18nc("@title:tab","View"), Qt.resolvedUrl("ViewPage.qml")); + insertPage(2, catalog.i18nc("@title:tab", "Printers"), Qt.resolvedUrl("MachinesPage.qml")); + //Force refresh setPage(0); } diff --git a/resources/qml/MachinesPage.qml b/resources/qml/MachinesPage.qml new file mode 100644 index 0000000000..58a0878019 --- /dev/null +++ b/resources/qml/MachinesPage.qml @@ -0,0 +1,68 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +UM.ManagementPage +{ + id: base; + + title: catalog.i18nc("@title:tab", "Printers"); + property int numInstances: model.rowCount(); + model: UM.ContainerStacksModel + { + filter: {"type": "machine"} + onDataChanged: numInstances = model.rowCount() + } + + onAddObject: model.requestAddMachine(); + onRemoveObject: confirmDialog.open(); + onRenameObject: renameDialog.open(); + + removeEnabled: numInstances > 1 + renameEnabled: numInstances > 0 + + Flow + { + anchors.fill: parent; + spacing: UM.Theme.getSize("default_margin").height; + + Label + { + text: base.currentItem && base.currentItem.name ? base.currentItem.name : "" + font: UM.Theme.getFont("large") + width: parent.width + elide: Text.ElideRight + } + + Label { text: catalog.i18nc("@label", "Type"); width: parent.width * 0.2; } + Label { text: base.currentItem && base.currentItem.typeName ? base.currentItem.typeName : ""; width: parent.width * 0.7; } + + UM.I18nCatalog { id: catalog; name: "uranium"; } + + UM.ConfirmRemoveDialog + { + id: confirmDialog; + object: base.currentItem && base.currentItem.name ? base.currentItem.name : ""; + onYes: base.model.removeMachineInstance(base.currentItem.name); + } + + UM.RenameDialog + { + id: renameDialog; + object: base.currentItem && base.currentItem.name ? base.currentItem.name : ""; + onAccepted: + { + Cura.MachineManager.renameMachine(base.currentItem.id, newName.trim()); + //Reselect current item to update details panel + var index = objectList.currentIndex + objectList.currentIndex = -1 + objectList.currentIndex = index + } + } + } +} From 78e9545ecea2cbf837402e69221d8a16110fd244 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 12 May 2016 11:46:28 +0200 Subject: [PATCH 052/224] Machines can now be removed CURA-1278 --- cura/MachineManagerModel.py | 5 +++++ resources/qml/MachinesPage.qml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index ec346710af..2df28c1f92 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -33,6 +33,11 @@ class MachineManagerModel(QObject): if containers: containers[0].setName(new_name) + @pyqtSlot(str) + def removeMachine(self, machine_id): + ContainerRegistry.getInstance().removeContainer(machine_id) + + def createMachineManagerModel(engine, script_engine): return MachineManagerModel() \ No newline at end of file diff --git a/resources/qml/MachinesPage.qml b/resources/qml/MachinesPage.qml index 58a0878019..88cfbc740e 100644 --- a/resources/qml/MachinesPage.qml +++ b/resources/qml/MachinesPage.qml @@ -48,7 +48,7 @@ UM.ManagementPage { id: confirmDialog; object: base.currentItem && base.currentItem.name ? base.currentItem.name : ""; - onYes: base.model.removeMachineInstance(base.currentItem.name); + onYes: Cura.MachineManager.removeMachine(base.currentItem.id); } UM.RenameDialog From 65022c3d1806d5a78b31b0580142c42b33038a5d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 12 May 2016 11:53:01 +0200 Subject: [PATCH 053/224] Fixed adding machine in printer dialog CURA-1278 --- resources/qml/MachinesPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/MachinesPage.qml b/resources/qml/MachinesPage.qml index 88cfbc740e..14425acc05 100644 --- a/resources/qml/MachinesPage.qml +++ b/resources/qml/MachinesPage.qml @@ -19,7 +19,7 @@ UM.ManagementPage onDataChanged: numInstances = model.rowCount() } - onAddObject: model.requestAddMachine(); + onAddObject: Printer.requestAddPrinter() onRemoveObject: confirmDialog.open(); onRenameObject: renameDialog.open(); From a16acddff1da61fe2bd7759cb3ce9e0ab36c6d61 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 12 May 2016 11:59:23 +0200 Subject: [PATCH 054/224] Removed unused code CURA-1278 --- cura/CuraApplication.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 17450029a3..8c6681de8c 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -638,6 +638,3 @@ class CuraApplication(QtApplication): job = ReadMeshJob(os.path.abspath(file)) job.finished.connect(self._onFileLoaded) job.start() - - def _onAddMachineRequested(self): - self.requestAddPrinter.emit() From 44f5559db3a54bdbf9d7e9bd01e8a5dacd7e3674 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 12 May 2016 15:18:13 +0200 Subject: [PATCH 055/224] Moved addMachine to machineManager CURA-1278 --- cura/MachineManagerModel.py | 12 ++++++++++++ resources/qml/AddMachineDialog.qml | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 2df28c1f92..da14864118 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -2,6 +2,7 @@ from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from UM.Application import Application from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.ContainerStack import ContainerStack class MachineManagerModel(QObject): def __init__(self, parent = None): @@ -19,6 +20,17 @@ class MachineManagerModel(QObject): if containers: Application.getInstance().setGlobalContainerStack(containers[0]) + @pyqtSlot(str, str) + def addMachine(self,name, definition_id): + definitions = ContainerRegistry.getInstance().findDefinitionContainers(id=definition_id) + if definitions: + new_global_stack = ContainerStack(name) + new_global_stack.addMetaDataEntry("type", "machine") + ContainerRegistry.getInstance().addContainer(new_global_stack) + # If a definition is found, its a list. Should only have one item. + new_global_stack.addContainer(definitions[0]) + Application.getInstance().setGlobalContainerStack(new_global_stack) + @pyqtProperty(str, notify = globalContainerChanged) def activeMachineName(self): return Application.getInstance().getGlobalContainerStack().getName() diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml index 476df2178c..4a5e14f183 100644 --- a/resources/qml/AddMachineDialog.qml +++ b/resources/qml/AddMachineDialog.qml @@ -161,7 +161,7 @@ UM.Dialog { base.visible = false var item = machineList.model.getItem(machineList.currentIndex); - machineList.model.setNewGlobalStackFromDefinition(machineName.text, item.id) + Cura.MachineManager.addMachine(machineName.text, item.id) } } From 89c0644e4be66dcab9853321b17fb8710c0b64ec Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 12 May 2016 17:01:47 +0200 Subject: [PATCH 056/224] Added activeMaterial property CURA-1278 --- cura/MachineManagerModel.py | 22 ++++++++++++++++++++++ resources/qml/SidebarHeader.qml | 9 +++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index da14864118..aef7d37af9 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -3,13 +3,18 @@ from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from UM.Application import Application from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.ContainerStack import ContainerStack +from UM.Settings.InstanceContainer import InstanceContainer class MachineManagerModel(QObject): def __init__(self, parent = None): super().__init__(parent) Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) + ## When the global container is changed, active material probably needs to be updated. + self.globalContainerChanged.connect(self.activeMaterialChanged) + globalContainerChanged = pyqtSignal() + activeMaterialChanged = pyqtSignal() def _onGlobalContainerChanged(self): self.globalContainerChanged.emit() @@ -27,8 +32,19 @@ class MachineManagerModel(QObject): new_global_stack = ContainerStack(name) new_global_stack.addMetaDataEntry("type", "machine") ContainerRegistry.getInstance().addContainer(new_global_stack) + + variant_instance_container = InstanceContainer(name + "_variant") + material_instance_container = InstanceContainer("test_material") + material_instance_container.addMetaDataEntry("type", "material") + material_instance_container.setDefinition(definitions[0]) + #material_instance_container.setMetaData({"type","material"}) + quality_instance_container = InstanceContainer(name + "_quality") + current_settings_instance_container = InstanceContainer(name + "_current_settings") + ContainerRegistry.getInstance().addContainer(material_instance_container) + # If a definition is found, its a list. Should only have one item. new_global_stack.addContainer(definitions[0]) + new_global_stack.addContainer(material_instance_container) Application.getInstance().setGlobalContainerStack(new_global_stack) @pyqtProperty(str, notify = globalContainerChanged) @@ -39,6 +55,12 @@ class MachineManagerModel(QObject): def activeMachineId(self): return Application.getInstance().getGlobalContainerStack().getId() + @pyqtProperty(str, notify = activeMaterialChanged) + def activeMaterialName(self): + material = Application.getInstance().getGlobalContainerStack().findContainer({"type":"material"}) + if material: + return material.getName() + @pyqtSlot(str, str) def renameMachine(self, machine_id, new_name): containers = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 83188007cf..6b1c4166b7 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -172,8 +172,8 @@ Item ToolButton { id: materialSelection - text: UM.MachineManager.activeMaterial - tooltip: UM.MachineManager.activeMaterial + text: Cura.MachineManager.activeMaterialName + tooltip: Cura.MachineManager.activeMaterialName visible: UM.MachineManager.hasMaterials height: UM.Theme.getSize("setting_control").height @@ -187,6 +187,11 @@ Item Instantiator { id: materialSelectionInstantiator + model: UM.InstanceContainersModel + { + filter: {"type": "material"} + } + //model: UM.InstancesModel {filter: {"type":"material"}} // model: UM.MachineMaterialsModel { id: machineMaterialsModel } MenuItem { From f5e63f2e718762e083b7d9fe5efce7731d904c30 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 12 May 2016 17:38:43 +0200 Subject: [PATCH 057/224] Changing the material is now possible CURA-1278 --- cura/MachineManagerModel.py | 13 +++++++++++++ resources/qml/SidebarHeader.qml | 8 ++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index aef7d37af9..49c2288a98 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -17,8 +17,14 @@ class MachineManagerModel(QObject): activeMaterialChanged = pyqtSignal() def _onGlobalContainerChanged(self): + Application.getInstance().getGlobalContainerStack().containersChanged.connect(self._onInstanceContainersChanged) self.globalContainerChanged.emit() + def _onInstanceContainersChanged(self, container): + container_type = container.getMetaDataEntry("type") + if container_type == "material": + self.activeMaterialChanged.emit() + @pyqtSlot(str) def setActiveMachine(self, stack_id): containers = ContainerRegistry.getInstance().findContainerStacks(id = stack_id) @@ -61,6 +67,13 @@ class MachineManagerModel(QObject): if material: return material.getName() + @pyqtSlot(str) + def setActiveMaterial(self, material_id): + containers = ContainerRegistry.getInstance().findInstanceContainers(id=material_id) + old_material = Application.getInstance().getGlobalContainerStack().findContainer({"type":"material"}) + material_index = Application.getInstance().getGlobalContainerStack().getContainerIndex(old_material) + Application.getInstance().getGlobalContainerStack().replaceContainer(material_index, containers[0]) + @pyqtSlot(str, str) def renameMachine(self, machine_id, new_name): containers = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 6b1c4166b7..7feeb32d43 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -201,14 +201,14 @@ Item exclusiveGroup: materialSelectionMenuGroup; onTriggered: { - UM.MachineManager.setActiveMaterial(machineMaterialsModel.getItem(index).name); - if (typeof(model) !== "undefined" && !model.active) { + 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 = UM.MachineManager.activeMaterial; + var activeMaterialName = Cura.MachineManager.activeMaterialName var activeMaterialIndex = materialSelectionInstantiator.model.find("name", activeMaterialName); materialSelectionInstantiator.model.setProperty(activeMaterialIndex, "active", true); - } + }*/ } } onObjectAdded: materialSelectionMenu.insertItem(index, object) From b3e741e90cba70db672ffb653a1d5f3cb797ee6d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 13 May 2016 10:16:58 +0200 Subject: [PATCH 058/224] Added variant selection CURA-1278 --- cura/MachineManagerModel.py | 33 +++++++++++++++++++++++++++++---- resources/qml/SidebarHeader.qml | 14 +++++++++----- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 49c2288a98..c7cd4a6758 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -12,9 +12,11 @@ class MachineManagerModel(QObject): ## When the global container is changed, active material probably needs to be updated. self.globalContainerChanged.connect(self.activeMaterialChanged) + self.globalContainerChanged.connect(self.activeVariantChanged) globalContainerChanged = pyqtSignal() activeMaterialChanged = pyqtSignal() + activeVariantChanged = pyqtSignal() def _onGlobalContainerChanged(self): Application.getInstance().getGlobalContainerStack().containersChanged.connect(self._onInstanceContainersChanged) @@ -24,6 +26,8 @@ class MachineManagerModel(QObject): container_type = container.getMetaDataEntry("type") if container_type == "material": self.activeMaterialChanged.emit() + elif container_type == "variant": + self.activeVariantChanged.emit() @pyqtSlot(str) def setActiveMachine(self, stack_id): @@ -39,18 +43,24 @@ class MachineManagerModel(QObject): new_global_stack.addMetaDataEntry("type", "machine") ContainerRegistry.getInstance().addContainer(new_global_stack) - variant_instance_container = InstanceContainer(name + "_variant") + ## DEBUG CODE material_instance_container = InstanceContainer("test_material") material_instance_container.addMetaDataEntry("type", "material") material_instance_container.setDefinition(definitions[0]) - #material_instance_container.setMetaData({"type","material"}) + + variant_instance_container = InstanceContainer("test_variant") + variant_instance_container.addMetaDataEntry("type", "variant") + variant_instance_container.setDefinition(definitions[0]) + quality_instance_container = InstanceContainer(name + "_quality") current_settings_instance_container = InstanceContainer(name + "_current_settings") ContainerRegistry.getInstance().addContainer(material_instance_container) + ContainerRegistry.getInstance().addContainer(variant_instance_container) # If a definition is found, its a list. Should only have one item. new_global_stack.addContainer(definitions[0]) new_global_stack.addContainer(material_instance_container) + new_global_stack.addContainer(variant_instance_container) Application.getInstance().setGlobalContainerStack(new_global_stack) @pyqtProperty(str, notify = globalContainerChanged) @@ -71,8 +81,23 @@ class MachineManagerModel(QObject): def setActiveMaterial(self, material_id): containers = ContainerRegistry.getInstance().findInstanceContainers(id=material_id) old_material = Application.getInstance().getGlobalContainerStack().findContainer({"type":"material"}) - material_index = Application.getInstance().getGlobalContainerStack().getContainerIndex(old_material) - Application.getInstance().getGlobalContainerStack().replaceContainer(material_index, containers[0]) + if old_material: + material_index = Application.getInstance().getGlobalContainerStack().getContainerIndex(old_material) + Application.getInstance().getGlobalContainerStack().replaceContainer(material_index, containers[0]) + + @pyqtSlot(str) + def setActiveVariant(self, variant_id): + containers = ContainerRegistry.getInstance().findInstanceContainers(id=variant_id) + old_variant = Application.getInstance().getGlobalContainerStack().findContainer({"type": "variant"}) + if old_variant: + variant_index = Application.getInstance().getGlobalContainerStack().getContainerIndex(old_variant) + Application.getInstance().getGlobalContainerStack().replaceContainer(variant_index, containers[0]) + + @pyqtProperty(str, notify = activeVariantChanged) + def activeVariantName(self): + variant = Application.getInstance().getGlobalContainerStack().findContainer({"type": "variant"}) + if variant: + return variant.getName() @pyqtSlot(str, str) def renameMachine(self, machine_id, new_name): diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 7feeb32d43..e4c8e8bb02 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -128,8 +128,8 @@ Item ToolButton { id: variantSelection - text: UM.MachineManager.activeMachineVariant - tooltip: UM.MachineManager.activeMachineVariant; + text: Cura.MachineManager.activeVariantName + tooltip: Cura.MachineManager.activeVariantName; visible: UM.MachineManager.hasVariants height: UM.Theme.getSize("setting_control").height @@ -143,6 +143,10 @@ Item Instantiator { id: variantSelectionInstantiator + model: UM.InstanceContainersModel + { + filter: {"type": "variant"} + } // model: UM.MachineVariantsModel { id: variantsModel } MenuItem { @@ -152,14 +156,14 @@ Item exclusiveGroup: variantSelectionMenuGroup; onTriggered: { - UM.MachineManager.setActiveMachineVariant(variantsModel.getItem(index).name); - if (typeof(model) !== "undefined" && !model.active) { + 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) From f3384b043db92bf38d31eb9755c3b527123e6fe0 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 13 May 2016 11:26:08 +0200 Subject: [PATCH 059/224] Only variants of active machine are now shown CURA-1278 --- cura/MachineManagerModel.py | 4 ++++ resources/qml/SidebarHeader.qml | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index c7cd4a6758..53fcd1662e 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -105,6 +105,10 @@ class MachineManagerModel(QObject): if containers: containers[0].setName(new_name) + @pyqtProperty(str, notify=globalContainerChanged) + def activeMachineDefinitionId(self): + return Application.getInstance().getGlobalContainerStack().getContainers()[-1].getId() + @pyqtSlot(str) def removeMachine(self, machine_id): ContainerRegistry.getInstance().removeContainer(machine_id) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index e4c8e8bb02..258ca8221c 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -145,9 +145,12 @@ Item id: variantSelectionInstantiator model: UM.InstanceContainersModel { - filter: {"type": "variant"} + filter: + { + "type": "variant", + "definition": Cura.MachineManager.activeMachineDefinitionId //Only show variants of this machine + } } -// model: UM.MachineVariantsModel { id: variantsModel } MenuItem { text: model.name; From 6ffde62bcf8f7fcecacbd9a7ce3e7591096ddf91 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 13 May 2016 11:40:18 +0200 Subject: [PATCH 060/224] Added stubs for hasVariants & hasMaterials CURA-1278 --- cura/MachineManagerModel.py | 11 +++++++++++ resources/qml/SidebarHeader.qml | 13 +++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 53fcd1662e..28ae06e26b 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -113,6 +113,17 @@ class MachineManagerModel(QObject): def removeMachine(self, machine_id): ContainerRegistry.getInstance().removeContainer(machine_id) + @pyqtProperty(bool) + def hasMaterials(self): + # Todo: Still hardcoded. + # We should implement this properly when it's clear how a machine notifies us if it can handle materials + return True + + @pyqtProperty(bool) + def hasVariants(self): + # Todo: Still hardcoded. + # We should implement this properly when it's clear how a machine notifies us if it can handle variants + return True def createMachineManagerModel(engine, script_engine): diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 258ca8221c..fcf05a49ca 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -104,12 +104,12 @@ Item anchors.topMargin: visible ? UM.Theme.getSize("default_margin").height : 0 width: base.width height: visible ? UM.Theme.getSize("sidebar_setup").height : 0 - visible: UM.MachineManager.hasVariants || UM.MachineManager.hasMaterials + visible: Cura.MachineManager.hasVariants || Cura.MachineManager.hasMaterials Label{ id: variantLabel - text: (UM.MachineManager.hasVariants && UM.MachineManager.hasMaterials) ? catalog.i18nc("@label","Nozzle & Material:"): - UM.MachineManager.hasVariants ? catalog.i18nc("@label","Nozzle:") : catalog.i18nc("@label","Material:"); + 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 @@ -118,7 +118,8 @@ Item color: UM.Theme.getColor("text"); } - Rectangle { + Rectangle + { anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter @@ -130,7 +131,7 @@ Item id: variantSelection text: Cura.MachineManager.activeVariantName tooltip: Cura.MachineManager.activeVariantName; - visible: UM.MachineManager.hasVariants + visible: Cura.MachineManager.hasVariants height: UM.Theme.getSize("setting_control").height width: materialSelection.visible ? (parent.width - UM.Theme.getSize("default_margin").width) / 2 : parent.width @@ -181,7 +182,7 @@ Item id: materialSelection text: Cura.MachineManager.activeMaterialName tooltip: Cura.MachineManager.activeMaterialName - visible: UM.MachineManager.hasMaterials + visible: Cura.MachineManager.hasMaterials height: UM.Theme.getSize("setting_control").height width: variantSelection.visible ? (parent.width - UM.Theme.getSize("default_margin").width) / 2 : parent.width From 5dbe0bdc0379950eb4066afbbf5fdc8864bca2d5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 13 May 2016 11:46:54 +0200 Subject: [PATCH 061/224] Machine variants can now be selected from dropdown menu CURA-1278 --- resources/qml/Cura.qml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 4314dc21e6..250dcf050e 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -193,13 +193,20 @@ UM.MainWindow Instantiator { -// model: UM.MachineVariantsModel { } + model: UM.InstanceContainersModel + { + filter: + { + "type": "variant", + "definition": Cura.MachineManager.activeMachineDefinitionId //Only show variants of this machine + } + } MenuItem { text: model.name; checkable: true; checked: model.active; exclusiveGroup: machineVariantsGroup; - onTriggered: UM.MachineManager.setActiveMachineVariant(model.name) + onTriggered: Cura.MachineManager.setActiveVariant(model.id) } onObjectAdded: machineMenu.insertItem(index, object) onObjectRemoved: machineMenu.removeItem(object) @@ -207,7 +214,7 @@ UM.MainWindow ExclusiveGroup { id: machineVariantsGroup; } -// MenuSeparator { visible: UM.MachineManager.hasVariants; } + MenuSeparator { visible: Cura.MachineManager.hasVariants; } MenuItem { action: Actions.addMachine; } MenuItem { action: Actions.configureMachines; } From dd24e488a834bc29ab5f096721b2698e3cfd29a3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 13 May 2016 12:04:38 +0200 Subject: [PATCH 062/224] Materials & variants are now correctly checked when active CURA-1278 --- cura/MachineManagerModel.py | 13 +++++++++++++ resources/qml/Cura.qml | 2 +- resources/qml/SidebarHeader.qml | 6 ++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 28ae06e26b..2ff80efc3d 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -77,6 +77,12 @@ class MachineManagerModel(QObject): if material: return material.getName() + @pyqtProperty(str, notify=activeMaterialChanged) + def activeMaterialId(self): + material = Application.getInstance().getGlobalContainerStack().findContainer({"type": "material"}) + if material: + return material.getId() + @pyqtSlot(str) def setActiveMaterial(self, material_id): containers = ContainerRegistry.getInstance().findInstanceContainers(id=material_id) @@ -99,6 +105,13 @@ class MachineManagerModel(QObject): if variant: return variant.getName() + @pyqtProperty(str, notify = activeVariantChanged) + def activeVariantId(self): + variant = Application.getInstance().getGlobalContainerStack().findContainer({"type": "variant"}) + if variant: + return variant.getId() + + @pyqtSlot(str, str) def renameMachine(self, machine_id, new_name): containers = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 250dcf050e..2d1fbe3305 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -204,7 +204,7 @@ UM.MainWindow MenuItem { text: model.name; checkable: true; - checked: model.active; + checked: model.id == Cura.MachineManager.activeVariantId; exclusiveGroup: machineVariantsGroup; onTriggered: Cura.MachineManager.setActiveVariant(model.id) } diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index fcf05a49ca..ff6db0703b 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -156,7 +156,7 @@ Item { text: model.name; checkable: true; - checked: model.active; + checked: model.id == Cura.MachineManager.activeVariantId; exclusiveGroup: variantSelectionMenuGroup; onTriggered: { @@ -199,13 +199,11 @@ Item { filter: {"type": "material"} } - //model: UM.InstancesModel {filter: {"type":"material"}} -// model: UM.MachineMaterialsModel { id: machineMaterialsModel } MenuItem { text: model.name; checkable: true; - checked: model.active; + checked: model.id == Cura.MachineManager.activeMaterialId; exclusiveGroup: materialSelectionMenuGroup; onTriggered: { From ed498317855ca758faf1272749ade6a33a9ee62e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 13 May 2016 15:24:49 +0200 Subject: [PATCH 063/224] Last active machine is now restored upon restart CURA-1278 --- cura/CuraApplication.py | 1 - cura/MachineManagerModel.py | 12 ++++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 8c6681de8c..e161a242e0 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -110,7 +110,6 @@ class CuraApplication(QtApplication): Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") - Preferences.getInstance().addPreference("cura/active_machine", "") Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 2ff80efc3d..dc330ac3bc 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -5,6 +5,8 @@ from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.ContainerStack import ContainerStack from UM.Settings.InstanceContainer import InstanceContainer +from UM.Preferences import Preferences + class MachineManagerModel(QObject): def __init__(self, parent = None): super().__init__(parent) @@ -14,11 +16,21 @@ class MachineManagerModel(QObject): self.globalContainerChanged.connect(self.activeMaterialChanged) self.globalContainerChanged.connect(self.activeVariantChanged) + Preferences.getInstance().addPreference("cura/active_machine", "") + + active_machine_id = Preferences.getInstance().getValue("cura/active_machine") + if active_machine_id != "": + # An active machine was saved, so restore it. + self.setActiveMachine(active_machine_id) + pass + + globalContainerChanged = pyqtSignal() activeMaterialChanged = pyqtSignal() activeVariantChanged = pyqtSignal() def _onGlobalContainerChanged(self): + Preferences.getInstance().setValue("cura/active_machine", Application.getInstance().getGlobalContainerStack().getId()) Application.getInstance().getGlobalContainerStack().containersChanged.connect(self._onInstanceContainersChanged) self.globalContainerChanged.emit() From bfbb48268a19461992db642a02fba1a348fd45fa Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 13 May 2016 15:48:56 +0200 Subject: [PATCH 064/224] Added material stubs CURA-1278 --- resources/instances/abs.inst.cfg | 12 ++++++++++++ resources/instances/cpe.inst.cfg | 11 +++++++++++ resources/instances/pla.inst.cfg | 10 ++++++++++ 3 files changed, 33 insertions(+) create mode 100644 resources/instances/abs.inst.cfg create mode 100644 resources/instances/cpe.inst.cfg create mode 100644 resources/instances/pla.inst.cfg diff --git a/resources/instances/abs.inst.cfg b/resources/instances/abs.inst.cfg new file mode 100644 index 0000000000..0d64e81437 --- /dev/null +++ b/resources/instances/abs.inst.cfg @@ -0,0 +1,12 @@ +[general] +version = 2 +name = ABS +definition = fdmprinter + +[metadata] +type = material + +[values] +material_print_temperature = 250 +material_bed_temperature = 80 +material_flow = 107 diff --git a/resources/instances/cpe.inst.cfg b/resources/instances/cpe.inst.cfg new file mode 100644 index 0000000000..ca30cba046 --- /dev/null +++ b/resources/instances/cpe.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = CPE +definition = fdmprinter + +[metadata] +type = material + +[values] +material_print_temperature = 250 +material_bed_temperature = 70 \ No newline at end of file diff --git a/resources/instances/pla.inst.cfg b/resources/instances/pla.inst.cfg new file mode 100644 index 0000000000..dfa9c62469 --- /dev/null +++ b/resources/instances/pla.inst.cfg @@ -0,0 +1,10 @@ +[general] +version = 2 +name = PLA +definition = fdmprinter + +[metadata] +type = material + +[values] +material_bed_temperature = 60 From ad7531ededf08985f132d14b65b6076601a546cc Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 13 May 2016 15:56:41 +0200 Subject: [PATCH 065/224] Added quality instances stubs CURA_1278 --- resources/instances/high_quality.inst.cfg | 9 +++++++++ resources/instances/normal_quality.inst.cfg | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 resources/instances/high_quality.inst.cfg create mode 100644 resources/instances/normal_quality.inst.cfg diff --git a/resources/instances/high_quality.inst.cfg b/resources/instances/high_quality.inst.cfg new file mode 100644 index 0000000000..2e860cf380 --- /dev/null +++ b/resources/instances/high_quality.inst.cfg @@ -0,0 +1,9 @@ +[general] +version = 2 +name = high +definition = fdmprinter + +[metadata] +type = quality + +[values] diff --git a/resources/instances/normal_quality.inst.cfg b/resources/instances/normal_quality.inst.cfg new file mode 100644 index 0000000000..6bb23d841c --- /dev/null +++ b/resources/instances/normal_quality.inst.cfg @@ -0,0 +1,9 @@ +[general] +version = 2 +name = normal +definition = fdmprinter + +[metadata] +type = quality + +[values] From adc699c63be3f3ce312d19a40a398382c11288b2 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 12 May 2016 01:41:29 +0200 Subject: [PATCH 066/224] Add a SettingPropertyProvider object to the setting items --- resources/qml/Settings/SettingView.qml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 66ff30fa11..946d995f2a 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -37,6 +37,7 @@ ScrollView property var definition: model property var settingDefinitionsModel: definitionsModel + property var propertyProvider: provider asynchronous: true @@ -61,6 +62,18 @@ ScrollView } } + UM.SettingPropertyProvider + { + id: provider + + containerStackId: "" + + key: model.key + + watchedProperties: [ "value", "enabled", "state", "validationState" ] + + } + Connections { target: item From 08afad8973af1bed559f2040d6444e41840fc44f Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 16 May 2016 17:46:22 +0200 Subject: [PATCH 067/224] Remove get/setSettingValue from CuraApplication They are unused and should not be used anyway --- cura/CuraApplication.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e161a242e0..e0d086e954 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -511,20 +511,6 @@ class CuraApplication(QtApplication): def expandedCategories(self): return Preferences.getInstance().getValue("cura/categories_expanded").split(";") - @pyqtSlot(str, result = "QVariant") - def getSettingValue(self, key): - if not self._global_container_stack: - return None - return self._global_container_stack.getValue(key) - - ## Change setting by key value pair - @pyqtSlot(str, "QVariant") - def setSettingValue(self, key, value): - if not self.getMachineManager().getWorkingProfile(): - return - - self.getMachineManager().getWorkingProfile().setSettingValue(key, value) - @pyqtSlot() def mergeSelected(self): self.groupSelected() From efdf1d78d1e0930bc50738ac75a874442c4b4b4c Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 16 May 2016 18:11:51 +0200 Subject: [PATCH 068/224] Add a "Current Settings" instance container to the stack on stack creation --- cura/MachineManagerModel.py | 43 ++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index dc330ac3bc..dcdae87dbf 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -1,12 +1,10 @@ from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from UM.Application import Application -from UM.Settings.ContainerRegistry import ContainerRegistry -from UM.Settings.ContainerStack import ContainerStack -from UM.Settings.InstanceContainer import InstanceContainer - from UM.Preferences import Preferences +import UM.Settings + class MachineManagerModel(QObject): def __init__(self, parent = None): super().__init__(parent) @@ -43,36 +41,42 @@ class MachineManagerModel(QObject): @pyqtSlot(str) def setActiveMachine(self, stack_id): - containers = ContainerRegistry.getInstance().findContainerStacks(id = stack_id) + containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = stack_id) if containers: Application.getInstance().setGlobalContainerStack(containers[0]) @pyqtSlot(str, str) def addMachine(self,name, definition_id): - definitions = ContainerRegistry.getInstance().findDefinitionContainers(id=definition_id) + definitions = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id=definition_id) if definitions: - new_global_stack = ContainerStack(name) + new_global_stack = UM.Settings.ContainerStack(name) new_global_stack.addMetaDataEntry("type", "machine") - ContainerRegistry.getInstance().addContainer(new_global_stack) + UM.Settings.ContainerRegistry.getInstance().addContainer(new_global_stack) ## DEBUG CODE - material_instance_container = InstanceContainer("test_material") + material_instance_container = UM.Settings.InstanceContainer("test_material") material_instance_container.addMetaDataEntry("type", "material") material_instance_container.setDefinition(definitions[0]) - variant_instance_container = InstanceContainer("test_variant") + variant_instance_container = UM.Settings.InstanceContainer("test_variant") variant_instance_container.addMetaDataEntry("type", "variant") variant_instance_container.setDefinition(definitions[0]) - quality_instance_container = InstanceContainer(name + "_quality") - current_settings_instance_container = InstanceContainer(name + "_current_settings") - ContainerRegistry.getInstance().addContainer(material_instance_container) - ContainerRegistry.getInstance().addContainer(variant_instance_container) + quality_instance_container = UM.Settings.InstanceContainer(name + "_quality") + UM.Settings.ContainerRegistry.getInstance().addContainer(material_instance_container) + UM.Settings.ContainerRegistry.getInstance().addContainer(variant_instance_container) + + current_settings_instance_container = UM.Settings.InstanceContainer(name + "_current_settings") + current_settings_instance_container.addMetaDataEntry("machine", name) + current_settings_instance_container.setDefinition(definitions[0]) + UM.Settings.ContainerRegistry.getInstance().addContainer(current_settings_instance_container) # If a definition is found, its a list. Should only have one item. new_global_stack.addContainer(definitions[0]) new_global_stack.addContainer(material_instance_container) new_global_stack.addContainer(variant_instance_container) + new_global_stack.addContainer(current_settings_instance_container) + Application.getInstance().setGlobalContainerStack(new_global_stack) @pyqtProperty(str, notify = globalContainerChanged) @@ -97,7 +101,7 @@ class MachineManagerModel(QObject): @pyqtSlot(str) def setActiveMaterial(self, material_id): - containers = ContainerRegistry.getInstance().findInstanceContainers(id=material_id) + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=material_id) old_material = Application.getInstance().getGlobalContainerStack().findContainer({"type":"material"}) if old_material: material_index = Application.getInstance().getGlobalContainerStack().getContainerIndex(old_material) @@ -105,7 +109,7 @@ class MachineManagerModel(QObject): @pyqtSlot(str) def setActiveVariant(self, variant_id): - containers = ContainerRegistry.getInstance().findInstanceContainers(id=variant_id) + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=variant_id) old_variant = Application.getInstance().getGlobalContainerStack().findContainer({"type": "variant"}) if old_variant: variant_index = Application.getInstance().getGlobalContainerStack().getContainerIndex(old_variant) @@ -126,7 +130,7 @@ class MachineManagerModel(QObject): @pyqtSlot(str, str) def renameMachine(self, machine_id, new_name): - containers = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) + containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = machine_id) if containers: containers[0].setName(new_name) @@ -136,7 +140,7 @@ class MachineManagerModel(QObject): @pyqtSlot(str) def removeMachine(self, machine_id): - ContainerRegistry.getInstance().removeContainer(machine_id) + UM.Settings.ContainerRegistry.getInstance().removeContainer(machine_id) @pyqtProperty(bool) def hasMaterials(self): @@ -150,6 +154,5 @@ class MachineManagerModel(QObject): # We should implement this properly when it's clear how a machine notifies us if it can handle variants return True - def createMachineManagerModel(engine, script_engine): - return MachineManagerModel() \ No newline at end of file + return MachineManagerModel() From 5ff5ed385654f88ebf9840e85d41085d070e2b04 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 16 May 2016 18:12:10 +0200 Subject: [PATCH 069/224] Add an "activeDefinitionId" property to MachineManager --- cura/MachineManagerModel.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index dcdae87dbf..040625a159 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -127,6 +127,9 @@ class MachineManagerModel(QObject): if variant: return variant.getId() + @pyqtProperty(str, notify = globalContainerChanged) + def activeDefinitionId(self): + return Application.getInstance().getGlobalContainerStack().getBottom().id @pyqtSlot(str, str) def renameMachine(self, machine_id, new_name): From 442d2b6e718ac75f2703bacb8031673d21c9f429 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 16 May 2016 18:12:28 +0200 Subject: [PATCH 070/224] Use the right tooltip for SettingCategory --- resources/qml/Settings/SettingCategory.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml index 871b5c0036..56a20aec3b 100644 --- a/resources/qml/Settings/SettingCategory.qml +++ b/resources/qml/Settings/SettingCategory.qml @@ -51,7 +51,6 @@ Button { UM.SimpleButton { - // This button shows when the setting has an inherited function, but is overriden by profile. id: inheritButton; anchors.verticalCenter: parent.verticalCenter @@ -71,7 +70,7 @@ Button { iconSource: UM.Theme.getIcon("notice") onEntered: { - base.showTooltip(catalog.i18nc("@label", "This setting is normally calculated, but it currently has an absolute value set.\n\nClick to restore the calculated value.")) + base.showTooltip(catalog.i18nc("@label","Some hidden settings use values different from their normal calculated value.\n\nClick to make these settings visible.")) } onExited: { From b1df8e9448ce00f5c63e14468a6e08ff071a2c70 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 16 May 2016 18:13:20 +0200 Subject: [PATCH 071/224] Use MachineManager and PropertyProvider to restore several bits of behavioiur --- resources/qml/Settings/SettingView.qml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 946d995f2a..6b09c8b9a3 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -7,6 +7,7 @@ import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 import UM 1.2 as UM +import Cura 1.0 as Cura import ".." @@ -26,14 +27,18 @@ ScrollView id: contents spacing: UM.Theme.getSize("default_lining").height; - model: UM.SettingDefinitionsModel { id: definitionsModel; containerId: "fdmprinter" } + model: UM.SettingDefinitionsModel { id: definitionsModel; containerId: Cura.MachineManager.activeDefinitionId } delegate: Loader { id: delegate width: UM.Theme.getSize("sidebar").width; - height: UM.Theme.getSize("section").height; + height: provider.properties.enabled ? UM.Theme.getSize("section").height : 0 + Behavior on height { NumberAnimation { duration: 100 } } + opacity: provider.properties.enabled ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 100 } } + enabled: provider.properties.enabled property var definition: model property var settingDefinitionsModel: definitionsModel @@ -66,12 +71,10 @@ ScrollView { id: provider - containerStackId: "" - + containerStackId: Cura.MachineManager.activeMachineId key: model.key - watchedProperties: [ "value", "enabled", "state", "validationState" ] - + storeIndex: 0 } Connections From e4fe1c6e210ff0be5902c701e874322bd51eed24 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 16 May 2016 18:13:46 +0200 Subject: [PATCH 072/224] Add PropertyProviders to SidebarSimple and use them for property values --- resources/qml/SidebarSimple.qml | 53 +++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 0e877ab09b..9c68c2ef81 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -6,7 +6,8 @@ import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 -import UM 1.1 as UM +import UM 1.2 as UM +import Cura 1.0 as Cura Item { @@ -56,12 +57,7 @@ Item Repeater { id: infillListView property int activeIndex: { - if(!UM.ActiveProfile.valid) - { - return -1; - } - -// var density = parseInt(UM.ActiveProfile.settingValues.getValue("infill_sparse_density")); + var density = parseInt(infillDensity.properties.value) for(var i = 0; i < infillModel.count; ++i) { if(density > infillModel.get(i).percentageMin && density <= infillModel.get(i).percentageMax ) @@ -116,7 +112,7 @@ Item onClicked: { if (infillListView.activeIndex != index) { -// UM.MachineManager.setSettingValue("infill_sparse_density", model.percentage) + infillDensity.setPropertyValue("value", model.percentage) } } onEntered: { @@ -213,13 +209,14 @@ Item text: catalog.i18nc("@option:check","Generate Brim"); style: UM.Theme.styles.checkbox; -// checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("adhesion_type") == "brim" : false; + checked: platformAdhesionType.properties.value == "brim" + MouseArea { anchors.fill: parent hoverEnabled: true onClicked: { -// UM.MachineManager.setSettingValue("adhesion_type", !parent.checked?"brim":"skirt") + platformAdhesionType.setPropertyValue("value", !parent.checked ? "brim" : "skirt") } onEntered: { @@ -246,13 +243,13 @@ Item text: catalog.i18nc("@option:check","Generate Support Structure"); style: UM.Theme.styles.checkbox; -// checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("support_enable") : false; + checked: supportEnabled.properties.value == "True" MouseArea { anchors.fill: parent hoverEnabled: true onClicked: { -// UM.MachineManager.setSettingValue("support_enable", !parent.checked) + supportEnabled.setPropertyValue("value", !parent.checked) } onEntered: { @@ -371,4 +368,36 @@ Item onLinkActivated: Qt.openUrlExternally(link) } } + + UM.SettingPropertyProvider + { + id: infillDensity + + containerStackId: Cura.MachineManager.activeMachineId + key: "infill_sparse_density" + watchedProperties: [ "value" ] + storeIndex: 0 + + onPropertiesChanged: console.log(properties.value) + } + + UM.SettingPropertyProvider + { + id: platformAdhesionType + + containerStackId: Cura.MachineManager.activeMachineId + key: "adhesion_type" + watchedProperties: [ "value" ] + storeIndex: 0 + } + + UM.SettingPropertyProvider + { + id: supportEnabled + + containerStackId: Cura.MachineManager.activeMachineId + key: "support_enable" + watchedProperties: [ "value" ] + storeIndex: 0 + } } From 5b31634d3ca4010c9712c54aca34448346d51f1d Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 16 May 2016 18:14:21 +0200 Subject: [PATCH 073/224] Make SettingTextField work --- resources/qml/Settings/SettingTextField.qml | 54 +++++++++++---------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 1b28ebadcc..3cbd21387b 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -31,19 +31,19 @@ SettingItem { return UM.Theme.getColor("setting_control_disabled") } - switch(definition.validationState) + switch(propertyProvider.properties.validationState) { - case 0: + case "ValidatorState.Exception": return UM.Theme.getColor("setting_validation_error") - case 1: + case "ValidatorState.MinimumError": return UM.Theme.getColor("setting_validation_error") - case 2: + case "ValidatorState.MaximumError": return UM.Theme.getColor("setting_validation_error") - case 3: + case "ValidatorState.MinimumWarning": return UM.Theme.getColor("setting_validation_warning") - case 4: + case "ValidatorState.MaximumWarning": return UM.Theme.getColor("setting_validation_warning") - case 5: + case "ValidatorState.Valid": return UM.Theme.getColor("setting_validation_ok") default: @@ -56,8 +56,7 @@ SettingItem anchors.fill: parent; anchors.margins: UM.Theme.getSize("default_lining").width; color: UM.Theme.getColor("setting_control_highlight") - opacity: 0.35 -// opacity: !control.hovered ? 0 : valid == 5 ? 1.0 : 0.35; + opacity: !control.hovered ? 0 : propertyProvider.properties.validationState == "ValidatorState.Valid" ? 1.0 : 0.35; } Label @@ -93,19 +92,22 @@ SettingItem Keys.onReleased: { - text = text.replace(",", ".") // User convenience. We use dots for decimal values - if(parseFloat(text) != base.parentValue) - { - base.valueChanged(parseFloat(text)); - } +// text = text.replace(",", ".") // User convenience. We use dots for decimal values +// if(parseFloat(text) != base.parentValue) +// { +// base.valueChanged(parseFloat(text)); +// } + + propertyProvider.setPropertyValue("value", text) } onEditingFinished: { - if(parseFloat(text) != base.parentValue) - { - base.valueChanged(parseFloat(text)); - } +// if(parseFloat(text) != base.parentValue) +// { +// base.valueChanged(parseFloat(text)); +// } + propertyProvider.setPropertyValue("value", text) } color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") @@ -117,13 +119,13 @@ SettingItem validator: RegExpValidator { regExp: /[0-9.,-]{0,10}/ } -// Binding -// { -// target: input -// property: "text" -// value: format(base.parentValue) -// when: !input.activeFocus -// } + Binding + { + target: input + property: "text" + value: control.format(propertyProvider.properties.value) + when: !input.activeFocus + } } //Rounds a floating point number to 4 decimals. This prevents floating @@ -147,7 +149,7 @@ SettingItem //input: The string value to format. //return: The formatted string. function format(inputValue) { - return parseFloat(inputValue) ? roundFloat(parseFloat(inputValue), 4) : inputValue //If it's a float, round to four decimals. + return parseFloat(inputValue) ? roundFloat(parseFloat(inputValue), 4) : inputValue //If it's a float, round to four decimals. } } } From 06432c3b0b8a12238c6a79fd1e5535dbb51791ac Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 16 May 2016 18:14:39 +0200 Subject: [PATCH 074/224] Make SettingCheckBox properly handle the value --- resources/qml/Settings/SettingCheckBox.qml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml index 0acacb95fb..6f0314160e 100644 --- a/resources/qml/Settings/SettingCheckBox.qml +++ b/resources/qml/Settings/SettingCheckBox.qml @@ -19,20 +19,19 @@ SettingItem property bool checked: { - if(value == "True") + switch(propertyProvider.properties.value) { - return true; - } - else if(value == "False") - { - return false; - } - else - { - return value; + case "True": + return true + case "False": + return false + default: + return propertyProvider.properties.value } } + onClicked: propertyProvider.setPropertyValue("value", !checked) + Rectangle { anchors From f5e97c50012e9ff55f3360fec8c0a72b3348a998 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 16 May 2016 18:15:14 +0200 Subject: [PATCH 075/224] Make SettingComboBox work (mostly) properly = --- resources/qml/Settings/SettingComboBox.qml | 27 +++++++++------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index 0f332b2aee..c9f3cb727b 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -13,6 +13,8 @@ SettingItem contents: ComboBox { + id: control + model: definition.options textRole: "value"; @@ -83,32 +85,25 @@ SettingItem } } } -/* - onActivated: { - valueChanged(options.getItem(index).value); - } - onModelChanged: { - updateCurrentIndex(); - } + onActivated: provider.setPropertyValue("value", definition.options[index].key) + onModelChanged: updateCurrentIndex(); - Component.onCompleted: { - parent.parent.valueChanged.connect(updateCurrentIndex) + Connections + { + target: provider + onPropertiesChanged: control.updateCurrentIndex() } function updateCurrentIndex() { - if (!options) { - return; - } - - for(var i = 0; i < options.rowCount(); ++i) { - if(options.getItem(i).value == value) { + for(var i = 0; i < definition.options.length; ++i) { + if(definition.options[i].key == provider.properties.value) { currentIndex = i; return; } } currentIndex = -1; - }*/ + } } } From 3531e4c3e8671fb959fd677912b62b98075711ee Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 16 May 2016 18:16:08 +0200 Subject: [PATCH 076/224] Nest all controls inside the mousearea of SettingItem This makes hover events work properly without all the hassle --- resources/qml/Settings/SettingItem.qml | 169 +++++++++++-------------- 1 file changed, 77 insertions(+), 92 deletions(-) diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index d11b0b300a..ebbf93af84 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -16,7 +16,7 @@ Item { height: UM.Theme.getSize("section").height; property alias contents: controlContainer.children; - property bool hovered: false + property alias hovered: mouse.containsMouse signal contextMenuRequested() signal showTooltip(string text); @@ -52,118 +52,103 @@ Item { onTriggered: base.showTooltip(definition.description); } - } - Label - { - id: label; + Label + { + id: label; - anchors.left: parent.left; - anchors.leftMargin: (UM.Theme.getSize("section_icon_column").width + 5) + ((definition.depth - 1) * UM.Theme.getSize("setting_control_depth_margin").width) - anchors.right: settingControls.left; - anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left; + anchors.leftMargin: (UM.Theme.getSize("section_icon_column").width + 5) + ((definition.depth - 1) * UM.Theme.getSize("setting_control_depth_margin").width) + anchors.right: settingControls.left; + anchors.verticalCenter: parent.verticalCenter - height: UM.Theme.getSize("section").height; - verticalAlignment: Text.AlignVCenter; + height: UM.Theme.getSize("section").height; + verticalAlignment: Text.AlignVCenter; - text: definition.label - elide: Text.ElideMiddle; + text: definition.label + elide: Text.ElideMiddle; - color: UM.Theme.getColor("setting_control_text"); - font: UM.Theme.getFont("default"); - } - - Row - { - id: settingControls - - height: parent.height / 2 - spacing: UM.Theme.getSize("default_margin").width / 2 - - anchors { - right: controlContainer.left - rightMargin: UM.Theme.getSize("default_margin").width / 2 - verticalCenter: parent.verticalCenter + color: UM.Theme.getColor("setting_control_text"); + font: UM.Theme.getFont("default"); } - UM.SimpleButton + Row { - id: revertButton; + id: settingControls -// visible: base.overridden && base.is_enabled + height: parent.height / 2 + spacing: UM.Theme.getSize("default_margin").width / 2 - height: parent.height; - width: height; - - backgroundColor: UM.Theme.getColor("setting_control"); - hoverBackgroundColor: UM.Theme.getColor("setting_control_highlight") - color: UM.Theme.getColor("setting_control_button") - hoverColor: UM.Theme.getColor("setting_control_button_hover") - - iconSource: UM.Theme.getIcon("reset") - - onClicked: { - base.resetRequested() - controlContainer.notifyReset(); + anchors { + right: controlContainer.left + rightMargin: UM.Theme.getSize("default_margin").width / 2 + verticalCenter: parent.verticalCenter } - onEntered: base.showTooltip(catalog.i18nc("@label", "This setting has a value that is different from the profile.\n\nClick to restore the value of the profile.")) - onExited: + UM.SimpleButton { - if(controlContainer.item && controlContainer.item.hovered) - { - return; + id: revertButton; + + visible: propertyProvider.properties.state == "InstanceState.User" + + height: parent.height; + width: height; + + backgroundColor: UM.Theme.getColor("setting_control"); + hoverBackgroundColor: UM.Theme.getColor("setting_control_highlight") + color: UM.Theme.getColor("setting_control_button") + hoverColor: UM.Theme.getColor("setting_control_button_hover") + + iconSource: UM.Theme.getIcon("reset") + + onClicked: { + base.resetRequested() + controlContainer.notifyReset(); } - base.hovered = false; - base.hideTooltip(); + onEntered: base.showTooltip(catalog.i18nc("@label", "This setting has a value that is different from the profile.\n\nClick to restore the value of the profile.")) + onExited: base.showTooltip(definition.description); } + + UM.SimpleButton + { + // This button shows when the setting has an inherited function, but is overriden by profile. + id: inheritButton; + + //visible: has_profile_value && base.has_inherit_function && base.is_enabled + visible: propertyProvider.properties.state == "InstanceState.User" + + height: parent.height; + width: height; + + onClicked: { + base.resetToDefaultRequested(); + controlContainer.notifyReset(); + } + + backgroundColor: UM.Theme.getColor("setting_control"); + hoverBackgroundColor: UM.Theme.getColor("setting_control_highlight") + color: UM.Theme.getColor("setting_control_button") + hoverColor: UM.Theme.getColor("setting_control_button_hover") + + iconSource: UM.Theme.getIcon("notice"); + + onEntered: base.showTooltip(catalog.i18nc("@label", "This setting is normally calculated, but it currently has an absolute value set.\n\nClick to restore the calculated value.")) + onExited: base.showTooltip(definition.description); + } + } - UM.SimpleButton + Item { - // This button shows when the setting has an inherited function, but is overriden by profile. - id: inheritButton; + id: controlContainer; -// visible: has_profile_value && base.has_inherit_function && base.is_enabled - height: parent.height; - width: height; - - onClicked: { - base.resetToDefaultRequested(); - controlContainer.notifyReset(); - } - - backgroundColor: UM.Theme.getColor("setting_control"); - hoverBackgroundColor: UM.Theme.getColor("setting_control_highlight") - color: UM.Theme.getColor("setting_control_button") - hoverColor: UM.Theme.getColor("setting_control_button_hover") - - iconSource: UM.Theme.getIcon("notice"); - - onEntered: base.showTooltip(catalog.i18nc("@label", "This setting is normally calculated, but it currently has an absolute value set.\n\nClick to restore the calculated value.")) - - onExited: { - if(controlContainer.item && controlContainer.item.hovered) { - return; - } - - base.hovered = false; - base.hideTooltip(); - } + anchors.right: parent.right; + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter; + width: UM.Theme.getSize("setting_control").width; + height: UM.Theme.getSize("setting_control").height } - - } - - Item - { - id: controlContainer; - - anchors.right: parent.right; - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: parent.verticalCenter; - width: UM.Theme.getSize("setting_control").width; - height: UM.Theme.getSize("setting_control").height } UM.I18nCatalog { id: catalog; name: "cura" } From d1d2e1cea7f0e5f79dfa1bcea7d68a957fa7b289 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 16 May 2016 18:16:28 +0200 Subject: [PATCH 077/224] Set the right defaults for setting visibility in Cura --- cura/CuraApplication.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e0d086e954..5620d039c9 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -117,6 +117,39 @@ class CuraApplication(QtApplication): Preferences.getInstance().addPreference("mesh/scale_to_fit", True) Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode") + Preferences.getInstance().setDefault("general/visible_settings", """ + resolution + layer_height + shell + wall_thickness + top_bottom_thickness + infill + infill_sparse_density + material + material_print_temperature + material_bed_temperature + material_diameter + material_flow + retraction_enable + speed + speed_print + speed_travel + cooling + cool_fan_enabled + support + support_enable + support_type + support_roof_density + platform_adhesion + adhesion_type + brim_width + raft_airgap + layer_0_z_overlap + raft_surface_layers + blackmagic + print_sequence + """) + JobQueue.getInstance().jobFinished.connect(self._onJobFinished) self._recent_files = [] From 9bfe31aeef8b3646ba04050486ebe4141890da05 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 17 May 2016 10:39:10 +0200 Subject: [PATCH 078/224] Added quality type to setting stack CURA-1278 --- cura/MachineManagerModel.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 040625a159..08393ac829 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -13,10 +13,12 @@ class MachineManagerModel(QObject): ## When the global container is changed, active material probably needs to be updated. self.globalContainerChanged.connect(self.activeMaterialChanged) self.globalContainerChanged.connect(self.activeVariantChanged) + self.globalContainerChanged.connect(self.activeQualityChanged) Preferences.getInstance().addPreference("cura/active_machine", "") active_machine_id = Preferences.getInstance().getValue("cura/active_machine") + if active_machine_id != "": # An active machine was saved, so restore it. self.setActiveMachine(active_machine_id) @@ -26,6 +28,7 @@ class MachineManagerModel(QObject): globalContainerChanged = pyqtSignal() activeMaterialChanged = pyqtSignal() activeVariantChanged = pyqtSignal() + activeQualityChanged = pyqtSignal() def _onGlobalContainerChanged(self): Preferences.getInstance().setValue("cura/active_machine", Application.getInstance().getGlobalContainerStack().getId()) @@ -38,6 +41,8 @@ class MachineManagerModel(QObject): self.activeMaterialChanged.emit() elif container_type == "variant": self.activeVariantChanged.emit() + elif container_type == "quality": + self.activeQualityChanged.emit() @pyqtSlot(str) def setActiveMachine(self, stack_id): @@ -99,6 +104,18 @@ class MachineManagerModel(QObject): if material: return material.getId() + @pyqtProperty(str, notify=activeQualityChanged) + def activeQualityName(self): + quality = Application.getInstance().getGlobalContainerStack().findContainer({"type": "quality"}) + if quality: + return quality.getName() + + @pyqtProperty(str, notify=activeQualityChanged) + def activeQualityId(self): + quality = Application.getInstance().getGlobalContainerStack().findContainer({"type": "quality"}) + if quality: + return quality.getId() + @pyqtSlot(str) def setActiveMaterial(self, material_id): containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=material_id) From 59ec593db5632234de15876d662ab17aced33533 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 17 May 2016 10:49:06 +0200 Subject: [PATCH 079/224] Added way to change active quality CURA-1278 --- cura/MachineManagerModel.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 08393ac829..0109f5d261 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -70,6 +70,9 @@ class MachineManagerModel(QObject): quality_instance_container = UM.Settings.InstanceContainer(name + "_quality") UM.Settings.ContainerRegistry.getInstance().addContainer(material_instance_container) UM.Settings.ContainerRegistry.getInstance().addContainer(variant_instance_container) + UM.Settings.ContainerRegistry.getInstance().addContainer(quality_instance_container) + quality_instance_container.addMetaDataEntry("type", "quality") + quality_instance_container.setDefinition(definitions[0]) current_settings_instance_container = UM.Settings.InstanceContainer(name + "_current_settings") current_settings_instance_container.addMetaDataEntry("machine", name) @@ -80,6 +83,7 @@ class MachineManagerModel(QObject): new_global_stack.addContainer(definitions[0]) new_global_stack.addContainer(material_instance_container) new_global_stack.addContainer(variant_instance_container) + new_global_stack.addContainer(quality_instance_container) new_global_stack.addContainer(current_settings_instance_container) Application.getInstance().setGlobalContainerStack(new_global_stack) @@ -132,6 +136,14 @@ class MachineManagerModel(QObject): variant_index = Application.getInstance().getGlobalContainerStack().getContainerIndex(old_variant) Application.getInstance().getGlobalContainerStack().replaceContainer(variant_index, containers[0]) + @pyqtSlot(str) + def setActiveQuality(self, quality_id): + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = quality_id) + old_quality = Application.getInstance().getGlobalContainerStack().findContainer({"type": "quality"}) + if old_quality: + quality_index = Application.getInstance().getGlobalContainerStack().getContainerIndex(old_quality) + Application.getInstance().getGlobalContainerStack().replaceContainer(quality_index, containers[0]) + @pyqtProperty(str, notify = activeVariantChanged) def activeVariantName(self): variant = Application.getInstance().getGlobalContainerStack().findContainer({"type": "variant"}) From 12fd002e67660d052482c6b9849c55b7e5b85b85 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 17 May 2016 10:50:01 +0200 Subject: [PATCH 080/224] Active quality is now displayed (and changable) again CURA-1278 --- resources/qml/ProfileSetup.qml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/resources/qml/ProfileSetup.qml b/resources/qml/ProfileSetup.qml index 24668f43b0..95aed3685c 100644 --- a/resources/qml/ProfileSetup.qml +++ b/resources/qml/ProfileSetup.qml @@ -6,7 +6,8 @@ import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 -import UM 1.1 as UM +import UM 1.2 as UM +import Cura 1.0 as Cura Item{ id: base; @@ -41,13 +42,13 @@ Item{ property int rightMargin: customisedSettings.visible ? customisedSettings.width + UM.Theme.getSize("default_margin").width / 2 : 0 id: globalProfileSelection - text: UM.MachineManager.activeProfile + 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: UM.MachineManager.activeProfile + tooltip: Cura.MachineManager.activeQualityName style: UM.Theme.styles.sidebar_header_button menu: Menu @@ -56,7 +57,10 @@ Item{ Instantiator { id: profileSelectionInstantiator -// model: UM.ProfilesModel {} + model: UM.InstanceContainersModel + { + filter: {"type": "quality"} + } property int separatorIndex: -1 Loader { @@ -98,18 +102,18 @@ Item{ id: item text: model_data ? model_data.name : "" checkable: true; - checked: model_data ? model_data.active : false; + checked: Cura.MachineManager.activeQualityId == model_data.id exclusiveGroup: profileSelectionMenuGroup; onTriggered: { - UM.MachineManager.setActiveProfile(model_data.name); - if (!model_data.active) { + Cura.MachineManager.setActiveQuality(model_data.id); + /*if (!model_data.active) { //Selecting a profile was canceled; undo menu selection profileSelectionInstantiator.model.setProperty(model_index, "active", false); var activeProfileName = UM.MachineManager.activeProfile; var activeProfileIndex = profileSelectionInstantiator.model.find("name", activeProfileName); profileSelectionInstantiator.model.setProperty(activeProfileIndex, "active", true); - } + }*/ } } } From f24b56dc85d75dfd30fade67505d96fee0a1abdb Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 11:19:58 +0200 Subject: [PATCH 081/224] Move author and file formats to metadata The name can't be moved since it is not optional. Contributes to issue CURA-1278. --- resources/definitions/fdmprinter.def.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 00895fd056..11436bdcce 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1,15 +1,15 @@ { "id": "fdmprinter", + "name": "FDM Printer Base Description", "version": 2, "metadata": { + "author": "Ultimaker B.V.", "category": "Ultimaker", "manufacturer": "Ultimaker", + "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", "visible": false }, - "name": "FDM Printer Base Description", - "author": "Ultimaker B.V.", - "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", "settings": { "machine_settings": From 6d25d2112662b1c9df2f8a62f58a2ce5acbc6bcc Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 17 May 2016 12:55:40 +0200 Subject: [PATCH 082/224] getting id of definition when none was found no longer causes exception CURA-1278 --- cura/MachineManagerModel.py | 9 ++++----- resources/qml/Cura.qml | 2 +- resources/qml/SidebarHeader.qml | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 0109f5d261..82c8cd1328 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -158,7 +158,10 @@ class MachineManagerModel(QObject): @pyqtProperty(str, notify = globalContainerChanged) def activeDefinitionId(self): - return Application.getInstance().getGlobalContainerStack().getBottom().id + definition = Application.getInstance().getGlobalContainerStack().getBottom() + if definition: + return definition.id + return None @pyqtSlot(str, str) def renameMachine(self, machine_id, new_name): @@ -166,10 +169,6 @@ class MachineManagerModel(QObject): if containers: containers[0].setName(new_name) - @pyqtProperty(str, notify=globalContainerChanged) - def activeMachineDefinitionId(self): - return Application.getInstance().getGlobalContainerStack().getContainers()[-1].getId() - @pyqtSlot(str) def removeMachine(self, machine_id): UM.Settings.ContainerRegistry.getInstance().removeContainer(machine_id) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 2d1fbe3305..ba42bdc051 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -198,7 +198,7 @@ UM.MainWindow filter: { "type": "variant", - "definition": Cura.MachineManager.activeMachineDefinitionId //Only show variants of this machine + "definition": Cura.MachineManager.activeDefinitionId //Only show variants of this machine } } MenuItem { diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index ff6db0703b..5284178ba7 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -149,7 +149,7 @@ Item filter: { "type": "variant", - "definition": Cura.MachineManager.activeMachineDefinitionId //Only show variants of this machine + "definition": Cura.MachineManager.activeDefinitionId //Only show variants of this machine } } MenuItem From 0e5dcca81d4fe3bcf7351ff006343d99b9e5adbb Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 11:46:25 +0200 Subject: [PATCH 083/224] Add definition for BQ Prusa i3 Hephestos Contributes to issue CURA-1278. --- resources/definitions/bq_hephestos.def.json | 88 +++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 resources/definitions/bq_hephestos.def.json diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json new file mode 100644 index 0000000000..22655a24f0 --- /dev/null +++ b/resources/definitions/bq_hephestos.def.json @@ -0,0 +1,88 @@ +{ + "id": "bq_hephestos", + "name": "BQ Prusa i3 Hephestos", + "version": 2, + "inherits": "fdmprinter", + "metadata": + { + "author": "BQ", + "manufacturer": "BQ", + "category": "Other", + "file_formats": "text/x-gcode" + }, + + "settings": { + "machine_start_gcode": { + "value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 215 + }, + "machine_depth": { + "value": 210 + }, + "machine_height": { + "value": 180 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [0, -82, 0] + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_thickness": { + "value": 1.0 + }, + "top_bottom_thickness": { + "value": 1.0 + }, + "bottom_thickness": { + "value": 1.0 + }, + "material_print_temperature": { + "value": 220 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "speed_print": { + "value": 40.0 + }, + "speed_infill": { + "value": 40.0 + }, + "speed_wall": { + "value": 35.0 + }, + "speed_topbottom": { + "value": 35.0 + }, + "speed_travel": { + "value": 120.0 + }, + "speed_layer_0": { + "value": 20.0 + }, + "support_enable": { + "value": true + } + } +} \ No newline at end of file From b62e382cf2964e768082dff6f8b84e76a6eb5d34 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 11:52:28 +0200 Subject: [PATCH 084/224] Add platform for BQ Prusa i3 Hephestos Forgot this one when converting it. Contributes to issue CURA-1278. --- resources/definitions/bq_hephestos.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index 22655a24f0..9958ef2b86 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -8,7 +8,8 @@ "author": "BQ", "manufacturer": "BQ", "category": "Other", - "file_formats": "text/x-gcode" + "file_formats": "text/x-gcode", + "platform": "bq_hephestos_platform.stl" }, "settings": { From 0b2b9bd332de6922c1b0219370ff6fa3d565f7f8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 11:55:56 +0200 Subject: [PATCH 085/224] Add definition for BQ Hephestos 2 Contributes to issue CURA-1278. --- resources/definitions/bq_hephestos_2.def.json | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 resources/definitions/bq_hephestos_2.def.json diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json new file mode 100644 index 0000000000..cbaa41fb82 --- /dev/null +++ b/resources/definitions/bq_hephestos_2.def.json @@ -0,0 +1,117 @@ +{ + "id": "bq_hephestos_2", + "version": 1, + "name": "BQ Hephestos 2", + "inherits": "fdmprinter", + "metadata": { + "author": "BQ", + "manufacturer": "BQ", + "category": "Other", + "platform": "bq_hephestos_2_platform.stl", + "file_formats": "text/x-gcode" + }, + "manufacturer": "BQ", + "author": "BQ", + "platform": "bq_hephestos_2_platform.stl", + "file_formats": "text/x-gcode", + "inherits": "fdmprinter.json", + + "settings": { + "machine_start_gcode": { + "value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 210 + }, + "machine_depth": { + "value": 297 + }, + "machine_height": { + "value": 220 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [6, 1320, 0] + }, + "material_print_temperature": { + "value": 210.0 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_line_count": { + "value": 3 + }, + "wall_thickness": { + "value": 1.2 + }, + "top_bottom_thickness": { + "value": 1.2 + }, + "infill_sparse_density": { + "value": 20.0 + }, + "infill_overlap": { + "value": 15.0 + }, + "speed_print": { + "value": 60.0 + }, + "speed_travel": { + "value": 160.0 + }, + "speed_layer_0": { + "value": 30.0 + }, + "speed_wall_x": { + "value": 35.0 + }, + "speed_wall_0": { + "value": 30.0 + }, + "speed_infill": { + "value": 80.0 + }, + "speed_topbottom": { + "value": 35.0 + }, + "skirt_speed": { + "value": 35.0 + }, + "skirt_line_count": { + "value": 4 + }, + "skirt_minimal_length": { + "value": 30.0 + }, + "skirt_gap": { + "value": 6.0 + }, + "cool_fan_full_at_height": { + "value": 0.4 + }, + "support_enable": { + "value": false + } + } +} From 53c6ce11e708ed0c97b18a17c826935877d4b0e9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 11:57:31 +0200 Subject: [PATCH 086/224] Correct version number I should've changed this when converting the definition. Contributes to issue CURA-1278. --- resources/definitions/bq_hephestos_2.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json index cbaa41fb82..2e084518ba 100644 --- a/resources/definitions/bq_hephestos_2.def.json +++ b/resources/definitions/bq_hephestos_2.def.json @@ -1,6 +1,6 @@ { "id": "bq_hephestos_2", - "version": 1, + "version": 2, "name": "BQ Hephestos 2", "inherits": "fdmprinter", "metadata": { From 6449062332e7204b81eefc3c128add8da7d6bc2e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 12:12:59 +0200 Subject: [PATCH 087/224] Add definition for BQ Prusa i3 Hephestos XL Contributes to issue CURA-1278. --- .../definitions/bq_hephestos_xl.def.json | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 resources/definitions/bq_hephestos_xl.def.json diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json new file mode 100644 index 0000000000..c79227faea --- /dev/null +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -0,0 +1,88 @@ +{ + "id": "bq_hephestos_xl", + "version": 2, + "name": "BQ Prusa i3 Hephestos XL", + "inherits": "fdmprinter", + "metadata": { + "manufacturer": "BQ", + "author": "BQ", + "category": "Other", + "file_formats": "text/x-code", + "platform": "bq_hephestos_platform.stl" + }, + + "settings": { + "machine_start_gcode": { + "default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "default": 200 + }, + "machine_depth": { + "default": 300 + }, + "machine_height": { + "default": 180 + }, + "machine_heated_bed": { + "default": false + }, + "machine_center_is_zero": { + "default": false + }, + "machine_gcode_flavor": { + "default": "RepRap" + }, + "machine_platform_offset": { + "default": [0, -82, 0] + }, + "layer_height": { + "default": 0.2 + }, + "layer_height_0": { + "default": 0.2 + }, + "wall_thickness": { + "default": 1.0 + }, + "top_bottom_thickness": { + "default": 1.0 + }, + "bottom_thickness": { + "default": 1.0 + }, + "material_print_temperature": { + "default": 220 + }, + "material_bed_temperature": { + "default": 0 + }, + "material_diameter": { + "default": 1.75 + }, + "speed_print": { + "default": 40.0 + }, + "speed_infill": { + "default": 40.0 + }, + "speed_wall": { + "default": 35.0 + }, + "speed_topbottom": { + "default": 35.0 + }, + "speed_travel": { + "default": 120.0 + }, + "speed_layer_0": { + "default": 20.0 + }, + "support_enable": { + "default": true + } + } +} \ No newline at end of file From a16ff27ed69f3cf7318f3db529357b4b90058982 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 12:16:22 +0200 Subject: [PATCH 088/224] Fix definition 'default' -> 'value' Forgot that. Sorry. Contributes to issue CURA-1278. --- .../definitions/bq_hephestos_xl.def.json | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json index c79227faea..0d4bc13ea1 100644 --- a/resources/definitions/bq_hephestos_xl.def.json +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -13,76 +13,76 @@ "settings": { "machine_start_gcode": { - "default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + "value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" }, "machine_end_gcode": { - "default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" + "value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" }, "machine_width": { - "default": 200 + "value": 200 }, "machine_depth": { - "default": 300 + "value": 300 }, "machine_height": { - "default": 180 + "value": 180 }, "machine_heated_bed": { - "default": false + "value": false }, "machine_center_is_zero": { - "default": false + "value": false }, "machine_gcode_flavor": { - "default": "RepRap" + "value": "RepRap" }, "machine_platform_offset": { - "default": [0, -82, 0] + "value": [0, -82, 0] }, "layer_height": { - "default": 0.2 + "value": 0.2 }, "layer_height_0": { - "default": 0.2 + "value": 0.2 }, "wall_thickness": { - "default": 1.0 + "value": 1.0 }, "top_bottom_thickness": { - "default": 1.0 + "value": 1.0 }, "bottom_thickness": { - "default": 1.0 + "value": 1.0 }, "material_print_temperature": { - "default": 220 + "value": 220 }, "material_bed_temperature": { - "default": 0 + "value": 0 }, "material_diameter": { - "default": 1.75 + "value": 1.75 }, "speed_print": { - "default": 40.0 + "value": 40.0 }, "speed_infill": { - "default": 40.0 + "value": 40.0 }, "speed_wall": { - "default": 35.0 + "value": 35.0 }, "speed_topbottom": { - "default": 35.0 + "value": 35.0 }, "speed_travel": { - "default": 120.0 + "value": 120.0 }, "speed_layer_0": { - "default": 20.0 + "value": 20.0 }, "support_enable": { - "default": true + "value": true } } } \ No newline at end of file From 1c01eef409c599f43f4d597f7893f3cef1693052 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 12:20:35 +0200 Subject: [PATCH 089/224] Add definition for BQ Witbox Contributes to issue CURA-1278. --- resources/definitions/bq_witbox.def.json | 87 ++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 resources/definitions/bq_witbox.def.json diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json new file mode 100644 index 0000000000..dfa8eb5712 --- /dev/null +++ b/resources/definitions/bq_witbox.def.json @@ -0,0 +1,87 @@ +{ + "id": "bq_witbox", + "version": 2, + "name": "BQ Witbox", + "inherits": "fdmprinter", + "metadata": { + "author": "BQ", + "manufacturer": "BQ", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "bq_witbox_platform.stl" + }, + "settings": { + "machine_start_gcode": { + "value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 297 + }, + "machine_depth": { + "value": 210 + }, + "machine_height": { + "value": 200 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [0, -145, -38] + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_thickness": { + "value": 1 + }, + "top_bottom_thickness": { + "value": 1 + }, + "bottom_thickness": { + "value": 1 + }, + "material_print_temperature": { + "value": 220 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "speed_print": { + "value": 40 + }, + "speed_infill": { + "value": 40 + }, + "speed_wall": { + "value": 35 + }, + "speed_topbottom": { + "value": 35 + }, + "speed_travel": { + "value": 120 + }, + "speed_layer_0": { + "value": 20 + }, + "support_enable": { + "value": true + } + } +} \ No newline at end of file From ffcfba2caa87b120af44c54721c5ffda3ef491c3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 17 May 2016 14:46:51 +0200 Subject: [PATCH 090/224] Cura now handles saving of instances & stacks This is done because Cura has a fundamentally different strategy for this than Uranium. CURA-1278 --- cura/CuraApplication.py | 59 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 5620d039c9..39a25c34ad 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -15,7 +15,7 @@ from UM.Mesh.ReadMeshJob import ReadMeshJob from UM.Logger import Logger from UM.Preferences import Preferences from UM.JobQueue import JobQueue - +from UM.SaveFile import SaveFile from UM.Scene.Selection import Selection from UM.Scene.GroupDecorator import GroupDecorator @@ -25,6 +25,7 @@ from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation from UM.Settings.SettingDefinition import SettingDefinition +from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog @@ -47,6 +48,7 @@ import sys import os.path import numpy import copy +import urllib numpy.seterr(all="ignore") #WORKAROUND: GITHUB-88 GITHUB-385 GITHUB-612 @@ -67,6 +69,12 @@ class CuraApplication(QtApplication): class ResourceTypes: QmlFiles = Resources.UserType + 1 Firmware = Resources.UserType + 2 + QualityInstanceContainer = Resources.UserType + 3 + MaterialInstanceContainer = Resources.UserType + 4 + VariantInstanceContainer = Resources.UserType + 5 + UserInstanceContainer = Resources.UserType + 6 + MachineStack = Resources.UserType + 7 + Q_ENUMS(ResourceTypes) def __init__(self): @@ -110,6 +118,23 @@ class CuraApplication(QtApplication): Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") + SettingDefinition.addSupportedProperty("global_only", "bool") + + ## Add the 4 types of profiles to storage. + Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") + Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") + Resources.addStorageType(self.ResourceTypes.MaterialInstanceContainer, "materials") + Resources.addStorageType(self.ResourceTypes.UserInstanceContainer, "user") + Resources.addStorageType(self.ResourceTypes.MachineStack, "machine_instances") + + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.QualityInstanceContainer) + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.VariantInstanceContainer) + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MaterialInstanceContainer) + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.UserInstanceContainer) + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MachineStack) + + ContainerRegistry.getInstance().load() + Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") @@ -152,6 +177,8 @@ class CuraApplication(QtApplication): JobQueue.getInstance().jobFinished.connect(self._onJobFinished) + self.applicationShuttingDown.connect(self._onExit) + self._recent_files = [] files = Preferences.getInstance().getValue("cura/recent_files").split(";") for f in files: @@ -160,6 +187,34 @@ class CuraApplication(QtApplication): self._recent_files.append(QUrl.fromLocalFile(f)) + ## Cura has multiple locations where instance containers need to be saved, so we need to handle this differently. + def _onExit(self): + for instance in ContainerRegistry.getInstance().findInstanceContainers(): + data = instance.serialize() + file_name = urllib.parse.quote_plus(instance.getId()) + ".inst.cfg" + instance_type = instance.getMetaDataEntry("type") + path = None + if instance_type == "material": + path = Resources.getStoragePath(self.ResourceTypes.MaterialInstanceContainer, file_name) + elif instance_type == "quality": + path = Resources.getStoragePath(self.ResourceTypes.QualityInstanceContainer, file_name) + elif instance_type == "user": + path = Resources.getStoragePath(self.ResourceTypes.UserInstanceContainer, file_name) + elif instance_type == "variant": + path = Resources.getStoragePath(self.ResourceTypes.VariantInstanceContainer, file_name) + + if path: + with SaveFile(path, "wt", -1, "utf-8") as f: + f.write(data) + + for stack in ContainerRegistry.getInstance().findContainerStacks(): + data = stack.serialize() + file_name = urllib.parse.quote_plus(stack.getId()) + ".stack.cfg" + path = Resources.getStoragePath(self.ResourceTypes.MachineStack, file_name) + with SaveFile(path, "wt", -1, "utf-8") as f: + f.write(data) + + @pyqtSlot(result = QUrl) def getDefaultPath(self): return QUrl.fromLocalFile(os.path.expanduser("~/")) @@ -195,8 +250,6 @@ class CuraApplication(QtApplication): self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene...")) - SettingDefinition.addSupportedProperty("global_only", "bool") - controller = self.getController() controller.setActiveView("SolidView") From f66f0658d9bd7305cdcb805dea7fdced02c78554 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 17 May 2016 15:45:21 +0200 Subject: [PATCH 091/224] Fixed mistakes in the definitions CURA-1278 --- resources/definitions/bq_hephestos.def.json | 150 ++++++------- resources/definitions/bq_hephestos_2.def.json | 199 +++++++++--------- .../definitions/bq_hephestos_xl.def.json | 151 ++++++------- resources/definitions/bq_witbox.def.json | 150 ++++++------- 4 files changed, 336 insertions(+), 314 deletions(-) diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index 9958ef2b86..3b5b68c021 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -12,78 +12,84 @@ "platform": "bq_hephestos_platform.stl" }, - "settings": { - "machine_start_gcode": { - "value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "value": 215 - }, - "machine_depth": { - "value": 210 - }, - "machine_height": { - "value": 180 - }, - "machine_heated_bed": { - "value": false - }, - "machine_center_is_zero": { - "value": false - }, - "machine_gcode_flavor": { - "value": "RepRap" - }, - "machine_platform_offset": { - "value": [0, -82, 0] - }, - "layer_height": { - "value": 0.2 - }, - "layer_height_0": { - "value": 0.2 - }, - "wall_thickness": { - "value": 1.0 - }, - "top_bottom_thickness": { - "value": 1.0 - }, - "bottom_thickness": { - "value": 1.0 - }, - "material_print_temperature": { - "value": 220 - }, - "material_bed_temperature": { - "value": 0 - }, - "material_diameter": { - "value": 1.75 - }, - "speed_print": { - "value": 40.0 - }, - "speed_infill": { - "value": 40.0 - }, - "speed_wall": { - "value": 35.0 - }, - "speed_topbottom": { - "value": 35.0 - }, - "speed_travel": { - "value": 120.0 - }, - "speed_layer_0": { - "value": 20.0 - }, - "support_enable": { - "value": true + "overrides": { + "settings": { + "machine_start_gcode": { + "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 215 + }, + "machine_depth": { + "value": 210 + }, + "machine_height": { + "value": 180 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [ + 0, + -82, + 0 + ] + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_thickness": { + "value": 1.0 + }, + "top_bottom_thickness": { + "value": 1.0 + }, + "bottom_thickness": { + "value": 1.0 + }, + "material_print_temperature": { + "value": 220 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "speed_print": { + "value": 40.0 + }, + "speed_infill": { + "value": 40.0 + }, + "speed_wall": { + "value": 35.0 + }, + "speed_topbottom": { + "value": 35.0 + }, + "speed_travel": { + "value": 120.0 + }, + "speed_layer_0": { + "value": 20.0 + }, + "support_enable": { + "value": true + } } } } \ No newline at end of file diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json index 2e084518ba..3e9b640586 100644 --- a/resources/definitions/bq_hephestos_2.def.json +++ b/resources/definitions/bq_hephestos_2.def.json @@ -14,104 +14,109 @@ "author": "BQ", "platform": "bq_hephestos_2_platform.stl", "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - "settings": { - "machine_start_gcode": { - "value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" - }, - "machine_width": { - "value": 210 - }, - "machine_depth": { - "value": 297 - }, - "machine_height": { - "value": 220 - }, - "machine_heated_bed": { - "value": false - }, - "machine_center_is_zero": { - "value": false - }, - "machine_gcode_flavor": { - "value": "RepRap" - }, - "machine_platform_offset": { - "value": [6, 1320, 0] - }, - "material_print_temperature": { - "value": 210.0 - }, - "material_bed_temperature": { - "value": 0 - }, - "material_diameter": { - "value": 1.75 - }, - "layer_height": { - "value": 0.2 - }, - "layer_height_0": { - "value": 0.2 - }, - "wall_line_count": { - "value": 3 - }, - "wall_thickness": { - "value": 1.2 - }, - "top_bottom_thickness": { - "value": 1.2 - }, - "infill_sparse_density": { - "value": 20.0 - }, - "infill_overlap": { - "value": 15.0 - }, - "speed_print": { - "value": 60.0 - }, - "speed_travel": { - "value": 160.0 - }, - "speed_layer_0": { - "value": 30.0 - }, - "speed_wall_x": { - "value": 35.0 - }, - "speed_wall_0": { - "value": 30.0 - }, - "speed_infill": { - "value": 80.0 - }, - "speed_topbottom": { - "value": 35.0 - }, - "skirt_speed": { - "value": 35.0 - }, - "skirt_line_count": { - "value": 4 - }, - "skirt_minimal_length": { - "value": 30.0 - }, - "skirt_gap": { - "value": 6.0 - }, - "cool_fan_full_at_height": { - "value": 0.4 - }, - "support_enable": { - "value": false + "overrides": { + "settings": { + "machine_start_gcode": { + "default_value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default_value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 210 + }, + "machine_depth": { + "value": 297 + }, + "machine_height": { + "value": 220 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [ + 6, + 1320, + 0 + ] + }, + "material_print_temperature": { + "value": 210.0 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_line_count": { + "value": 3 + }, + "wall_thickness": { + "value": 1.2 + }, + "top_bottom_thickness": { + "value": 1.2 + }, + "infill_sparse_density": { + "value": 20.0 + }, + "infill_overlap": { + "value": 15.0 + }, + "speed_print": { + "value": 60.0 + }, + "speed_travel": { + "value": 160.0 + }, + "speed_layer_0": { + "value": 30.0 + }, + "speed_wall_x": { + "value": 35.0 + }, + "speed_wall_0": { + "value": 30.0 + }, + "speed_infill": { + "value": 80.0 + }, + "speed_topbottom": { + "value": 35.0 + }, + "skirt_speed": { + "value": 35.0 + }, + "skirt_line_count": { + "value": 4 + }, + "skirt_minimal_length": { + "value": 30.0 + }, + "skirt_gap": { + "value": 6.0 + }, + "cool_fan_full_at_height": { + "value": 0.4 + }, + "support_enable": { + "value": false + } } } } diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json index 0d4bc13ea1..d810c49ea5 100644 --- a/resources/definitions/bq_hephestos_xl.def.json +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -10,79 +10,84 @@ "file_formats": "text/x-code", "platform": "bq_hephestos_platform.stl" }, - - "settings": { - "machine_start_gcode": { - "value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "value": 200 - }, - "machine_depth": { - "value": 300 - }, - "machine_height": { - "value": 180 - }, - "machine_heated_bed": { - "value": false - }, - "machine_center_is_zero": { - "value": false - }, - "machine_gcode_flavor": { - "value": "RepRap" - }, - "machine_platform_offset": { - "value": [0, -82, 0] - }, - "layer_height": { - "value": 0.2 - }, - "layer_height_0": { - "value": 0.2 - }, - "wall_thickness": { - "value": 1.0 - }, - "top_bottom_thickness": { - "value": 1.0 - }, - "bottom_thickness": { - "value": 1.0 - }, - "material_print_temperature": { - "value": 220 - }, - "material_bed_temperature": { - "value": 0 - }, - "material_diameter": { - "value": 1.75 - }, - "speed_print": { - "value": 40.0 - }, - "speed_infill": { - "value": 40.0 - }, - "speed_wall": { - "value": 35.0 - }, - "speed_topbottom": { - "value": 35.0 - }, - "speed_travel": { - "value": 120.0 - }, - "speed_layer_0": { - "value": 20.0 - }, - "support_enable": { - "value": true + "overrides": { + "settings": { + "machine_start_gcode": { + "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 200 + }, + "machine_depth": { + "value": 300 + }, + "machine_height": { + "value": 180 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [ + 0, + -82, + 0 + ] + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_thickness": { + "value": 1.0 + }, + "top_bottom_thickness": { + "value": 1.0 + }, + "bottom_thickness": { + "value": 1.0 + }, + "material_print_temperature": { + "value": 220 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "speed_print": { + "value": 40.0 + }, + "speed_infill": { + "value": 40.0 + }, + "speed_wall": { + "value": 35.0 + }, + "speed_topbottom": { + "value": 35.0 + }, + "speed_travel": { + "value": 120.0 + }, + "speed_layer_0": { + "value": 20.0 + }, + "support_enable": { + "value": true + } } } } \ No newline at end of file diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json index dfa8eb5712..15ab9318ef 100644 --- a/resources/definitions/bq_witbox.def.json +++ b/resources/definitions/bq_witbox.def.json @@ -10,78 +10,84 @@ "file_formats": "text/x-gcode", "platform": "bq_witbox_platform.stl" }, - "settings": { - "machine_start_gcode": { - "value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "value": 297 - }, - "machine_depth": { - "value": 210 - }, - "machine_height": { - "value": 200 - }, - "machine_heated_bed": { - "value": false - }, - "machine_center_is_zero": { - "value": false - }, - "machine_gcode_flavor": { - "value": "RepRap" - }, - "machine_platform_offset": { - "value": [0, -145, -38] - }, - "layer_height": { - "value": 0.2 - }, - "layer_height_0": { - "value": 0.2 - }, - "wall_thickness": { - "value": 1 - }, - "top_bottom_thickness": { - "value": 1 - }, - "bottom_thickness": { - "value": 1 - }, - "material_print_temperature": { - "value": 220 - }, - "material_bed_temperature": { - "value": 0 - }, - "material_diameter": { - "value": 1.75 - }, - "speed_print": { - "value": 40 - }, - "speed_infill": { - "value": 40 - }, - "speed_wall": { - "value": 35 - }, - "speed_topbottom": { - "value": 35 - }, - "speed_travel": { - "value": 120 - }, - "speed_layer_0": { - "value": 20 - }, - "support_enable": { - "value": true + "overrides": { + "settings": { + "machine_start_gcode": { + "value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 297 + }, + "machine_depth": { + "value": 210 + }, + "machine_height": { + "value": 200 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [ + 0, + -145, + -38 + ] + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_thickness": { + "value": 1 + }, + "top_bottom_thickness": { + "value": 1 + }, + "bottom_thickness": { + "value": 1 + }, + "material_print_temperature": { + "value": 220 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "speed_print": { + "value": 40 + }, + "speed_infill": { + "value": 40 + }, + "speed_wall": { + "value": 35 + }, + "speed_topbottom": { + "value": 35 + }, + "speed_travel": { + "value": 120 + }, + "speed_layer_0": { + "value": 20 + }, + "support_enable": { + "value": true + } } } } \ No newline at end of file From 5c1210dddf545aaa153c45d11791a61cf1892c6b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 17 May 2016 16:39:10 +0200 Subject: [PATCH 092/224] Removed settings subobject in overrides CURA-1278 --- resources/definitions/bq_hephestos.def.json | 152 +++++++------ resources/definitions/bq_hephestos_2.def.json | 200 +++++++++--------- .../definitions/bq_hephestos_xl.def.json | 152 +++++++------ resources/definitions/bq_witbox.def.json | 153 +++++++------- 4 files changed, 325 insertions(+), 332 deletions(-) diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index 3b5b68c021..45bf520a14 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -13,83 +13,81 @@ }, "overrides": { - "settings": { - "machine_start_gcode": { - "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "value": 215 - }, - "machine_depth": { - "value": 210 - }, - "machine_height": { - "value": 180 - }, - "machine_heated_bed": { - "value": false - }, - "machine_center_is_zero": { - "value": false - }, - "machine_gcode_flavor": { - "value": "RepRap" - }, - "machine_platform_offset": { - "value": [ - 0, - -82, - 0 - ] - }, - "layer_height": { - "value": 0.2 - }, - "layer_height_0": { - "value": 0.2 - }, - "wall_thickness": { - "value": 1.0 - }, - "top_bottom_thickness": { - "value": 1.0 - }, - "bottom_thickness": { - "value": 1.0 - }, - "material_print_temperature": { - "value": 220 - }, - "material_bed_temperature": { - "value": 0 - }, - "material_diameter": { - "value": 1.75 - }, - "speed_print": { - "value": 40.0 - }, - "speed_infill": { - "value": 40.0 - }, - "speed_wall": { - "value": 35.0 - }, - "speed_topbottom": { - "value": 35.0 - }, - "speed_travel": { - "value": 120.0 - }, - "speed_layer_0": { - "value": 20.0 - }, - "support_enable": { - "value": true - } + "machine_start_gcode": { + "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 215 + }, + "machine_depth": { + "value": 210 + }, + "machine_height": { + "value": 180 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [ + 0, + -82, + 0 + ] + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_thickness": { + "value": 1.0 + }, + "top_bottom_thickness": { + "value": 1.0 + }, + "bottom_thickness": { + "value": 1.0 + }, + "material_print_temperature": { + "value": 220 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "speed_print": { + "value": 40.0 + }, + "speed_infill": { + "value": 40.0 + }, + "speed_wall": { + "value": 35.0 + }, + "speed_topbottom": { + "value": 35.0 + }, + "speed_travel": { + "value": 120.0 + }, + "speed_layer_0": { + "value": 20.0 + }, + "support_enable": { + "value": true } } } \ No newline at end of file diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json index 3e9b640586..7f92e081ff 100644 --- a/resources/definitions/bq_hephestos_2.def.json +++ b/resources/definitions/bq_hephestos_2.def.json @@ -16,107 +16,105 @@ "file_formats": "text/x-gcode", "overrides": { - "settings": { - "machine_start_gcode": { - "default_value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default_value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" - }, - "machine_width": { - "value": 210 - }, - "machine_depth": { - "value": 297 - }, - "machine_height": { - "value": 220 - }, - "machine_heated_bed": { - "value": false - }, - "machine_center_is_zero": { - "value": false - }, - "machine_gcode_flavor": { - "value": "RepRap" - }, - "machine_platform_offset": { - "value": [ - 6, - 1320, - 0 - ] - }, - "material_print_temperature": { - "value": 210.0 - }, - "material_bed_temperature": { - "value": 0 - }, - "material_diameter": { - "value": 1.75 - }, - "layer_height": { - "value": 0.2 - }, - "layer_height_0": { - "value": 0.2 - }, - "wall_line_count": { - "value": 3 - }, - "wall_thickness": { - "value": 1.2 - }, - "top_bottom_thickness": { - "value": 1.2 - }, - "infill_sparse_density": { - "value": 20.0 - }, - "infill_overlap": { - "value": 15.0 - }, - "speed_print": { - "value": 60.0 - }, - "speed_travel": { - "value": 160.0 - }, - "speed_layer_0": { - "value": 30.0 - }, - "speed_wall_x": { - "value": 35.0 - }, - "speed_wall_0": { - "value": 30.0 - }, - "speed_infill": { - "value": 80.0 - }, - "speed_topbottom": { - "value": 35.0 - }, - "skirt_speed": { - "value": 35.0 - }, - "skirt_line_count": { - "value": 4 - }, - "skirt_minimal_length": { - "value": 30.0 - }, - "skirt_gap": { - "value": 6.0 - }, - "cool_fan_full_at_height": { - "value": 0.4 - }, - "support_enable": { - "value": false - } + "machine_start_gcode": { + "default_value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default_value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 210 + }, + "machine_depth": { + "value": 297 + }, + "machine_height": { + "value": 220 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [ + 6, + 1320, + 0 + ] + }, + "material_print_temperature": { + "value": 210.0 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_line_count": { + "value": 3 + }, + "wall_thickness": { + "value": 1.2 + }, + "top_bottom_thickness": { + "value": 1.2 + }, + "infill_sparse_density": { + "value": 20.0 + }, + "infill_overlap": { + "value": 15.0 + }, + "speed_print": { + "value": 60.0 + }, + "speed_travel": { + "value": 160.0 + }, + "speed_layer_0": { + "value": 30.0 + }, + "speed_wall_x": { + "value": 35.0 + }, + "speed_wall_0": { + "value": 30.0 + }, + "speed_infill": { + "value": 80.0 + }, + "speed_topbottom": { + "value": 35.0 + }, + "skirt_speed": { + "value": 35.0 + }, + "skirt_line_count": { + "value": 4 + }, + "skirt_minimal_length": { + "value": 30.0 + }, + "skirt_gap": { + "value": 6.0 + }, + "cool_fan_full_at_height": { + "value": 0.4 + }, + "support_enable": { + "value": false } } } diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json index d810c49ea5..a0d8caa62e 100644 --- a/resources/definitions/bq_hephestos_xl.def.json +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -11,83 +11,81 @@ "platform": "bq_hephestos_platform.stl" }, "overrides": { - "settings": { - "machine_start_gcode": { - "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "value": 200 - }, - "machine_depth": { - "value": 300 - }, - "machine_height": { - "value": 180 - }, - "machine_heated_bed": { - "value": false - }, - "machine_center_is_zero": { - "value": false - }, - "machine_gcode_flavor": { - "value": "RepRap" - }, - "machine_platform_offset": { - "value": [ - 0, - -82, - 0 - ] - }, - "layer_height": { - "value": 0.2 - }, - "layer_height_0": { - "value": 0.2 - }, - "wall_thickness": { - "value": 1.0 - }, - "top_bottom_thickness": { - "value": 1.0 - }, - "bottom_thickness": { - "value": 1.0 - }, - "material_print_temperature": { - "value": 220 - }, - "material_bed_temperature": { - "value": 0 - }, - "material_diameter": { - "value": 1.75 - }, - "speed_print": { - "value": 40.0 - }, - "speed_infill": { - "value": 40.0 - }, - "speed_wall": { - "value": 35.0 - }, - "speed_topbottom": { - "value": 35.0 - }, - "speed_travel": { - "value": 120.0 - }, - "speed_layer_0": { - "value": 20.0 - }, - "support_enable": { - "value": true - } + "machine_start_gcode": { + "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 200 + }, + "machine_depth": { + "value": 300 + }, + "machine_height": { + "value": 180 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [ + 0, + -82, + 0 + ] + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_thickness": { + "value": 1.0 + }, + "top_bottom_thickness": { + "value": 1.0 + }, + "bottom_thickness": { + "value": 1.0 + }, + "material_print_temperature": { + "value": 220 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "speed_print": { + "value": 40.0 + }, + "speed_infill": { + "value": 40.0 + }, + "speed_wall": { + "value": 35.0 + }, + "speed_topbottom": { + "value": 35.0 + }, + "speed_travel": { + "value": 120.0 + }, + "speed_layer_0": { + "value": 20.0 + }, + "support_enable": { + "value": true } } } \ No newline at end of file diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json index 15ab9318ef..e0d8bf774e 100644 --- a/resources/definitions/bq_witbox.def.json +++ b/resources/definitions/bq_witbox.def.json @@ -11,83 +11,82 @@ "platform": "bq_witbox_platform.stl" }, "overrides": { - "settings": { - "machine_start_gcode": { - "value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "value": 297 - }, - "machine_depth": { - "value": 210 - }, - "machine_height": { - "value": 200 - }, - "machine_heated_bed": { - "value": false - }, - "machine_center_is_zero": { - "value": false - }, - "machine_gcode_flavor": { - "value": "RepRap" - }, - "machine_platform_offset": { - "value": [ - 0, - -145, - -38 - ] - }, - "layer_height": { - "value": 0.2 - }, - "layer_height_0": { - "value": 0.2 - }, - "wall_thickness": { - "value": 1 - }, - "top_bottom_thickness": { - "value": 1 - }, - "bottom_thickness": { - "value": 1 - }, - "material_print_temperature": { - "value": 220 - }, - "material_bed_temperature": { - "value": 0 - }, - "material_diameter": { - "value": 1.75 - }, - "speed_print": { - "value": 40 - }, - "speed_infill": { - "value": 40 - }, - "speed_wall": { - "value": 35 - }, - "speed_topbottom": { - "value": 35 - }, - "speed_travel": { - "value": 120 - }, - "speed_layer_0": { - "value": 20 - }, - "support_enable": { - "value": true - } + "machine_start_gcode": { + "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 297 + }, + "machine_depth": { + "value": 210 + }, + "machine_height": { + "value": 200 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [ + 0, + -145, + -38 + ] + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_thickness": { + "value": 1 + }, + "top_bottom_thickness": { + "value": 1 + }, + "bottom_thickness": { + "value": 1 + }, + "material_print_temperature": { + "value": 220 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "speed_print": { + "value": 40 + }, + "speed_infill": { + "value": 40 + }, + "speed_wall": { + "value": 35 + }, + "speed_topbottom": { + "value": 35 + }, + "speed_travel": { + "value": 120 + }, + "speed_layer_0": { + "value": 20 + }, + "support_enable": { + "value": true } + } } \ No newline at end of file From a2862d8c24001c419ab834a9b5089d871d97946f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 17 May 2016 16:49:59 +0200 Subject: [PATCH 093/224] Moved offset to meta-data CURA-1278 --- resources/definitions/bq_hephestos.def.json | 16 ++++++++-------- resources/definitions/bq_hephestos_2.def.json | 14 +++++++------- resources/definitions/bq_hephestos_xl.def.json | 16 ++++++++-------- resources/definitions/bq_witbox.def.json | 16 ++++++++-------- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index 45bf520a14..57fa85ab89 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -9,7 +9,14 @@ "manufacturer": "BQ", "category": "Other", "file_formats": "text/x-gcode", - "platform": "bq_hephestos_platform.stl" + "platform": "bq_hephestos_platform.stl", + "platform_offset": { + "value": [ + 0, + -82, + 0 + ] + } }, "overrides": { @@ -37,13 +44,6 @@ "machine_gcode_flavor": { "value": "RepRap" }, - "machine_platform_offset": { - "value": [ - 0, - -82, - 0 - ] - }, "layer_height": { "value": 0.2 }, diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json index 7f92e081ff..dba849ac7e 100644 --- a/resources/definitions/bq_hephestos_2.def.json +++ b/resources/definitions/bq_hephestos_2.def.json @@ -8,6 +8,13 @@ "manufacturer": "BQ", "category": "Other", "platform": "bq_hephestos_2_platform.stl", + "platform_offset": { + "value": [ + 6, + 1320, + 0 + ] + }, "file_formats": "text/x-gcode" }, "manufacturer": "BQ", @@ -40,13 +47,6 @@ "machine_gcode_flavor": { "value": "RepRap" }, - "machine_platform_offset": { - "value": [ - 6, - 1320, - 0 - ] - }, "material_print_temperature": { "value": 210.0 }, diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json index a0d8caa62e..6d4c7fdd52 100644 --- a/resources/definitions/bq_hephestos_xl.def.json +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -8,7 +8,14 @@ "author": "BQ", "category": "Other", "file_formats": "text/x-code", - "platform": "bq_hephestos_platform.stl" + "platform": "bq_hephestos_platform.stl", + "platform_offset": { + "value": [ + 0, + -82, + 0 + ] + } }, "overrides": { "machine_start_gcode": { @@ -35,13 +42,6 @@ "machine_gcode_flavor": { "value": "RepRap" }, - "machine_platform_offset": { - "value": [ - 0, - -82, - 0 - ] - }, "layer_height": { "value": 0.2 }, diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json index e0d8bf774e..d9529cdae6 100644 --- a/resources/definitions/bq_witbox.def.json +++ b/resources/definitions/bq_witbox.def.json @@ -8,7 +8,14 @@ "manufacturer": "BQ", "category": "Other", "file_formats": "text/x-gcode", - "platform": "bq_witbox_platform.stl" + "platform": "bq_witbox_platform.stl", + "platform_offset": { + "value": [ + 0, + -145, + -38 + ] + } }, "overrides": { "machine_start_gcode": { @@ -35,13 +42,6 @@ "machine_gcode_flavor": { "value": "RepRap" }, - "machine_platform_offset": { - "value": [ - 0, - -145, - -38 - ] - }, "layer_height": { "value": 0.2 }, From 20c7ce404de14e838f6418bcaad12ba548aa2734 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 13:43:34 +0200 Subject: [PATCH 094/224] Add definition for BQ Witbox 2 Contributes to issue CURA-1278. --- resources/definitions/bq_witbox_2.def.json | 113 +++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 resources/definitions/bq_witbox_2.def.json diff --git a/resources/definitions/bq_witbox_2.def.json b/resources/definitions/bq_witbox_2.def.json new file mode 100644 index 0000000000..43e6968aba --- /dev/null +++ b/resources/definitions/bq_witbox_2.def.json @@ -0,0 +1,113 @@ +{ + "id": "bq_witbox_2", + "version": 2, + "name": "BQ Witbox 2", + "inherits": "fdmprinter", + "metadata": + { + "author": "BQ", + "manufacturer": "BQ", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "bq_witbox_platform.stl" + }, + + "settings": { + "machine_start_gcode": { + "value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" + }, + "machine_width": { + "value": 297 + }, + "machine_depth": { + "value": 210 + }, + "machine_height": { + "value": 200 + }, + "machine_heated_bed": { + "value": false + }, + "machine_center_is_zero": { + "value": false + }, + "machine_gcode_flavor": { + "value": "RepRap" + }, + "machine_platform_offset": { + "value": [0, -145, -38] + }, + "material_print_temperature": { + "value": 210.0 + }, + "material_bed_temperature": { + "value": 0 + }, + "material_diameter": { + "value": 1.75 + }, + "layer_height": { + "value": 0.2 + }, + "layer_height_0": { + "value": 0.2 + }, + "wall_line_count": { + "value": 3 + }, + "wall_thickness": { + "value": 1.2 + }, + "top_bottom_thickness": { + "value": 1.2 + }, + "infill_sparse_density": { + "value": 20.0 + }, + "infill_overlap": { + "value": 15.0 + }, + "speed_print": { + "value": 60.0 + }, + "speed_travel": { + "value": 160.0 + }, + "speed_layer_0": { + "value": 30.0 + }, + "speed_wall_x": { + "value": 35.0 + }, + "speed_wall_0": { + "value": 30.0 + }, + "speed_infill": { + "value": 80.0 + }, + "speed_topbottom": { + "value": 35.0 + }, + "skirt_speed": { + "value": 35.0 + }, + "skirt_line_count": { + "value": 4 + }, + "skirt_minimal_length": { + "value": 30.0 + }, + "skirt_gap": { + "value": 6.0 + }, + "cool_fan_full_at_height": { + "value": 0.4 + }, + "support_enable": { + "value": false + } + } +} \ No newline at end of file From f0e99122c7f98ca700c6965ee81d5f945e00f3fc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 13:57:07 +0200 Subject: [PATCH 095/224] Add definition for German RepRap Neo Contributes to issue CURA-1278. --- resources/definitions/grr_neo.def.json | 62 ++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 resources/definitions/grr_neo.def.json diff --git a/resources/definitions/grr_neo.def.json b/resources/definitions/grr_neo.def.json new file mode 100644 index 0000000000..710303383b --- /dev/null +++ b/resources/definitions/grr_neo.def.json @@ -0,0 +1,62 @@ +{ + "id": "grr_neo", + "version": 2, + "name": "German RepRap Neo", + "inherits": "fdmprinter", + "metadata": { + "author": "Simon Cor", + "manufacturer": "German RepRap", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker.png", + "platform": "grr_neo_platform.stl" + }, + + "overrides": { + "machine_width": { + "value": 150 + }, + "machine_height": { + "value": 150 + }, + "machine_depth": { + "value": 150 + }, + "machine_center_is_zero": { + "value": false + }, + "machine_nozzle_size": { + "value": 0.5 + }, + "machine_nozzle_heat_up_speed": { + "value": 2 + }, + "machine_nozzle_cool_down_speed": { + "value": 2 + }, + "machine_head_shape_min_x": { + "value": 75 + }, + "machine_head_shape_min_y": { + "value": 18 + }, + "machine_head_shape_max_x": { + "value": 18 + }, + "machine_head_shape_max_y": { + "value": 35 + }, + "machine_nozzle_gantry_distance": { + "value": 55 + }, + "machine_gcode_flavor": { + "value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} \ No newline at end of file From fea09482b58418c0699187ffd37c83cfde2a19b5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 14:39:28 +0200 Subject: [PATCH 096/224] Translate definition for Innovo INVENTOR Contributes to issue CURA-1278. --- .../definitions/innovo_inventor.def.json | 103 ++++++++++++++++++ resources/machines/innovo-inventor.json | 44 -------- 2 files changed, 103 insertions(+), 44 deletions(-) create mode 100644 resources/definitions/innovo_inventor.def.json delete mode 100644 resources/machines/innovo-inventor.json diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json new file mode 100644 index 0000000000..30e5a53094 --- /dev/null +++ b/resources/definitions/innovo_inventor.def.json @@ -0,0 +1,103 @@ +{ + "id": "innovo-inventor", + "version": 2, + "name": "Innovo INVENTOR", + "inherits": "fdmprinter", + "metadata": { + "author": "AR", + "manufacturer": "Innovo", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "inventor_platform.stl" + }, + "settings": { + "machine_width": { + "value": 340 + }, + "machine_height": { + "value": 290 + }, + "machine_depth": { + "value": 300 + }, + "machine_heated_bed": { + "value": true + }, + "machine_center_is_zero": { + "value": false + }, + "machine_nozzle_size": { + "value": 0.4 + }, + "machine_head_shape_min_x": { + "value": 43.7 + }, + "machine_head_shape_min_y": { + "value": 19.2 + }, + "machine_head_shape_max_x": { + "value": 43.7 + }, + "machine_head_shape_max_y": { + "value": 55 + }, + "machine_nozzle_gantry_distance": { + "value": 82.3 + }, + "machine_nozzle_offset_x_1": { + "value": 0 + }, + "machine_nozzle_offset_y_1": { + "value": 15 + }, + "machine_gcode_flavor": { + "value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position" + }, + "machine_end_gcode": { + "value": "M104 S0\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors" + }, + "machine_platform_offset": { + "value": [-180, -0.25, 160] + }, + "layer_height": { + "value": 0.15 + }, + "wall_thickness": { + "value": 0.8 + }, + "top_bottom_thickness": { + "value": 0.3 + }, + "material_print_temperature": { + "value": 215 + }, + "material_bed_temperature": { + "value": 60 + }, + "material_diameter": { + "value": 1.75 + }, + "speed_print": { + "value": 60 + }, + "speed_infill": { + "value": 100 + }, + "speed_topbottom": { + "value": 30 + }, + "speed_travel": { + "value": 150 + }, + "speed_layer_0": { + "value": 30.0, + "min_value": 0.1 + }, + "infill_overlap": { + "value": 10.0 + } + } +} \ No newline at end of file diff --git a/resources/machines/innovo-inventor.json b/resources/machines/innovo-inventor.json deleted file mode 100644 index a37143a8d7..0000000000 --- a/resources/machines/innovo-inventor.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "id": "innovo-inventor", - "version": 1, - "name": "Innovo INVENTOR", - "manufacturer": "Other", - "author": "AR", - "platform": "inventor_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "machine_settings": { - "machine_width": {"default": 340}, - "machine_height": {"default": 290}, - "machine_depth": {"default": 300}, - "machine_heated_bed": { "default": true}, - "machine_center_is_zero": {"default": false}, - "machine_nozzle_size": {"default": 0.4}, - "machine_head_shape_min_x": {"default": 43.7}, - "machine_head_shape_min_y": {"default": 19.2}, - "machine_head_shape_max_x": {"default": 43.7}, - "machine_head_shape_max_y": {"default": 55}, - "machine_nozzle_gantry_distance": {"default": 82.3}, - "machine_nozzle_offset_x_1": {"default": 0}, - "machine_nozzle_offset_y_1": {"default": 15}, - "machine_gcode_flavor": {"default": "RepRap (Marlin/Sprinter)"}, - "machine_start_gcode": {"default": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position"}, - "machine_end_gcode": {"default": "M104 S0\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors"}, - "machine_platform_offset": {"default": [-180, -0.25, 160]} - }, - "overrides": { - "layer_height": { "default": 0.15}, - "wall_thickness": { "default": 0.8}, - "top_bottom_thickness": { "default": 0.3, "visible": true}, - "material_print_temperature": { "default": 215, "visible": true}, - "material_bed_temperature": { "default": 60, "visible": true}, - "material_diameter": { "default": 1.75, "visible": true}, - "speed_print": { "default": 60.0, "visible": true}, - "speed_infill": { "default": 100.0, "visible": true }, - "speed_topbottom": { "default": 30.0, "visible": true }, - "speed_travel": { "default": 150.0, "visible": true }, - "speed_layer_0": { "min_value": 0.1, "default": 30.0, "visible": true }, - "infill_overlap": { "default": 10.0 } - } -} \ No newline at end of file From 8cf05fd2fc1f20cf924703041b97eb1f8b7d5465 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 14:40:22 +0200 Subject: [PATCH 097/224] Remove old machine definitions These have already been translated. I should've added these to their respective commits, I guess. Contributes to issue CURA-1278. --- resources/machines/bq_hephestos.json | 55 --------------------- resources/machines/bq_hephestos_2.json | 63 ------------------------- resources/machines/bq_hephestos_xl.json | 55 --------------------- resources/machines/bq_witbox.json | 55 --------------------- resources/machines/bq_witbox_2.json | 63 ------------------------- resources/machines/grr_neo.json | 37 --------------- 6 files changed, 328 deletions(-) delete mode 100644 resources/machines/bq_hephestos.json delete mode 100644 resources/machines/bq_hephestos_2.json delete mode 100644 resources/machines/bq_hephestos_xl.json delete mode 100644 resources/machines/bq_witbox.json delete mode 100644 resources/machines/bq_witbox_2.json delete mode 100644 resources/machines/grr_neo.json diff --git a/resources/machines/bq_hephestos.json b/resources/machines/bq_hephestos.json deleted file mode 100644 index e3aa354b75..0000000000 --- a/resources/machines/bq_hephestos.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "id": "bq_hephestos", - "version": 1, - "name": "BQ Prusa i3 Hephestos", - "manufacturer": "Other", - "author": "BQ", - "platform": "bq_hephestos_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_start_gcode": { - "default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "default": 215 - }, - "machine_depth": { - "default": 210 - }, - "machine_height": { - "default": 180 - }, - "machine_heated_bed": { - "default": false - }, - "machine_center_is_zero": { - "default": false - }, - "machine_gcode_flavor": { - "default": "RepRap" - }, - "machine_platform_offset": { - "default": [0, -82, 0] - }, - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": false }, - "wall_thickness": { "default": 1.0, "visible": false }, - "top_bottom_thickness": { "default": 1.0, "visible": false}, - "bottom_thickness": { "default": 1.0, "visible": false }, - "material_print_temperature": { "default": 220, "visible": true }, - "material_bed_temperature": { "default": 0, "visible": false }, - "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 40.0}, - "speed_infill": { "default": 40.0, "visible": true }, - "speed_wall": { "default": 35.0, "visible": true}, - "speed_topbottom": { "default": 35.0, "visible": true }, - "speed_travel": { "default": 120.0 }, - "speed_layer_0": { "default": 20.0, "visible": false }, - "support_enable": { "default": true } - } -} diff --git a/resources/machines/bq_hephestos_2.json b/resources/machines/bq_hephestos_2.json deleted file mode 100644 index 8b1ed34caa..0000000000 --- a/resources/machines/bq_hephestos_2.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "id": "bq_hephestos_2", - "version": 1, - "name": "BQ Hephestos 2", - "manufacturer": "Other", - "author": "BQ", - "platform": "bq_hephestos_2_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_start_gcode": { - "default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" - }, - "machine_width": { - "default": 210 - }, - "machine_depth": { - "default": 297 - }, - "machine_height": { - "default": 220 - }, - "machine_heated_bed": { - "default": false - }, - "machine_center_is_zero": { - "default": false - }, - "machine_gcode_flavor": { - "default": "RepRap" - }, - "machine_platform_offset": { - "default": [6, 1320, 0] - }, - "material_print_temperature": { "default": 210.0, "visible": true }, - "material_bed_temperature": { "default": 0 }, - "material_diameter": { "default": 1.75 }, - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": true }, - "wall_line_count": { "default": 3, "visible": false }, - "wall_thickness": { "default": 1.2, "visible": false }, - "top_bottom_thickness": { "default": 1.2, "visible": false }, - "infill_sparse_density": { "default": 20.0 }, - "infill_overlap": { "default": 15.0, "visible": false }, - "speed_print": { "default": 60.0 }, - "speed_travel": { "default": 160.0 }, - "speed_layer_0": { "default": 30.0, "visible": true }, - "speed_wall_x": { "default": 35.0, "visible": false }, - "speed_wall_0": { "default": 30.0, "visible": false }, - "speed_infill": { "default": 80.0, "visible": true }, - "speed_topbottom": { "default": 35.0, "visible": false }, - "skirt_speed": { "default": 35.0, "visible": false }, - "skirt_line_count": { "default": 4 }, - "skirt_minimal_length": { "default": 30.0, "visible": false }, - "skirt_gap": { "default": 6.0 }, - "cool_fan_full_at_height": { "default": 0.4, "visible": false }, - "support_enable": { "default": false } - } -} diff --git a/resources/machines/bq_hephestos_xl.json b/resources/machines/bq_hephestos_xl.json deleted file mode 100644 index 5ce1dc3a7f..0000000000 --- a/resources/machines/bq_hephestos_xl.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "id": "bq_hephestos_xl", - "version": 1, - "name": "BQ Prusa i3 Hephestos XL", - "manufacturer": "Other", - "author": "BQ", - "platform": "bq_hephestos_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_start_gcode": { - "default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "default": 200 - }, - "machine_depth": { - "default": 300 - }, - "machine_height": { - "default": 180 - }, - "machine_heated_bed": { - "default": false - }, - "machine_center_is_zero": { - "default": false - }, - "machine_gcode_flavor": { - "default": "RepRap" - }, - "machine_platform_offset": { - "default": [0, -82, 0] - }, - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": false }, - "wall_thickness": { "default": 1.0, "visible": false }, - "top_bottom_thickness": { "default": 1.0, "visible": false}, - "bottom_thickness": { "default": 1.0, "visible": false }, - "material_print_temperature": { "default": 220, "visible": true }, - "material_bed_temperature": { "default": 0, "visible": false }, - "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 40.0}, - "speed_infill": { "default": 40.0, "visible": true }, - "speed_wall": { "default": 35.0, "visible": true}, - "speed_topbottom": { "default": 35.0, "visible": true }, - "speed_travel": { "default": 120.0 }, - "speed_layer_0": { "default": 20.0, "visible": false }, - "support_enable": { "default": true } - } -} diff --git a/resources/machines/bq_witbox.json b/resources/machines/bq_witbox.json deleted file mode 100644 index 83ac707ff6..0000000000 --- a/resources/machines/bq_witbox.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "id": "bq_witbox", - "version": 1, - "name": "BQ Witbox", - "manufacturer": "Other", - "author": "BQ", - "platform": "bq_witbox_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_start_gcode": { - "default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "default": 297 - }, - "machine_depth": { - "default": 210 - }, - "machine_height": { - "default": 200 - }, - "machine_heated_bed": { - "default": false - }, - "machine_center_is_zero": { - "default": false - }, - "machine_gcode_flavor": { - "default": "RepRap" - }, - "machine_platform_offset": { - "default": [0, -145, -38] - }, - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": false }, - "wall_thickness": { "default": 1.0, "visible": false }, - "top_bottom_thickness": { "default": 1.0, "visible": false}, - "bottom_thickness": { "default": 1.0, "visible": false }, - "material_print_temperature": { "default": 220, "visible": true }, - "material_bed_temperature": { "default": 0, "visible": false }, - "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 40.0}, - "speed_infill": { "default": 40.0, "visible": true }, - "speed_wall": { "default": 35.0, "visible": true}, - "speed_topbottom": { "default": 35.0, "visible": true }, - "speed_travel": { "default": 120.0 }, - "speed_layer_0": { "default": 20.0, "visible": false }, - "support_enable": { "default": true } - } -} diff --git a/resources/machines/bq_witbox_2.json b/resources/machines/bq_witbox_2.json deleted file mode 100644 index 61ce18a161..0000000000 --- a/resources/machines/bq_witbox_2.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "id": "bq_witbox_2", - "version": 1, - "name": "BQ Witbox 2", - "manufacturer": "Other", - "author": "BQ", - "platform": "bq_witbox_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_start_gcode": { - "default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" - }, - "machine_width": { - "default": 297 - }, - "machine_depth": { - "default": 210 - }, - "machine_height": { - "default": 200 - }, - "machine_heated_bed": { - "default": false - }, - "machine_center_is_zero": { - "default": false - }, - "machine_gcode_flavor": { - "default": "RepRap" - }, - "machine_platform_offset": { - "default": [0, -145, -38] - }, - "material_print_temperature": { "default": 210.0, "visible": true }, - "material_bed_temperature": { "default": 0 }, - "material_diameter": { "default": 1.75 }, - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": true }, - "wall_line_count": { "default": 3, "visible": false }, - "wall_thickness": { "default": 1.2, "visible": false }, - "top_bottom_thickness": { "default": 1.2, "visible": false }, - "infill_sparse_density": { "default": 20.0 }, - "infill_overlap": { "default": 15.0, "visible": false }, - "speed_print": { "default": 60.0 }, - "speed_travel": { "default": 160.0 }, - "speed_layer_0": { "default": 30.0, "visible": true }, - "speed_wall_x": { "default": 35.0, "visible": false }, - "speed_wall_0": { "default": 30.0, "visible": false }, - "speed_infill": { "default": 80.0, "visible": true }, - "speed_topbottom": { "default": 35.0, "visible": false }, - "skirt_speed": { "default": 35.0, "visible": false }, - "skirt_line_count": { "default": 4 }, - "skirt_minimal_length": { "default": 30.0, "visible": false }, - "skirt_gap": { "default": 6.0 }, - "cool_fan_full_at_height": { "default": 0.4, "visible": false }, - "support_enable": { "default": false } - } -} diff --git a/resources/machines/grr_neo.json b/resources/machines/grr_neo.json deleted file mode 100644 index e2eb9aae73..0000000000 --- a/resources/machines/grr_neo.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "id": "grr_neo", - "version": 1, - "name": "German RepRap Neo", - "manufacturer": "Other", - "author": "Other", - "icon": "icon_ultimaker.png", - "platform": "grr_neo_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - "visible": "true", - - "overrides": { - "machine_width": { "default": 150 }, - "machine_height": { "default": 150 }, - "machine_depth": { "default": 150 }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.5 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 75 }, - "machine_head_shape_min_y": { "default": 18 }, - "machine_head_shape_max_x": { "default": 18 }, - "machine_head_shape_max_y": { "default": 35 }, - "machine_nozzle_gantry_distance": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - }, - - "material_bed_temperature": { "visible": false } - } -} From 8606961c3fcae83abffa2b28d1dc23e2126d978c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 14:42:01 +0200 Subject: [PATCH 098/224] Fix name of author Contributes to issue CURA-1278. --- resources/definitions/innovo_inventor.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index 30e5a53094..ce3c27ee14 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -4,7 +4,7 @@ "name": "Innovo INVENTOR", "inherits": "fdmprinter", "metadata": { - "author": "AR", + "author": "Adam Rumjahn", "manufacturer": "Innovo", "category": "Other", "file_formats": "text/x-gcode", From 2cf025c91aefa56cb59643b96e3945dbb220248a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 15:50:41 +0200 Subject: [PATCH 099/224] Translate definition for M180 Contributes to issue CURA-1278. --- resources/definitions/m180.def.json | 58 +++++++++++++++++++++++++++++ resources/machines/m180.json | 39 ------------------- 2 files changed, 58 insertions(+), 39 deletions(-) create mode 100644 resources/definitions/m180.def.json delete mode 100644 resources/machines/m180.json diff --git a/resources/definitions/m180.def.json b/resources/definitions/m180.def.json new file mode 100644 index 0000000000..7938ff79cb --- /dev/null +++ b/resources/definitions/m180.def.json @@ -0,0 +1,58 @@ +{ + "id": "m180", + "version": 2, + "name": "Malyan M180", + "inherits": "fdmprinter", + "metadata": { + "author": "Ruben Dulek", + "manufacturer": "Malyan", + "category": "Other", + "file_formats": "application/x3g" + }, + + "overrides": { + "settings": { + "machine_width": { + "default_value": 230 + }, + "machine_height": { + "default_value": 165 + }, + "machine_depth": { + "default_value": 145 + }, + "machine_center_is_zero": { + "default_value": true + }, + "machine_nozzle_size": { + "default_value": 0.4, + "min_value": "0.001" + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [ -75, 35 ], + [ -75, -18 ], + [ 18, -18 ], + [ 18, 35 ] + ] + }, + "gantry_height": { + "default_value": 55 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "M136\nM73 P0\nM103\nG21\nG90\nM320\n;(**** begin homing ****)\nG162 X Y F4000\nG161 Z F3500\nG92 Z-5\nG1 Z0.0\nG161 Z F100\nM132 X Y Z A B\n;(**** end homing ****)\nG92 X147 Y66 Z5\nG1 X105 Y-60 Z10 F4000.0\nG130 X127 Y127 A127 B127\nG0 X105 Y-60\nG1 Z0.3 F300\nG92 E0\nG1 X100 E10 F300\nG92 E0\nG1 Z0.0 F300\nM320" + }, + "machine_end_gcode": { + "default_value": "G92 Z0\nG1 Z10 F400\nM18\nM109 S0 T0\nM104 S0 T0\nM73 P100 (end build progress)\nG162 X Y F3000\nM18" + }, + "material_diameter": { + "default_value": 1.75, + "min_value_warning": "1.5", + "max_value_warning": "2.0" + } + } + } +} \ No newline at end of file diff --git a/resources/machines/m180.json b/resources/machines/m180.json deleted file mode 100644 index 7e31577ac2..0000000000 --- a/resources/machines/m180.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "id": "m180", - "version": 1, - "name": "Malyan M180", - "manufacturer": "Other", - "icon": "icon_ultimaker.png", - "platform": "", - "file_formats": "application/x3g", - "inherits": "fdmprinter.json", - - "machine_settings": { - "machine_width": { "default": 230 }, - "machine_height": { "default": 165 }, - "machine_depth": { "default": 145 }, - "machine_center_is_zero": { "default": true }, - "machine_nozzle_size": { "default": 0.4, "min_value": "0.001" }, - "machine_head_with_fans_polygon": { - "default": [ - [ -75, 35 ], - [ -75, -18 ], - [ 18, -18 ], - [ 18, 35 ] - ] - }, - "gantry_height": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode": { "default": "M136\nM73 P0\nM103\nG21\nG90\nM320\n;(**** begin homing ****)\nG162 X Y F4000\nG161 Z F3500\nG92 Z-5\nG1 Z0.0\nG161 Z F100\nM132 X Y Z A B\n;(**** end homing ****)\nG92 X147 Y66 Z5\nG1 X105 Y-60 Z10 F4000.0\nG130 X127 Y127 A127 B127\nG0 X105 Y-60\nG1 Z0.3 F300\nG92 E0\nG1 X100 E10 F300\nG92 E0\nG1 Z0.0 F300\nM320" }, - "machine_end_gcode": { "default": "G92 Z0\nG1 Z10 F400\nM18\nM109 S0 T0\nM104 S0 T0\nM73 P100 (end build progress)\nG162 X Y F3000\nM18" } - }, - - "overrides": { - "material_bed_temperature": { "visible": "True" }, - "material_diameter": { - "default": 1.75, - "min_value_warning": "1.5", - "max_value_warning": "2.0" - } - } -} From 6c74350c6e0cc0bc26db7a6a0c54d82b3e6066e1 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 17:40:56 +0200 Subject: [PATCH 100/224] Merge Contributes to issue CURA-1278. --- resources/definitions/bq_hephestos.def.json | 45 ++++++++++----------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index 57fa85ab89..ad2fe851bb 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -3,8 +3,7 @@ "name": "BQ Prusa i3 Hephestos", "version": 2, "inherits": "fdmprinter", - "metadata": - { + "metadata": { "author": "BQ", "manufacturer": "BQ", "category": "Other", @@ -27,67 +26,67 @@ "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" }, "machine_width": { - "value": 215 + "default_value": 215 }, "machine_depth": { - "value": 210 + "default_value": 210 }, "machine_height": { - "value": 180 + "default_value": 180 }, "machine_heated_bed": { - "value": false + "default_value": false }, "machine_center_is_zero": { - "value": false + "default_value": false }, "machine_gcode_flavor": { - "value": "RepRap" + "default_value": "RepRap" }, "layer_height": { - "value": 0.2 + "default_value": 0.2 }, "layer_height_0": { - "value": 0.2 + "default_value": 0.2 }, "wall_thickness": { - "value": 1.0 + "default_value": 1.0 }, "top_bottom_thickness": { - "value": 1.0 + "default_value": 1.0 }, "bottom_thickness": { - "value": 1.0 + "default_value": 1.0 }, "material_print_temperature": { - "value": 220 + "default_value": 220 }, "material_bed_temperature": { - "value": 0 + "default_value": 0 }, "material_diameter": { - "value": 1.75 + "default_value": 1.75 }, "speed_print": { - "value": 40.0 + "default_value": 40.0 }, "speed_infill": { - "value": 40.0 + "default_value": 40.0 }, "speed_wall": { - "value": 35.0 + "default_value": 35.0 }, "speed_topbottom": { - "value": 35.0 + "default_value": 35.0 }, "speed_travel": { - "value": 120.0 + "default_value": 120.0 }, "speed_layer_0": { - "value": 20.0 + "default_value": 20.0 }, "support_enable": { - "value": true + "default_value": true } } } \ No newline at end of file From ad1b08c080886573539e130d87777c305fead41f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:01:02 +0200 Subject: [PATCH 101/224] Put settings in overrides JSON category Not in a subcategory of settings or anything. Contributes to issue CURA-1278. --- resources/definitions/m180.def.json | 82 ++++++++++++++--------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/resources/definitions/m180.def.json b/resources/definitions/m180.def.json index 7938ff79cb..36d8be6e1f 100644 --- a/resources/definitions/m180.def.json +++ b/resources/definitions/m180.def.json @@ -11,48 +11,46 @@ }, "overrides": { - "settings": { - "machine_width": { - "default_value": 230 - }, - "machine_height": { - "default_value": 165 - }, - "machine_depth": { - "default_value": 145 - }, - "machine_center_is_zero": { - "default_value": true - }, - "machine_nozzle_size": { - "default_value": 0.4, - "min_value": "0.001" - }, - "machine_head_with_fans_polygon": { - "default_value": [ - [ -75, 35 ], - [ -75, -18 ], - [ 18, -18 ], - [ 18, 35 ] - ] - }, - "gantry_height": { - "default_value": 55 - }, - "machine_gcode_flavor": { - "default_value": "RepRap (Marlin/Sprinter)" - }, - "machine_start_gcode": { - "default_value": "M136\nM73 P0\nM103\nG21\nG90\nM320\n;(**** begin homing ****)\nG162 X Y F4000\nG161 Z F3500\nG92 Z-5\nG1 Z0.0\nG161 Z F100\nM132 X Y Z A B\n;(**** end homing ****)\nG92 X147 Y66 Z5\nG1 X105 Y-60 Z10 F4000.0\nG130 X127 Y127 A127 B127\nG0 X105 Y-60\nG1 Z0.3 F300\nG92 E0\nG1 X100 E10 F300\nG92 E0\nG1 Z0.0 F300\nM320" - }, - "machine_end_gcode": { - "default_value": "G92 Z0\nG1 Z10 F400\nM18\nM109 S0 T0\nM104 S0 T0\nM73 P100 (end build progress)\nG162 X Y F3000\nM18" - }, - "material_diameter": { - "default_value": 1.75, - "min_value_warning": "1.5", - "max_value_warning": "2.0" - } + "machine_width": { + "default_value": 230 + }, + "machine_height": { + "default_value": 165 + }, + "machine_depth": { + "default_value": 145 + }, + "machine_center_is_zero": { + "default_value": true + }, + "machine_nozzle_size": { + "default_value": 0.4, + "min_value": "0.001" + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [ -75, 35 ], + [ -75, -18 ], + [ 18, -18 ], + [ 18, 35 ] + ] + }, + "gantry_height": { + "default_value": 55 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "M136\nM73 P0\nM103\nG21\nG90\nM320\n;(**** begin homing ****)\nG162 X Y F4000\nG161 Z F3500\nG92 Z-5\nG1 Z0.0\nG161 Z F100\nM132 X Y Z A B\n;(**** end homing ****)\nG92 X147 Y66 Z5\nG1 X105 Y-60 Z10 F4000.0\nG130 X127 Y127 A127 B127\nG0 X105 Y-60\nG1 Z0.3 F300\nG92 E0\nG1 X100 E10 F300\nG92 E0\nG1 Z0.0 F300\nM320" + }, + "machine_end_gcode": { + "default_value": "G92 Z0\nG1 Z10 F400\nM18\nM109 S0 T0\nM104 S0 T0\nM73 P100 (end build progress)\nG162 X Y F3000\nM18" + }, + "material_diameter": { + "default_value": 1.75, + "min_value_warning": "1.5", + "max_value_warning": "2.0" } } } \ No newline at end of file From 232e4fbe0df3f73834aadd2c81f8ebaafbd10c33 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:01:42 +0200 Subject: [PATCH 102/224] Put settings in overrides JSON category Not in a subcategory of settings or anything. Contributes to issue CURA-1278. --- resources/definitions/bq_hephestos.def.json | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index ad2fe851bb..09081f4814 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -43,6 +43,9 @@ "machine_gcode_flavor": { "default_value": "RepRap" }, + "machine_platform_offset": { + "default_value": [ 0, -82, 0 ] + }, "layer_height": { "default_value": 0.2 }, @@ -50,13 +53,13 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1.0 + "default_value": 1 }, "top_bottom_thickness": { - "default_value": 1.0 + "default_value": 1 }, "bottom_thickness": { - "default_value": 1.0 + "default_value": 1 }, "material_print_temperature": { "default_value": 220 @@ -68,22 +71,22 @@ "default_value": 1.75 }, "speed_print": { - "default_value": 40.0 + "default_value": 40 }, "speed_infill": { - "default_value": 40.0 + "default_value": 40 }, "speed_wall": { - "default_value": 35.0 + "default_value": 35 }, "speed_topbottom": { - "default_value": 35.0 + "default_value": 35 }, "speed_travel": { - "default_value": 120.0 + "default_value": 120 }, "speed_layer_0": { - "default_value": 20.0 + "default_value": 20 }, "support_enable": { "default_value": true From d29e36694586188b4b7ba10826dd71afc00a2819 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:10:12 +0200 Subject: [PATCH 103/224] Fix BQ Hephestos 2 definition The settings were in the wrong category. They were defined by value instead of default value, and the metadata was in there double. Contributes to issue CURA-1278. --- resources/definitions/bq_hephestos_2.def.json | 65 +++++++++---------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json index dba849ac7e..578f166bcb 100644 --- a/resources/definitions/bq_hephestos_2.def.json +++ b/resources/definitions/bq_hephestos_2.def.json @@ -17,10 +17,6 @@ }, "file_formats": "text/x-gcode" }, - "manufacturer": "BQ", - "author": "BQ", - "platform": "bq_hephestos_2_platform.stl", - "file_formats": "text/x-gcode", "overrides": { "machine_start_gcode": { @@ -30,91 +26,94 @@ "default_value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" }, "machine_width": { - "value": 210 + "default_value": 210 }, "machine_depth": { - "value": 297 + "default_value": 297 }, "machine_height": { - "value": 220 + "default_value": 220 }, "machine_heated_bed": { - "value": false + "default_value": false }, "machine_center_is_zero": { - "value": false + "default_value": false }, "machine_gcode_flavor": { - "value": "RepRap" + "default_value": "RepRap" + }, + "machine_platform_offset": { + "default_value": [6, 1320, 0] }, "material_print_temperature": { - "value": 210.0 + "default_value": 210 }, "material_bed_temperature": { - "value": 0 + "default_value": 0 }, "material_diameter": { - "value": 1.75 + "default_value": 1.75 }, "layer_height": { - "value": 0.2 + "default_value": 0.2 }, "layer_height_0": { - "value": 0.2 + "default_value": 0.2 }, "wall_line_count": { - "value": 3 + "default_value": 3 }, "wall_thickness": { - "value": 1.2 + "default_value": 1.2 }, "top_bottom_thickness": { - "value": 1.2 + "default_value": 1.2 }, "infill_sparse_density": { - "value": 20.0 + "default_value": 20 }, "infill_overlap": { - "value": 15.0 + "default_value": 15 }, "speed_print": { - "value": 60.0 + "default_value": 60 }, "speed_travel": { - "value": 160.0 + "default_value": 160 }, "speed_layer_0": { - "value": 30.0 + "default_value": 30 }, "speed_wall_x": { - "value": 35.0 + "default_value": 35 }, "speed_wall_0": { - "value": 30.0 + "default_value": 30 }, "speed_infill": { - "value": 80.0 + "default_value": 80 }, "speed_topbottom": { - "value": 35.0 + "default_value": 35 }, "skirt_speed": { - "value": 35.0 + "default_value": 35 }, "skirt_line_count": { - "value": 4 + "default_value": 4 }, "skirt_minimal_length": { - "value": 30.0 + "default_value": 30 }, "skirt_gap": { - "value": 6.0 + "default_value": 6 }, "cool_fan_full_at_height": { - "value": 0.4 + "default_value": 0.4 }, "support_enable": { - "value": false + "default_value": false } } } From caa108c3cfda8d803bf5613355baae4ebbd8b34a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:12:52 +0200 Subject: [PATCH 104/224] Default value and overrides category The settings must be in the 'overrides' category, not in the 'settings' category. Also, define a default value rather than a value. Contributes to issue CURA-1278. --- .../definitions/bq_hephestos_xl.def.json | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json index 6d4c7fdd52..ce7a95b799 100644 --- a/resources/definitions/bq_hephestos_xl.def.json +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -17,6 +17,7 @@ ] } }, + "overrides": { "machine_start_gcode": { "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" @@ -25,67 +26,70 @@ "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" }, "machine_width": { - "value": 200 + "default_value": 200 }, "machine_depth": { - "value": 300 + "default_value": 300 }, "machine_height": { - "value": 180 + "default_value": 180 }, "machine_heated_bed": { - "value": false + "default_value": false }, "machine_center_is_zero": { - "value": false + "default_value": false }, "machine_gcode_flavor": { - "value": "RepRap" + "default_value": "RepRap" + }, + "machine_platform_offset": { + "default_value": [0, -82, 0] }, "layer_height": { - "value": 0.2 + "default_value": 0.2 }, "layer_height_0": { - "value": 0.2 + "default_value": 0.2 }, "wall_thickness": { - "value": 1.0 + "default_value": 1 }, "top_bottom_thickness": { - "value": 1.0 + "default_value": 1 }, "bottom_thickness": { - "value": 1.0 + "default_value": 1 }, "material_print_temperature": { - "value": 220 + "default_value": 220 }, "material_bed_temperature": { - "value": 0 + "default_value": 0 }, "material_diameter": { - "value": 1.75 + "default_value": 1.75 }, "speed_print": { - "value": 40.0 + "default_value": 40 }, "speed_infill": { - "value": 40.0 + "default_value": 40 }, "speed_wall": { - "value": 35.0 + "default_value": 35 }, "speed_topbottom": { - "value": 35.0 + "default_value": 35 }, "speed_travel": { - "value": 120.0 + "default_value": 120 }, "speed_layer_0": { - "value": 20.0 + "default_value": 20 }, "support_enable": { - "value": true + "default_value": true } } } \ No newline at end of file From dc82a9004797b9dd13812e0e4d740509194ad0b2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:14:12 +0200 Subject: [PATCH 105/224] Default value and overrides category The settings must be in the 'overrides' category, not in the 'settings' category. Also, define a default value rather than a value. Contributes to issue CURA-1278. --- resources/definitions/bq_hephestos.def.json | 3 -- resources/definitions/bq_hephestos_2.def.json | 3 -- .../definitions/bq_hephestos_xl.def.json | 3 -- resources/definitions/bq_witbox.def.json | 43 ++++++++++--------- 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index 09081f4814..b9f0f3dca5 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -43,9 +43,6 @@ "machine_gcode_flavor": { "default_value": "RepRap" }, - "machine_platform_offset": { - "default_value": [ 0, -82, 0 ] - }, "layer_height": { "default_value": 0.2 }, diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json index 578f166bcb..e072fbf1db 100644 --- a/resources/definitions/bq_hephestos_2.def.json +++ b/resources/definitions/bq_hephestos_2.def.json @@ -43,9 +43,6 @@ "machine_gcode_flavor": { "default_value": "RepRap" }, - "machine_platform_offset": { - "default_value": [6, 1320, 0] - }, "material_print_temperature": { "default_value": 210 }, diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json index ce7a95b799..224d219504 100644 --- a/resources/definitions/bq_hephestos_xl.def.json +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -43,9 +43,6 @@ "machine_gcode_flavor": { "default_value": "RepRap" }, - "machine_platform_offset": { - "default_value": [0, -82, 0] - }, "layer_height": { "default_value": 0.2 }, diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json index d9529cdae6..3d021cc529 100644 --- a/resources/definitions/bq_witbox.def.json +++ b/resources/definitions/bq_witbox.def.json @@ -17,6 +17,7 @@ ] } }, + "overrides": { "machine_start_gcode": { "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" @@ -25,67 +26,67 @@ "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" }, "machine_width": { - "value": 297 + "default_value": 297 }, "machine_depth": { - "value": 210 + "default_value": 210 }, "machine_height": { - "value": 200 + "default_value": 200 }, "machine_heated_bed": { - "value": false + "default_value": false }, "machine_center_is_zero": { - "value": false + "default_value": false }, "machine_gcode_flavor": { - "value": "RepRap" + "default_value": "RepRap" }, "layer_height": { - "value": 0.2 + "default_value": 0.2 }, "layer_height_0": { - "value": 0.2 + "default_value": 0.2 }, "wall_thickness": { - "value": 1 + "default_value": 1 }, "top_bottom_thickness": { - "value": 1 + "default_value": 1 }, "bottom_thickness": { - "value": 1 + "default_value": 1 }, "material_print_temperature": { - "value": 220 + "default_value": 220 }, "material_bed_temperature": { - "value": 0 + "default_value": 0 }, "material_diameter": { - "value": 1.75 + "default_value": 1.75 }, "speed_print": { - "value": 40 + "default_value": 40 }, "speed_infill": { - "value": 40 + "default_value": 40 }, "speed_wall": { - "value": 35 + "default_value": 35 }, "speed_topbottom": { - "value": 35 + "default_value": 35 }, "speed_travel": { - "value": 120 + "default_value": 120 }, "speed_layer_0": { - "value": 20 + "default_value": 20 }, "support_enable": { - "value": true + "default_value": true } } From 9aaa81be50704e7a0835444ec922b349247196df Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:15:43 +0200 Subject: [PATCH 106/224] Default value and overrides category The settings must be in the 'overrides' category, not in the 'settings' category. Also, define a default value rather than a value. Contributes to issue CURA-1278. --- resources/definitions/bq_witbox_2.def.json | 69 +++++++++++----------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/resources/definitions/bq_witbox_2.def.json b/resources/definitions/bq_witbox_2.def.json index 43e6968aba..58f70c95b7 100644 --- a/resources/definitions/bq_witbox_2.def.json +++ b/resources/definitions/bq_witbox_2.def.json @@ -3,8 +3,7 @@ "version": 2, "name": "BQ Witbox 2", "inherits": "fdmprinter", - "metadata": - { + "metadata": { "author": "BQ", "manufacturer": "BQ", "category": "Other", @@ -12,102 +11,102 @@ "platform": "bq_witbox_platform.stl" }, - "settings": { + "overrides": { "machine_start_gcode": { - "value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" + "default_value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" }, "machine_end_gcode": { - "value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" + "default_value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" }, "machine_width": { - "value": 297 + "default_value": 297 }, "machine_depth": { - "value": 210 + "default_value": 210 }, "machine_height": { - "value": 200 + "default_value": 200 }, "machine_heated_bed": { - "value": false + "default_value": false }, "machine_center_is_zero": { - "value": false + "default_value": false }, "machine_gcode_flavor": { - "value": "RepRap" + "default_value": "RepRap" }, "machine_platform_offset": { - "value": [0, -145, -38] + "default_value": [0, -145, -38] }, "material_print_temperature": { - "value": 210.0 + "default_value": 210 }, "material_bed_temperature": { - "value": 0 + "default_value": 0 }, "material_diameter": { - "value": 1.75 + "default_value": 1.75 }, "layer_height": { - "value": 0.2 + "default_value": 0.2 }, "layer_height_0": { - "value": 0.2 + "default_value": 0.2 }, "wall_line_count": { - "value": 3 + "default_value": 3 }, "wall_thickness": { - "value": 1.2 + "default_value": 1.2 }, "top_bottom_thickness": { - "value": 1.2 + "default_value": 1.2 }, "infill_sparse_density": { - "value": 20.0 + "default_value": 20 }, "infill_overlap": { - "value": 15.0 + "default_value": 15 }, "speed_print": { - "value": 60.0 + "default_value": 60 }, "speed_travel": { - "value": 160.0 + "default_value": 160 }, "speed_layer_0": { - "value": 30.0 + "default_value": 30 }, "speed_wall_x": { - "value": 35.0 + "default_value": 35 }, "speed_wall_0": { - "value": 30.0 + "default_value": 30 }, "speed_infill": { - "value": 80.0 + "default_value": 80 }, "speed_topbottom": { - "value": 35.0 + "default_value": 35 }, "skirt_speed": { - "value": 35.0 + "default_value": 35 }, "skirt_line_count": { - "value": 4 + "default_value": 4 }, "skirt_minimal_length": { - "value": 30.0 + "default_value": 30 }, "skirt_gap": { - "value": 6.0 + "default_value": 6 }, "cool_fan_full_at_height": { - "value": 0.4 + "default_value": 0.4 }, "support_enable": { - "value": false + "default_value": false } } } \ No newline at end of file From 0298e3adcae95f72554e0b4aff3918b86817e6ad Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:16:43 +0200 Subject: [PATCH 107/224] Use default value instead of value Contributes to issue CURA-1278. --- resources/definitions/grr_neo.def.json | 30 +++++++++++++------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/resources/definitions/grr_neo.def.json b/resources/definitions/grr_neo.def.json index 710303383b..3fb6804c40 100644 --- a/resources/definitions/grr_neo.def.json +++ b/resources/definitions/grr_neo.def.json @@ -14,49 +14,49 @@ "overrides": { "machine_width": { - "value": 150 + "default_value": 150 }, "machine_height": { - "value": 150 + "default_value": 150 }, "machine_depth": { - "value": 150 + "default_value": 150 }, "machine_center_is_zero": { - "value": false + "default_value": false }, "machine_nozzle_size": { - "value": 0.5 + "default_value": 0.5 }, "machine_nozzle_heat_up_speed": { - "value": 2 + "default_value": 2 }, "machine_nozzle_cool_down_speed": { - "value": 2 + "default_value": 2 }, "machine_head_shape_min_x": { - "value": 75 + "default_value": 75 }, "machine_head_shape_min_y": { - "value": 18 + "default_value": 18 }, "machine_head_shape_max_x": { - "value": 18 + "default_value": 18 }, "machine_head_shape_max_y": { - "value": 35 + "default_value": 35 }, "machine_nozzle_gantry_distance": { - "value": 55 + "default_value": 55 }, "machine_gcode_flavor": { - "value": "RepRap (Marlin/Sprinter)" + "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { - "value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" } } } \ No newline at end of file From 45382dc088a33bcced404fd5088be63fa8db70b5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:17:44 +0200 Subject: [PATCH 108/224] Default value and overrides category The settings must be in the 'overrides' category, not in the 'settings' category. Also, define a default value rather than a value. Contributes to issue CURA-1278. --- .../definitions/innovo_inventor.def.json | 61 ++++++++++--------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index ce3c27ee14..5ab8d4f2e1 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -10,94 +10,95 @@ "file_formats": "text/x-gcode", "platform": "inventor_platform.stl" }, - "settings": { + + "overrides": { "machine_width": { - "value": 340 + "default_value": 340 }, "machine_height": { - "value": 290 + "default_value": 290 }, "machine_depth": { - "value": 300 + "default_value": 300 }, "machine_heated_bed": { - "value": true + "default_value": true }, "machine_center_is_zero": { - "value": false + "default_value": false }, "machine_nozzle_size": { - "value": 0.4 + "default_value": 0.4 }, "machine_head_shape_min_x": { - "value": 43.7 + "default_value": 43.7 }, "machine_head_shape_min_y": { - "value": 19.2 + "default_value": 19.2 }, "machine_head_shape_max_x": { - "value": 43.7 + "default_value": 43.7 }, "machine_head_shape_max_y": { - "value": 55 + "default_value": 55 }, "machine_nozzle_gantry_distance": { - "value": 82.3 + "default_value": 82.3 }, "machine_nozzle_offset_x_1": { - "value": 0 + "default_value": 0 }, "machine_nozzle_offset_y_1": { - "value": 15 + "default_value": 15 }, "machine_gcode_flavor": { - "value": "RepRap (Marlin/Sprinter)" + "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position" + "default_value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position" }, "machine_end_gcode": { - "value": "M104 S0\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors" + "default_value": "M104 S0\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors" }, "machine_platform_offset": { - "value": [-180, -0.25, 160] + "default_value": [-180, -0.25, 160] }, "layer_height": { - "value": 0.15 + "default_value": 0.15 }, "wall_thickness": { - "value": 0.8 + "default_value": 0.8 }, "top_bottom_thickness": { - "value": 0.3 + "default_value": 0.3 }, "material_print_temperature": { - "value": 215 + "default_value": 215 }, "material_bed_temperature": { - "value": 60 + "default_value": 60 }, "material_diameter": { - "value": 1.75 + "default_value": 1.75 }, "speed_print": { - "value": 60 + "default_value": 60 }, "speed_infill": { - "value": 100 + "default_value": 100 }, "speed_topbottom": { - "value": 30 + "default_value": 30 }, "speed_travel": { - "value": 150 + "default_value": 150 }, "speed_layer_0": { - "value": 30.0, + "default_value": 30.0, "min_value": 0.1 }, "infill_overlap": { - "value": 10.0 + "default_value": 10.0 } } } \ No newline at end of file From e13878b3436d5472bb3d53f433412d676e535d31 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:27:35 +0200 Subject: [PATCH 109/224] Translate definition for 3DMaker Starter Contributes to issue CURA-1278. --- resources/definitions/maker_starter.def.json | 190 +++++++++++++++++++ resources/machines/maker_starter.json | 81 -------- 2 files changed, 190 insertions(+), 81 deletions(-) create mode 100644 resources/definitions/maker_starter.def.json delete mode 100644 resources/machines/maker_starter.json diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json new file mode 100644 index 0000000000..81ad45698e --- /dev/null +++ b/resources/definitions/maker_starter.def.json @@ -0,0 +1,190 @@ +{ + "id": "maker_starter", + "version": 2, + "name": "3DMaker Starter", + "inherits": "fdmprinter", + "metadata": { + "author": "tvlgiao", + "manufacturer": "3DMaker", + "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj", + "icon": "icon_ultimaker2.png", + "platform": "makerstarter_platform.stl" + }, + + "overrides": { + "machine_width": { + "default": 210 + }, + "machine_depth": { + "default": 185 + }, + "machine_height": { + "default": 200 + }, + "machine_heated_bed": { + "default": false + }, + "machine_center_is_zero": { + "default": false + }, + "machine_nozzle_size": { + "default": 0.4 + }, + "machine_nozzle_heat_up_speed": { + "default": 2 + }, + "machine_nozzle_cool_down_speed": { + "default": 2 + }, + "machine_head_shape_min_x": { + "default": 0 + }, + "machine_head_shape_min_y": { + "default": 0 + }, + "machine_head_shape_max_x": { + "default": 0 + }, + "machine_head_shape_max_y": { + "default": 0 + }, + "machine_nozzle_gantry_distance": { + "default": 55 + }, + "machine_gcode_flavor": { + "default": "RepRap" + }, + "machine_disallowed_areas": { + "default": [] + }, + "machine_platform_offset": { + "default": [0, 0, 0] + }, + "machine_nozzle_tip_outer_diameter": { + "default": 1 + }, + "machine_nozzle_head_distance": { + "default": 3 + }, + "machine_nozzle_expansion_angle": { + "default": 45 + }, + "layer_height": { + "default": 0.2 + }, + "layer_height_0": { + "default": 0.2 + }, + "wall_line_count": { + "default": 2 + }, + "top_layers": { + "default": 4 + }, + "bottom_layers": { + "default": 4 + }, + "speed_print": { + "default": 50 + }, + "speed_wall": { + "default": 30 + }, + "speed_wall_0": { + "default": 30 + }, + "speed_wall_x": { + "default": 30 + }, + "speed_topbottom": { + "default": 50 + }, + "speed_support": { + "default": 50 + }, + "speed_travel": { + "default": 120 + }, + "speed_layer_0": { + "default": 20 + }, + "skirt_speed": { + "default": 15 + }, + "speed_slowdown_layers": { + "default": 4 + }, + "infill_sparse_density": { + "default": 20 + }, + "cool_fan_speed_min": { + "default": 50 + }, + "cool_fan_speed_max": { + "default": 100 + }, + "cool_fan_full_layer": { + "default": 4 + }, + "cool_min_layer_time": { + "default": 5 + }, + "cool_min_layer_time_fan_speed_max": { + "default": 10 + }, + "support_type": { + "default": "Everywhere" + }, + "support_angle": { + "default": 45 + }, + "support_xy_distance": { + "default": 1 + }, + "support_z_distance": { + "default": 0.2 + }, + "support_top_distance": { + "default": 0.2 + }, + "support_bottom_distance": { + "default": 0.24 + }, + "support_pattern": { + "default": "ZigZag" + }, + "support_infill_rate": { + "default": 15 + }, + "adhesion_type": { + "default": "Raft" + }, + "skirt_minimal_length": { + "default": 100 + }, + "raft_base_line_spacing": { + "default": 2 + }, + "raft_base_thickness": { + "default": 0.3 + }, + "raft_base_line_width": { + "default": 2 + }, + "raft_base_speed": { + "default": 15 + }, + "raft_interface_thickness": { + "default": 0.24 + }, + "raft_interface_line_width": { + "default": 0.6 + }, + "raft_airgap": { + "default": 0.2 + }, + "raft_surface_layers": { + "default": 2 + } + } +} \ No newline at end of file diff --git a/resources/machines/maker_starter.json b/resources/machines/maker_starter.json deleted file mode 100644 index 1d6dfa6a18..0000000000 --- a/resources/machines/maker_starter.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "id": "maker_starter", - "version": 1, - "name": "3DMaker Starter", - "manufacturer": "Other", - "author": "Other", - "icon": "icon_ultimaker2.png", - "platform": "makerstarter_platform.stl", - "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_width": { "default": 210 }, - "machine_depth": { "default": 185 }, - "machine_height": { "default": 200 }, - "machine_heated_bed": { "default": false }, - - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.4 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 0 }, - "machine_head_shape_min_y": { "default": 0 }, - "machine_head_shape_max_x": { "default": 0 }, - "machine_head_shape_max_y": { "default": 0 }, - "machine_nozzle_gantry_distance": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap" }, - "machine_disallowed_areas": { "default": []}, - "machine_platform_offset": { "default": [0.0, 0.0, 0.0] }, - - "machine_nozzle_tip_outer_diameter": { "default": 1.0 }, - "machine_nozzle_head_distance": { "default": 3.0 }, - "machine_nozzle_expansion_angle": { "default": 45 }, - - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": false }, - "wall_line_count": { "default": 2, "visible": true }, - "top_layers": { "default": 4, "visible": true }, - "bottom_layers": { "default": 4, "visible": true }, - "material_print_temperature": { "visible": false }, - "material_bed_temperature": { "visible": false }, - "material_diameter": { "default": 1.75, "visible": false }, - "material_flow": { "visible": false }, - "speed_print": { "default": 50.0 }, - "speed_wall": { "default": 30.0 }, - "speed_wall_0": { "default": 30.0 }, - "speed_wall_x": { "default": 30.0 }, - "speed_topbottom": { "default": 50.0 }, - "speed_support": { "default": 50.0 }, - "speed_travel": { "default": 120.0 }, - "speed_layer_0": { "default": 20.0 }, - "skirt_speed": { "default": 15.0 }, - "speed_slowdown_layers": { "default": 4 }, - "infill_sparse_density": { "default": 20.0 }, - "cool_fan_speed_min": { "default": 50.0 }, - "cool_fan_speed_max": { "default": 100.0 }, - "cool_fan_full_layer": { "default": 4, "visible": true }, - "cool_min_layer_time": { "default": 5.0 }, - "cool_min_layer_time_fan_speed_max": { "default": 10.0 }, - "support_type": { "default": "Everywhere" }, - "support_angle": { "default": 45.0, "visible": true }, - "support_xy_distance": { "default": 1 }, - "support_z_distance": { "default": 0.2 }, - "support_top_distance": { "default": 0.2 }, - "support_bottom_distance": { "default": 0.24 }, - "support_pattern": { "default": "ZigZag" }, - "support_infill_rate": { "default": 15, "visible": true }, - "adhesion_type": { "default": "Raft" }, - "skirt_minimal_length": { "default": 100.0 }, - "raft_base_line_spacing": { "default": 2.0 }, - "raft_base_thickness": { "default": 0.3 }, - "raft_base_line_width": { "default": 2.0 }, - "raft_base_speed": { "default": 15.0 }, - "raft_interface_thickness": { "default": 0.24 }, - "raft_interface_line_width": { "default": 0.6 }, - "raft_airgap": { "default": 0.2 }, - "raft_surface_layers": { "default": 2 } - } -} - - From da03eab355d3fed2d0dea94d1e5dd36f0f8dceec Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:30:28 +0200 Subject: [PATCH 110/224] Use default value rather than 'default' Default is outdated. Contributes to issue CURA-1278. --- resources/definitions/maker_starter.def.json | 116 +++++++++---------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json index 81ad45698e..376fea8c29 100644 --- a/resources/definitions/maker_starter.def.json +++ b/resources/definitions/maker_starter.def.json @@ -13,178 +13,178 @@ "overrides": { "machine_width": { - "default": 210 + "default_value": 210 }, "machine_depth": { - "default": 185 + "default_value": 185 }, "machine_height": { - "default": 200 + "default_value": 200 }, "machine_heated_bed": { - "default": false + "default_value": false }, "machine_center_is_zero": { - "default": false + "default_value": false }, "machine_nozzle_size": { - "default": 0.4 + "default_value": 0.4 }, "machine_nozzle_heat_up_speed": { - "default": 2 + "default_value": 2 }, "machine_nozzle_cool_down_speed": { - "default": 2 + "default_value": 2 }, "machine_head_shape_min_x": { - "default": 0 + "default_value": 0 }, "machine_head_shape_min_y": { - "default": 0 + "default_value": 0 }, "machine_head_shape_max_x": { - "default": 0 + "default_value": 0 }, "machine_head_shape_max_y": { - "default": 0 + "default_value": 0 }, "machine_nozzle_gantry_distance": { - "default": 55 + "default_value": 55 }, "machine_gcode_flavor": { - "default": "RepRap" + "default_value": "RepRap" }, "machine_disallowed_areas": { - "default": [] + "default_value": [] }, "machine_platform_offset": { - "default": [0, 0, 0] + "default_value": [0, 0, 0] }, "machine_nozzle_tip_outer_diameter": { - "default": 1 + "default_value": 1 }, "machine_nozzle_head_distance": { - "default": 3 + "default_value": 3 }, "machine_nozzle_expansion_angle": { - "default": 45 + "default_value": 45 }, "layer_height": { - "default": 0.2 + "default_value": 0.2 }, "layer_height_0": { - "default": 0.2 + "default_value": 0.2 }, "wall_line_count": { - "default": 2 + "default_value": 2 }, "top_layers": { - "default": 4 + "default_value": 4 }, "bottom_layers": { - "default": 4 + "default_value": 4 }, "speed_print": { - "default": 50 + "default_value": 50 }, "speed_wall": { - "default": 30 + "default_value": 30 }, "speed_wall_0": { - "default": 30 + "default_value": 30 }, "speed_wall_x": { - "default": 30 + "default_value": 30 }, "speed_topbottom": { - "default": 50 + "default_value": 50 }, "speed_support": { - "default": 50 + "default_value": 50 }, "speed_travel": { - "default": 120 + "default_value": 120 }, "speed_layer_0": { - "default": 20 + "default_value": 20 }, "skirt_speed": { - "default": 15 + "default_value": 15 }, "speed_slowdown_layers": { - "default": 4 + "default_value": 4 }, "infill_sparse_density": { - "default": 20 + "default_value": 20 }, "cool_fan_speed_min": { - "default": 50 + "default_value": 50 }, "cool_fan_speed_max": { - "default": 100 + "default_value": 100 }, "cool_fan_full_layer": { - "default": 4 + "default_value": 4 }, "cool_min_layer_time": { - "default": 5 + "default_value": 5 }, "cool_min_layer_time_fan_speed_max": { - "default": 10 + "default_value": 10 }, "support_type": { - "default": "Everywhere" + "default_value": "Everywhere" }, "support_angle": { - "default": 45 + "default_value": 45 }, "support_xy_distance": { - "default": 1 + "default_value": 1 }, "support_z_distance": { - "default": 0.2 + "default_value": 0.2 }, "support_top_distance": { - "default": 0.2 + "default_value": 0.2 }, "support_bottom_distance": { - "default": 0.24 + "default_value": 0.24 }, "support_pattern": { - "default": "ZigZag" + "default_value": "ZigZag" }, "support_infill_rate": { - "default": 15 + "default_value": 15 }, "adhesion_type": { - "default": "Raft" + "default_value": "Raft" }, "skirt_minimal_length": { - "default": 100 + "default_value": 100 }, "raft_base_line_spacing": { - "default": 2 + "default_value": 2 }, "raft_base_thickness": { - "default": 0.3 + "default_value": 0.3 }, "raft_base_line_width": { - "default": 2 + "default_value": 2 }, "raft_base_speed": { - "default": 15 + "default_value": 15 }, "raft_interface_thickness": { - "default": 0.24 + "default_value": 0.24 }, "raft_interface_line_width": { - "default": 0.6 + "default_value": 0.6 }, "raft_airgap": { - "default": 0.2 + "default_value": 0.2 }, "raft_surface_layers": { - "default": 2 + "default_value": 2 } } } \ No newline at end of file From 28703981d5df0ac7f36b24887711187581345580 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:42:33 +0200 Subject: [PATCH 111/224] Translate definition for Prusa i3 Contributes to issue CURA-1278. --- resources/definitions/prusa_i3.def.json | 68 +++++++++++++++++++++++++ resources/machines/prusa_i3.json | 36 ------------- 2 files changed, 68 insertions(+), 36 deletions(-) create mode 100644 resources/definitions/prusa_i3.def.json delete mode 100644 resources/machines/prusa_i3.json diff --git a/resources/definitions/prusa_i3.def.json b/resources/definitions/prusa_i3.def.json new file mode 100644 index 0000000000..26c36b605e --- /dev/null +++ b/resources/definitions/prusa_i3.def.json @@ -0,0 +1,68 @@ +{ + "id": "prusa_i3", + "version": 2, + "name": "Prusa i3", + "inherits": "fdmprinter", + "metadata": { + "author": "Quillford", + "manufacturer": "Prusajr", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2", + "platform": "prusai3_platform.stl" + }, + + "overrides": { + "machine_heated_bed": { + "default_value": true + }, + "machine_width": { + "default_value": 200 + }, + "machine_height": { + "default_value": 200 + }, + "machine_depth": { + "default_value": 200 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "machine_head_shape_min_x": { + "default_value": 75 + }, + "machine_head_shape_min_y": { + "default_value": 18 + }, + "machine_head_shape_max_x": { + "default_value": 18 + }, + "machine_head_shape_max_y": { + "default_value": 35 + }, + "machine_nozzle_gantry_distance": { + "default_value": 55 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} \ No newline at end of file diff --git a/resources/machines/prusa_i3.json b/resources/machines/prusa_i3.json deleted file mode 100644 index dcbca32801..0000000000 --- a/resources/machines/prusa_i3.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "id": "prusa_i3", - "version": 1, - "name": "Prusa i3", - "manufacturer": "Other", - "author": "Other", - "icon": "icon_ultimaker2.png", - "platform": "prusai3_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_heated_bed": { "default": true }, - "machine_width": { "default": 200 }, - "machine_height": { "default": 200 }, - "machine_depth": { "default": 200 }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.4 }, - "material_diameter": { "default": 1.75 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 75 }, - "machine_head_shape_min_y": { "default": 18 }, - "machine_head_shape_max_x": { "default": 18 }, - "machine_head_shape_max_y": { "default": 35 }, - "machine_nozzle_gantry_distance": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - } - } -} From 319eef1384c2aff41def14df9f699430cc0d3615 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 16:49:54 +0200 Subject: [PATCH 112/224] Translate definition for Prusa i3 XL Contributes to issue CURA-1278. --- resources/definitions/prusa_i3_xl.def.json | 68 ++++++++++++++++++++++ resources/machines/prusa_i3_xl.json | 36 ------------ 2 files changed, 68 insertions(+), 36 deletions(-) create mode 100644 resources/definitions/prusa_i3_xl.def.json delete mode 100644 resources/machines/prusa_i3_xl.json diff --git a/resources/definitions/prusa_i3_xl.def.json b/resources/definitions/prusa_i3_xl.def.json new file mode 100644 index 0000000000..0c2b9e823f --- /dev/null +++ b/resources/definitions/prusa_i3_xl.def.json @@ -0,0 +1,68 @@ +{ + "id": "prusa_i3_xl", + "version": 2, + "name": "Prusa i3 xl", + "inherits": "fdmprinter.json", + "metadata": { + "author": "guigashm", + "manufacturer": "Prusajr", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2.png", + "platform": "prusai3_xl_platform.stl" + }, + + "overrides": { + "machine_heated_bed": { + "default_value": true + }, + "machine_width": { + "default_value": 200 + }, + "machine_height": { + "default_value": 200 + }, + "machine_depth": { + "default_value": 270 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2.0 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2.0 + }, + "machine_head_shape_min_x": { + "default_value": 75 + }, + "machine_head_shape_min_y": { + "default_value": 18 + }, + "machine_head_shape_max_x": { + "default_value": 18 + }, + "machine_head_shape_max_y": { + "default_value": 35 + }, + "machine_nozzle_gantry_distance": { + "default_value": 55 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} \ No newline at end of file diff --git a/resources/machines/prusa_i3_xl.json b/resources/machines/prusa_i3_xl.json deleted file mode 100644 index b66b974983..0000000000 --- a/resources/machines/prusa_i3_xl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "id": "prusa_i3_xl", - "version": 1, - "name": "Prusa i3 xl", - "manufacturer": "Other", - "author": "Other", - "icon": "icon_ultimaker2.png", - "platform": "prusai3_xl_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_heated_bed": { "default": true }, - "machine_width": { "default": 200 }, - "machine_height": { "default": 200 }, - "machine_depth": { "default": 270 }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.4 }, - "material_diameter": { "default": 1.75 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 75 }, - "machine_head_shape_min_y": { "default": 18 }, - "machine_head_shape_max_x": { "default": 18 }, - "machine_head_shape_max_y": { "default": 35 }, - "machine_nozzle_gantry_distance": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - } - } -} From 35dda003c7791524d9ee975bbf3557b17a358e4c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 17:06:32 +0200 Subject: [PATCH 113/224] Translate definition for RigidBot Also translated the very old active_if properties! Contributes to issue CURA-1278. --- resources/definitions/rigidbot.def.json | 113 ++++++++++++++++++++++++ resources/machines/RigidBot.json | 57 ------------ 2 files changed, 113 insertions(+), 57 deletions(-) create mode 100644 resources/definitions/rigidbot.def.json delete mode 100644 resources/machines/RigidBot.json diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json new file mode 100644 index 0000000000..0de11f09b8 --- /dev/null +++ b/resources/definitions/rigidbot.def.json @@ -0,0 +1,113 @@ +{ + "id": "rigidbot", + "version": 2, + "name": "RigidBot", + "inherits": "fdmprinter", + "metadata": { + "author": "RBC", + "manufacturer": "RigidBot", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "rigidbot_platform.stl" + }, + + "overrides": { + "machine_width": { + "default_value": 254 + }, + "machine_depth": { + "default_value": 254 + }, + "machine_height": { + "default_value": 254 + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "machine_head_shape_min_x": { + "default_value": 0 + }, + "machine_head_shape_min_y": { + "default_value": 0 + }, + "machine_head_shape_max_x": { + "default_value": 0 + }, + "machine_head_shape_max_y": { + "default_value": 0 + }, + "machine_nozzle_gantry_distance": { + "default_value": 0 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." + }, + "machine_end_gcode": { + "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" + }, + "layer_height": { + "default_value": 0.2 + }, + "wall_thickness": { + "default_value": 0.8 + }, + "top_bottom_thickness": { + "default_value": 0.3 + }, + "material_print_temperature": { + "default_value": 195 + }, + "material_bed_temperature": { + "default_value": 60 + }, + "material_diameter": { + "default_value": 1.75 + }, + "speed_print": { + "default_value": 60 + }, + "speed_infill": { + "default_value": 100 + }, + "speed_topbottom": { + "default_value": 15 + }, + "speed_travel": { + "default_value": 150 + }, + "speed_layer_0": { + "default_value": 15, + "min_value": "0.1" + }, + "infill_overlap": { + "default_value": 10 + }, + "cool_fan_enabled": { + "default_value": false + }, + "cool_fan_speed": { + "default_value": 0 + }, + "skirt_line_count": { + "default_value": 3, + "enabled": "adhesion_type == \"Skirt\"" + }, + "skirt_gap": { + "default_value": 4, + "enabled": "adhesion_type == \"Skirt\"" + }, + "skirt_minimal_length": { + "default_value": 200, + "enabled": "adhesion_type == \"Skirt\"" + } + } +} diff --git a/resources/machines/RigidBot.json b/resources/machines/RigidBot.json deleted file mode 100644 index efd5a6e72c..0000000000 --- a/resources/machines/RigidBot.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "id": "rigidbot", - "version": 1, - "name": "RigidBot", - "manufacturer": "Other", - "author": "RBC", - "platform": "rigidbot_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "machine_settings": { - - "machine_width": { "default": 254 }, - "machine_depth": { "default": 254 }, - "machine_height": { "default": 254 }, - "machine_heated_bed": { "default": true }, - - "machine_nozzle_size": { "default": 0.4, - "visible": true - }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 0 }, - "machine_head_shape_min_y": { "default": 0 }, - "machine_head_shape_max_x": { "default": 0 }, - "machine_head_shape_max_y": { "default": 0 }, - "machine_nozzle_gantry_distance": { "default": 0 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." - }, - "machine_end_gcode": { - "default": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" - } - }, - - "overrides": { - "layer_height": { "default": 0.2 }, - "wall_thickness": { "default": 0.8 }, - "top_bottom_thickness": { "default": 0.3, "visible": true }, - "material_print_temperature": { "default": 195, "visible": true }, - "material_bed_temperature": { "default": 60, "visible": true }, - "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 60.0, "visible": true }, - "speed_infill": { "default": 100.0, "visible": true }, - "speed_topbottom": { "default": 15.0, "visible": true }, - "speed_travel": { "default": 150.0, "visible": true }, - "speed_layer_0": { "min_value": "0.1", "default": 15.0, "visible": true }, - "infill_overlap": { "default": 10.0 }, - "cool_fan_enabled": { "default": false, "visible": true }, - "cool_fan_speed": { "default": 0.0, "visible": true }, - "skirt_line_count": { "default": 3, "active_if": { "setting": "adhesion_type", "value": "None" } }, - "skirt_gap": { "default": 4.0, "active_if": { "setting": "adhesion_type", "value": "None" } }, - "skirt_minimal_length": { "default": 200.0, "active_if": { "setting": "adhesion_type", "value": "None" } } - } -} From eb11067d1574e2072718aec161f4d4e96b8c8f15 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 17:14:10 +0200 Subject: [PATCH 114/224] Translate definition for RigidBotBig Also translated the very old active_if properties! Contributes to issue CURA-1278. --- resources/definitions/rigidbot_big.def.json | 116 ++++++++++++++++++++ resources/machines/RigidBotBig.json | 55 ---------- 2 files changed, 116 insertions(+), 55 deletions(-) create mode 100644 resources/definitions/rigidbot_big.def.json delete mode 100644 resources/machines/RigidBotBig.json diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json new file mode 100644 index 0000000000..045f86fafe --- /dev/null +++ b/resources/definitions/rigidbot_big.def.json @@ -0,0 +1,116 @@ +{ + "id": "rigidbotbig", + "version": 2, + "name": "RigidBotBig", + "inherits": "fdmprinter", + "metadata": { + "author": "RBC", + "manufacturer": "RigidBot", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "rigidbotbig_platform.stl" + }, + + "overrides": { + "machine_width": { + "default_value": 400 + }, + "machine_depth": { + "default_value": 300 + }, + "machine_height": { + "default_value": 254 + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "machine_head_shape_min_x": { + "default_value": 0 + }, + "machine_head_shape_min_y": { + "default_value": 0 + }, + "machine_head_shape_max_x": { + "default_value": 0 + }, + "machine_head_shape_max_y": { + "default_value": 0 + }, + "machine_nozzle_gantry_distance": { + "default_value": 0 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." + }, + "machine_end_gcode": { + "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" + }, + "layer_height": { + "default_value": 0.2 + }, + "wall_thickness": { + "default_value": 0.8 + }, + "top_bottom_thickness": { + "default_value": 0.3 + }, + "material_print_temperature": { + "default_value": 195 + }, + "material_bed_temperature": { + "default_value": 60 + }, + "material_diameter": { + "default_value": 1.75 + }, + "speed_print": { + "default_value": 60 + }, + "speed_infill": { + "default_value": 100 + }, + "speed_topbottom": { + "default_value": 15 + }, + "speed_travel": { + "default_value": 150 + }, + "speed_layer_0": { + "default_value": 15, + "min_value": "0.1" + }, + "infill_overlap": { + "default_value": 10 + }, + "cool_fan_enabled": { + "default_value": false + }, + "cool_fan_speed": { + "default_value": 0 + }, + "skirt_line_count": { + "default_value": 3, + "enabled": "adhesion_type == \"Skirt\"" + }, + "skirt_gap": { + "default_value": 4, + "enabled": "adhesion_type == \"Skirt\"" + }, + "skirt_minimal_length": { + "default_value": 200, + "enabled": "adhesion_type == \"Skirt\"" + } + } +} \ No newline at end of file diff --git a/resources/machines/RigidBotBig.json b/resources/machines/RigidBotBig.json deleted file mode 100644 index 0f8fdb1481..0000000000 --- a/resources/machines/RigidBotBig.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "id": "rigidbotbig", - "version": 1, - "name": "RigidBotBig", - "manufacturer": "Other", - "author": "RBC", - "platform": "rigidbotbig_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "machine_settings": { - - "machine_width": { "default": 400 }, - "machine_depth": { "default": 300 }, - "machine_height": { "default": 254 }, - "machine_heated_bed": { "default": true }, - - "machine_nozzle_size": { "default": 0.4}, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 0 }, - "machine_head_shape_min_y": { "default": 0 }, - "machine_head_shape_max_x": { "default": 0 }, - "machine_head_shape_max_y": { "default": 0 }, - "machine_nozzle_gantry_distance": { "default": 0 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." - }, - "machine_end_gcode": { - "default": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" - } - }, - - "overrides": { - "layer_height": { "default": 0.2 }, - "wall_thickness": { "default": 0.8 }, - "top_bottom_thickness": { "default": 0.3, "visible": true }, - "material_print_temperature": { "default": 195, "visible": true }, - "material_bed_temperature": { "default": 60, "visible": true }, - "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 60.0, "visible": true}, - "speed_infill": { "default": 100.0, "visible": true }, - "speed_topbottom": { "default": 15.0, "visible": true }, - "speed_travel": { "default": 150.0, "visible": true }, - "speed_layer_0": { "min_value": "0.1", "default": 15.0, "visible": true }, - "infill_overlap": { "default": 10.0 }, - "cool_fan_enabled": { "default": false, "visible": true}, - "cool_fan_speed": { "default": 0.0, "visible": true }, - "skirt_line_count": { "default": 3, "active_if": { "setting": "adhesion_type", "value": "None" } }, - "skirt_gap": { "default": 4.0, "active_if": { "setting": "adhesion_type", "value": "None" } }, - "skirt_minimal_length": { "default": 200.0, "active_if": { "setting": "adhesion_type", "value": "None" } } - } -} From f15445b1a3f2de6d5e191341059d3c707b628230 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 17:26:01 +0200 Subject: [PATCH 115/224] Translate definition for Ultimaker The preferred variant/profile/material has moved to the metadata. Contributes to issue CURA-1278. --- resources/definitions/ultimaker.def.json | 14 ++++++++++++++ resources/machines/ultimaker.json | 15 --------------- 2 files changed, 14 insertions(+), 15 deletions(-) create mode 100644 resources/definitions/ultimaker.def.json delete mode 100644 resources/machines/ultimaker.json diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json new file mode 100644 index 0000000000..60e4dbbf40 --- /dev/null +++ b/resources/definitions/ultimaker.def.json @@ -0,0 +1,14 @@ +{ + "id": "ultimaker_base", + "version": 2, + "visible": false, + "name": "Ultimaker", + "inherits": "fdmprinter", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "preferred_profile": "Normal Quality", + "preferred_nozzle": "0.4 mm", + "preferred_material": "PLA" + } +} diff --git a/resources/machines/ultimaker.json b/resources/machines/ultimaker.json deleted file mode 100644 index a7a9cd3994..0000000000 --- a/resources/machines/ultimaker.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "ultimaker_base", - "version": 1, - "visible": false, - "name": "Ultimaker", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "inherits": "fdmprinter.json", - - "machine_preferences": { - "prefered_profile": "Normal Quality", - "prefered_variant": "0.4 mm", - "prefered_material": "PLA" - } -} From de7fe1185ed484380405cfd3aed3c5de662c2e05 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 17 May 2016 17:39:06 +0200 Subject: [PATCH 116/224] Translate definition for Ultimaker2 The extruder trains setting has been moved to dual_extrusion_printer.json. It must be merged into fdmprinter later. Contributes to issue CURA-1278. --- resources/definitions/ultimaker2.def.json | 108 ++++++++++++++++++ .../machines/dual_extrusion_printer.json | 58 +++++++++- resources/machines/ultimaker2.json | 95 --------------- 3 files changed, 162 insertions(+), 99 deletions(-) create mode 100644 resources/definitions/ultimaker2.def.json delete mode 100644 resources/machines/ultimaker2.json diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json new file mode 100644 index 0000000000..10b6041f0f --- /dev/null +++ b/resources/definitions/ultimaker2.def.json @@ -0,0 +1,108 @@ +{ + "id": "ultimaker2", + "version": 2, + "name": "Ultimaker 2", + "inherits": "ultimaker", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2.png", + "platform": "ultimaker2_platform.obj", + "platform_texture": "Ultimaker2backplate.png" + }, + "overrides": { + "machine_start_gcode" : { + "default": "" + }, + "machine_end_gcode" : { + "default": "" + }, + "machine_width": { + "default": 223 + }, + "machine_depth": { + "default": 223 + }, + "machine_height": { + "default": 205 + }, + "machine_heated_bed": { + "default": true + }, + "machine_head_with_fans_polygon": + { + "default": [ + [ -42, 12 ], + [ -42, -32 ], + [ 62, 12 ], + [ 62, -32 ] + ] + }, + "machine_center_is_zero": { + "default": false + }, + "machine_nozzle_size": { + "default": 0.4, + "min_value": "0.001" + }, + "machine_nozzle_heat_up_speed": { + "default": 2 + }, + "machine_nozzle_cool_down_speed": { + "default": 2 + }, + "gantry_height": { + "default": 55 + }, + "machine_use_extruder_offset_to_offset_coords": { + "default": true + }, + "machine_gcode_flavor": { + "default": "UltiGCode" + }, + "machine_disallowed_areas": { + "default": [ + [[-115, 112.5], [ -82, 112.5], [ -84, 102.5], [-115, 102.5]], + [[ 115, 112.5], [ 115, 102.5], [ 110, 102.5], [ 108, 112.5]], + [[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]], + [[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]] + ]}, + "machine_platform_offset": { + "default": [9, 0, 0] + }, + "machine_nozzle_tip_outer_diameter": { + "default": 1 + }, + "machine_nozzle_head_distance": { + "default": 3 + }, + "machine_nozzle_expansion_angle": { + "default": 45 + }, + "material_print_temperature": { + "enabled": "False" + }, + "material_bed_temperature": { + "enabled": "False" + }, + "material_diameter": { + "enabled": "False" + }, + "material_flow": { + "enabled": "False" + }, + "retraction_amount": { + "enabled": "False" + }, + "retraction_speed": { + "enabled": "False" + }, + "retraction_retract_speed": { + "enabled": "False" + }, + "retraction_prime_speed": { + "enabled": "False" + } + } +} \ No newline at end of file diff --git a/resources/machines/dual_extrusion_printer.json b/resources/machines/dual_extrusion_printer.json index 2977345bcb..57ad490cdd 100644 --- a/resources/machines/dual_extrusion_printer.json +++ b/resources/machines/dual_extrusion_printer.json @@ -9,12 +9,62 @@ "machine_extruder_trains": { "0": { - "extruder_nr": { "default": 0 }, - "machine_nozzle_offset_x": { "default": 0.0 }, - "machine_nozzle_offset_y": { "default": 0.0 } + "extruder_nr": { + "default": 0 + }, + "machine_nozzle_offset_x": { + "default": 0 + }, + "machine_nozzle_offset_y": { + "default": 0 + }, + "machine_nozzle_heat_up_speed": { + "default": 2 + }, + "machine_nozzle_cool_down_speed": { + "default": 2 + }, + "machine_nozzle_tip_outer_diameter": { + "default": 1 + }, + "machine_nozzle_head_distance": { + "default": 3 + }, + "machine_nozzle_expansion_angle": { + "default": 45 + }, + "machine_heat_zone_length": { + "default": 16 + } }, "1": { - "extruder_nr": { "default": 1 } + "extruder_nr": { + "default": 1 + }, + "machine_nozzle_offset_x": { + "default": 0 + }, + "machine_nozzle_offset_y": { + "default": 0 + }, + "machine_nozzle_heat_up_speed": { + "default": 2 + }, + "machine_nozzle_cool_down_speed": { + "default": 2 + }, + "machine_nozzle_tip_outer_diameter": { + "default": 1 + }, + "machine_nozzle_head_distance": { + "default": 3 + }, + "machine_nozzle_expansion_angle": { + "default": 45 + }, + "machine_heat_zone_length": { + "default": 16 + } } }, diff --git a/resources/machines/ultimaker2.json b/resources/machines/ultimaker2.json deleted file mode 100644 index e19aec1336..0000000000 --- a/resources/machines/ultimaker2.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "id": "ultimaker2", - "version": 1, - "name": "Ultimaker 2", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "icon": "icon_ultimaker2.png", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2backplate.png", - "file_formats": "text/x-gcode", - - "inherits": "ultimaker.json", - - "machine_extruder_trains": { - "0": { - "machine_nozzle_heat_up_speed": { - "default": 2.0 - }, - "machine_nozzle_cool_down_speed": { - "default": 2.0 - }, - "machine_nozzle_tip_outer_diameter": { - "default": 1 - }, - "machine_nozzle_head_distance": { - "default": 3 - }, - "machine_nozzle_expansion_angle": { - "default": 45 - }, - "machine_heat_zone_length": { - "default": 16 - } - } - }, - "machine_settings": { - "machine_start_gcode" : { "default": "" }, - "machine_end_gcode" : { "default": "" }, - "machine_width": { "default": 223 }, - "machine_depth": { "default": 223 }, - "machine_height": { "default": 205 }, - "machine_heated_bed": { "default": true }, - - "machine_head_with_fans_polygon": - { - "default": [ - [ - -42, - 12 - ], - [ - -42, - -32 - ], - [ - 62, - 12 - ], - [ - 62, - -32 - ] - ] - }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.4, "min_value": "0.001"}, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "gantry_height": { "default": 55 }, - "machine_use_extruder_offset_to_offset_coords": { "default": true }, - "machine_gcode_flavor": { "default": "UltiGCode" }, - "machine_disallowed_areas": { "default": [ - [[-115.0, 112.5], [ -82.0, 112.5], [ -84.0, 102.5], [-115.0, 102.5]], - [[ 115.0, 112.5], [ 115.0, 102.5], [ 110.0, 102.5], [ 108.0, 112.5]], - [[-115.0, -112.5], [-115.0, -104.5], [ -84.0, -104.5], [ -82.0, -112.5]], - [[ 115.0, -112.5], [ 108.0, -112.5], [ 110.0, -104.5], [ 115.0, -104.5]] - ]}, - "machine_platform_offset": { "default": [9.0, 0.0, 0.0] }, - - "machine_nozzle_tip_outer_diameter": { "default": 1.0 }, - "machine_nozzle_head_distance": { "default": 3.0 }, - "machine_nozzle_expansion_angle": { "default": 45 } - }, - - "overrides": { - "material_print_temperature": { "enabled": "False" }, - "material_bed_temperature": { "enabled": "False" }, - "material_diameter": { "enabled": "False" }, - "material_flow": { "enabled": "False" }, - "retraction_amount": { "enabled": "False" }, - "retraction_speed": { "enabled": "False" }, - "retraction_retract_speed": { "enabled": "False" }, - "retraction_prime_speed": { "enabled": "False" } - } -} From 0664cbd2f6ddf20aa7738a600ccd02576d005a8a Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 17 May 2016 18:37:18 +0200 Subject: [PATCH 117/224] Make sure to set the right type for the "current settings" instance container --- cura/MachineManagerModel.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 82c8cd1328..0d3540475e 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -76,6 +76,7 @@ class MachineManagerModel(QObject): current_settings_instance_container = UM.Settings.InstanceContainer(name + "_current_settings") current_settings_instance_container.addMetaDataEntry("machine", name) + current_settings_instance_container.addMetaDataEntry("type", "user") current_settings_instance_container.setDefinition(definitions[0]) UM.Settings.ContainerRegistry.getInstance().addContainer(current_settings_instance_container) From 9bfb98e75f04bfef75172222bddfb8710e9d7755 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 17 May 2016 18:38:06 +0200 Subject: [PATCH 118/224] Make ultimaker2 definition visible in the add machine dialog --- resources/definitions/ultimaker2.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index 10b6041f0f..c61f43c37c 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -4,6 +4,7 @@ "name": "Ultimaker 2", "inherits": "ultimaker", "metadata": { + "visible": true, "author": "Ultimaker", "manufacturer": "Ultimaker", "file_formats": "text/x-gcode", @@ -105,4 +106,4 @@ "enabled": "False" } } -} \ No newline at end of file +} From a187747bdc6df2e6980c40d3b545efcb6d7ca5e5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 18 May 2016 09:35:05 +0200 Subject: [PATCH 119/224] prusa_i3_xl now inherits correct base file CURA-1278 --- resources/definitions/prusa_i3_xl.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/prusa_i3_xl.def.json b/resources/definitions/prusa_i3_xl.def.json index 0c2b9e823f..4017eda0f4 100644 --- a/resources/definitions/prusa_i3_xl.def.json +++ b/resources/definitions/prusa_i3_xl.def.json @@ -2,7 +2,7 @@ "id": "prusa_i3_xl", "version": 2, "name": "Prusa i3 xl", - "inherits": "fdmprinter.json", + "inherits": "fdmprinter", "metadata": { "author": "guigashm", "manufacturer": "Prusajr", From 43d42405b2c40287d39ff3034f34a07fb68ea38e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 18 May 2016 09:39:04 +0200 Subject: [PATCH 120/224] Updated property names to new API CURA-1278 --- .../definitions/innovo_inventor.def.json | 2 +- resources/definitions/m180.def.json | 6 +-- resources/definitions/rigidbot.def.json | 2 +- resources/definitions/rigidbot_big.def.json | 2 +- resources/definitions/ultimaker2.def.json | 40 +++++++++---------- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index 5ab8d4f2e1..c2ccbdbc71 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -95,7 +95,7 @@ }, "speed_layer_0": { "default_value": 30.0, - "min_value": 0.1 + "minimum_value": 0.1 }, "infill_overlap": { "default_value": 10.0 diff --git a/resources/definitions/m180.def.json b/resources/definitions/m180.def.json index 36d8be6e1f..e339dbddee 100644 --- a/resources/definitions/m180.def.json +++ b/resources/definitions/m180.def.json @@ -25,7 +25,7 @@ }, "machine_nozzle_size": { "default_value": 0.4, - "min_value": "0.001" + "minimum_value": "0.001" }, "machine_head_with_fans_polygon": { "default_value": [ @@ -49,8 +49,8 @@ }, "material_diameter": { "default_value": 1.75, - "min_value_warning": "1.5", - "max_value_warning": "2.0" + "minimum_value_warning": "1.5", + "maximum_value_warning": "2.0" } } } \ No newline at end of file diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json index 0de11f09b8..cf71508f3d 100644 --- a/resources/definitions/rigidbot.def.json +++ b/resources/definitions/rigidbot.def.json @@ -86,7 +86,7 @@ }, "speed_layer_0": { "default_value": 15, - "min_value": "0.1" + "minimum_value": "0.1" }, "infill_overlap": { "default_value": 10 diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json index 045f86fafe..ef2c93015d 100644 --- a/resources/definitions/rigidbot_big.def.json +++ b/resources/definitions/rigidbot_big.def.json @@ -89,7 +89,7 @@ }, "speed_layer_0": { "default_value": 15, - "min_value": "0.1" + "minimum_value": "0.1" }, "infill_overlap": { "default_value": 10 diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index c61f43c37c..ae35858730 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -14,26 +14,26 @@ }, "overrides": { "machine_start_gcode" : { - "default": "" + "default_value": "" }, "machine_end_gcode" : { - "default": "" + "default_value": "" }, "machine_width": { - "default": 223 + "default_value": 223 }, "machine_depth": { - "default": 223 + "default_value": 223 }, "machine_height": { - "default": 205 + "default_value": 205 }, "machine_heated_bed": { - "default": true + "default_value": true }, "machine_head_with_fans_polygon": { - "default": [ + "default_value": [ [ -42, 12 ], [ -42, -32 ], [ 62, 12 ], @@ -41,45 +41,45 @@ ] }, "machine_center_is_zero": { - "default": false + "default_value": false }, "machine_nozzle_size": { - "default": 0.4, - "min_value": "0.001" + "default_value": 0.4, + "minimum_value": "0.001" }, "machine_nozzle_heat_up_speed": { - "default": 2 + "default_value": 2 }, "machine_nozzle_cool_down_speed": { - "default": 2 + "default_value": 2 }, "gantry_height": { - "default": 55 + "default_value": 55 }, "machine_use_extruder_offset_to_offset_coords": { - "default": true + "default_value": true }, "machine_gcode_flavor": { - "default": "UltiGCode" + "default_value": "UltiGCode" }, "machine_disallowed_areas": { - "default": [ + "default_value": [ [[-115, 112.5], [ -82, 112.5], [ -84, 102.5], [-115, 102.5]], [[ 115, 112.5], [ 115, 102.5], [ 110, 102.5], [ 108, 112.5]], [[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]], [[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]] ]}, "machine_platform_offset": { - "default": [9, 0, 0] + "default_value": [9, 0, 0] }, "machine_nozzle_tip_outer_diameter": { - "default": 1 + "default_value": 1 }, "machine_nozzle_head_distance": { - "default": 3 + "default_value": 3 }, "machine_nozzle_expansion_angle": { - "default": 45 + "default_value": 45 }, "material_print_temperature": { "enabled": "False" From 51e57b1f91f53729b7d66c33a404785c09e3ce63 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 18 May 2016 09:44:53 +0200 Subject: [PATCH 121/224] Added visibility meta data CURA-1278 --- resources/definitions/bq_hephestos.def.json | 1 + resources/definitions/bq_hephestos_2.def.json | 1 + resources/definitions/bq_hephestos_xl.def.json | 1 + resources/definitions/bq_witbox.def.json | 1 + resources/definitions/bq_witbox_2.def.json | 1 + resources/definitions/grr_neo.def.json | 1 + resources/definitions/innovo_inventor.def.json | 1 + resources/definitions/m180.def.json | 1 + resources/definitions/maker_starter.def.json | 1 + resources/definitions/prusa_i3.def.json | 1 + resources/definitions/prusa_i3_xl.def.json | 1 + resources/definitions/rigidbot.def.json | 1 + resources/definitions/rigidbot_big.def.json | 1 + 13 files changed, 13 insertions(+) diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index b9f0f3dca5..65d6fc38a3 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -4,6 +4,7 @@ "version": 2, "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "BQ", "manufacturer": "BQ", "category": "Other", diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json index e072fbf1db..959b53bd48 100644 --- a/resources/definitions/bq_hephestos_2.def.json +++ b/resources/definitions/bq_hephestos_2.def.json @@ -4,6 +4,7 @@ "name": "BQ Hephestos 2", "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "BQ", "manufacturer": "BQ", "category": "Other", diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json index 224d219504..9cf5b685db 100644 --- a/resources/definitions/bq_hephestos_xl.def.json +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -4,6 +4,7 @@ "name": "BQ Prusa i3 Hephestos XL", "inherits": "fdmprinter", "metadata": { + "visible": true, "manufacturer": "BQ", "author": "BQ", "category": "Other", diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json index 3d021cc529..77826a1576 100644 --- a/resources/definitions/bq_witbox.def.json +++ b/resources/definitions/bq_witbox.def.json @@ -4,6 +4,7 @@ "name": "BQ Witbox", "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "BQ", "manufacturer": "BQ", "category": "Other", diff --git a/resources/definitions/bq_witbox_2.def.json b/resources/definitions/bq_witbox_2.def.json index 58f70c95b7..a98a8b909d 100644 --- a/resources/definitions/bq_witbox_2.def.json +++ b/resources/definitions/bq_witbox_2.def.json @@ -4,6 +4,7 @@ "name": "BQ Witbox 2", "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "BQ", "manufacturer": "BQ", "category": "Other", diff --git a/resources/definitions/grr_neo.def.json b/resources/definitions/grr_neo.def.json index 3fb6804c40..9fc5d2121e 100644 --- a/resources/definitions/grr_neo.def.json +++ b/resources/definitions/grr_neo.def.json @@ -4,6 +4,7 @@ "name": "German RepRap Neo", "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "Simon Cor", "manufacturer": "German RepRap", "category": "Other", diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index c2ccbdbc71..d40256813b 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -4,6 +4,7 @@ "name": "Innovo INVENTOR", "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "Adam Rumjahn", "manufacturer": "Innovo", "category": "Other", diff --git a/resources/definitions/m180.def.json b/resources/definitions/m180.def.json index e339dbddee..bb027d33bc 100644 --- a/resources/definitions/m180.def.json +++ b/resources/definitions/m180.def.json @@ -4,6 +4,7 @@ "name": "Malyan M180", "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "Ruben Dulek", "manufacturer": "Malyan", "category": "Other", diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json index 376fea8c29..797b57f771 100644 --- a/resources/definitions/maker_starter.def.json +++ b/resources/definitions/maker_starter.def.json @@ -4,6 +4,7 @@ "name": "3DMaker Starter", "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "tvlgiao", "manufacturer": "3DMaker", "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj", diff --git a/resources/definitions/prusa_i3.def.json b/resources/definitions/prusa_i3.def.json index 26c36b605e..21db84838a 100644 --- a/resources/definitions/prusa_i3.def.json +++ b/resources/definitions/prusa_i3.def.json @@ -4,6 +4,7 @@ "name": "Prusa i3", "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "Quillford", "manufacturer": "Prusajr", "category": "Other", diff --git a/resources/definitions/prusa_i3_xl.def.json b/resources/definitions/prusa_i3_xl.def.json index 4017eda0f4..ddd1796eb7 100644 --- a/resources/definitions/prusa_i3_xl.def.json +++ b/resources/definitions/prusa_i3_xl.def.json @@ -4,6 +4,7 @@ "name": "Prusa i3 xl", "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "guigashm", "manufacturer": "Prusajr", "category": "Other", diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json index cf71508f3d..e70c407463 100644 --- a/resources/definitions/rigidbot.def.json +++ b/resources/definitions/rigidbot.def.json @@ -4,6 +4,7 @@ "name": "RigidBot", "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "RBC", "manufacturer": "RigidBot", "category": "Other", diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json index ef2c93015d..f4b282d9db 100644 --- a/resources/definitions/rigidbot_big.def.json +++ b/resources/definitions/rigidbot_big.def.json @@ -4,6 +4,7 @@ "name": "RigidBotBig", "inherits": "fdmprinter", "metadata": { + "visible": true, "author": "RBC", "manufacturer": "RigidBot", "category": "Other", From b635b075690938f85a2b63071c91575d36352d28 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 09:47:15 +0200 Subject: [PATCH 122/224] Translate definition for Ultimaker 2 Extended Contributes to issue CURA-1278. --- .../definitions/ultimaker2_extended.def.json | 20 +++++++++++++++++++ resources/machines/ultimaker2_extended.json | 16 --------------- 2 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 resources/definitions/ultimaker2_extended.def.json delete mode 100644 resources/machines/ultimaker2_extended.json diff --git a/resources/definitions/ultimaker2_extended.def.json b/resources/definitions/ultimaker2_extended.def.json new file mode 100644 index 0000000000..1d7ef8bbd2 --- /dev/null +++ b/resources/definitions/ultimaker2_extended.def.json @@ -0,0 +1,20 @@ +{ + "id": "ultimaker2_extended", + "version": 2, + "name": "Ultimaker 2 Extended", + "inherits": "ultimaker2", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2.png", + "platform": "ultimaker2_platform.obj", + "platform_texture": "Ultimaker2Extendedbackplate.png" + }, + + "overrides": { + "machine_height": { + "default": 315 + } + } +} diff --git a/resources/machines/ultimaker2_extended.json b/resources/machines/ultimaker2_extended.json deleted file mode 100644 index 0cd5ff0002..0000000000 --- a/resources/machines/ultimaker2_extended.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "ultimaker2_extended", - "version": 1, - "name": "Ultimaker 2 Extended", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "icon": "icon_ultimaker2.png", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Extendedbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2.json", - - "machine_settings": { - "machine_height": { "default": 315 } - } -} From 34632a762a44512ef409eb0f11d339b925723b15 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 09:48:44 +0200 Subject: [PATCH 123/224] Use default_value instead of default Forgot this again. Good morning Ghostkeeper. Contributes to issue CURA-1278. --- resources/definitions/ultimaker2_extended.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker2_extended.def.json b/resources/definitions/ultimaker2_extended.def.json index 1d7ef8bbd2..361132ea95 100644 --- a/resources/definitions/ultimaker2_extended.def.json +++ b/resources/definitions/ultimaker2_extended.def.json @@ -14,7 +14,7 @@ "overrides": { "machine_height": { - "default": 315 + "default_value": 315 } } } From a7f93b2a922dce298fca3894e57aa6368c955939 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 09:50:04 +0200 Subject: [PATCH 124/224] Add category to metadata Also forgot that. Good morning, Ghost. Contributes to issue CURA-1278. --- resources/definitions/ultimaker2_extended.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/ultimaker2_extended.def.json b/resources/definitions/ultimaker2_extended.def.json index 361132ea95..e3c7d1fd01 100644 --- a/resources/definitions/ultimaker2_extended.def.json +++ b/resources/definitions/ultimaker2_extended.def.json @@ -6,6 +6,7 @@ "metadata": { "author": "Ultimaker", "manufacturer": "Ultimaker", + "category": "Ultimaker", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", "platform": "ultimaker2_platform.obj", From 4947dfffb8e27e8c70c6f14f9c10cb6649557f03 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 09:52:54 +0200 Subject: [PATCH 125/224] Translate definition for Ultimaker 2 Extended+ It remains to be seen what we do with the variants of this machine and consequently the visibility of this machine. Contributes to issue CURA-1278. --- .../ultimaker2_extended_plus.def.json | 30 +++++++++++++++++++ .../machines/ultimaker2_extended_plus.json | 19 ------------ 2 files changed, 30 insertions(+), 19 deletions(-) create mode 100644 resources/definitions/ultimaker2_extended_plus.def.json delete mode 100644 resources/machines/ultimaker2_extended_plus.json diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json new file mode 100644 index 0000000000..5283209745 --- /dev/null +++ b/resources/definitions/ultimaker2_extended_plus.def.json @@ -0,0 +1,30 @@ +{ + "id": "ultimaker2_extended_plus_base", + "version": 2, + "name": "Ultimaker 2 Extended+", + "inherits": "ultimaker2plus", + "visible": false, + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "category": "Ultimaker", + "file_formats": "text/x-gcode", + "platform": "ultimaker2_platform.obj", + "platform_texture": "Ultimaker2ExtendedPlusbackplate.png" + }, + + "overrides": { + "machine_height": { + "default_value": 313 + }, + "machine_show_variants": { + "default_value": true + }, + "machine_nozzle_head_distance": { + "default_value": 5 + }, + "machine_nozzle_expansion_angle": { + "default_value": 45 + } + } +} diff --git a/resources/machines/ultimaker2_extended_plus.json b/resources/machines/ultimaker2_extended_plus.json deleted file mode 100644 index 318361a894..0000000000 --- a/resources/machines/ultimaker2_extended_plus.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "ultimaker2_extended_plus_base", - "version": 1, - "name": "Ultimaker 2 Extended+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", - "visible": false, - "file_formats": "text/x-gcode", - "inherits": "ultimaker2plus.json", - - "machine_settings": { - "machine_height": { "default": 313 }, - "machine_show_variants": { "default": true }, - "machine_nozzle_head_distance": { "default": 5 }, - "machine_nozzle_expansion_angle": { "default": 45 } - } -} From d0c9b964167678c05efcb5f5c7f9cb0a9beb4d07 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 09:57:25 +0200 Subject: [PATCH 126/224] Translate definition for Ultimaker 2 Go Contributes to issue CURA-1278. --- resources/definitions/ultimaker2_go.def.json | 41 ++++++++++++++++++++ resources/machines/ultimaker2_go.json | 26 ------------- 2 files changed, 41 insertions(+), 26 deletions(-) create mode 100644 resources/definitions/ultimaker2_go.def.json delete mode 100644 resources/machines/ultimaker2_go.json diff --git a/resources/definitions/ultimaker2_go.def.json b/resources/definitions/ultimaker2_go.def.json new file mode 100644 index 0000000000..e439006170 --- /dev/null +++ b/resources/definitions/ultimaker2_go.def.json @@ -0,0 +1,41 @@ +{ + "id": "ultimaker2_go", + "version": 2, + "name": "Ultimaker 2 Go", + "inherits": "ultimaker2", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "category": "Ultimaker", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2.png", + "platform": "ultimaker2go_platform.obj", + "platform_texture": "Ultimaker2Gobackplate.png" + }, + + "overrides": { + "machine_width": { + "default_value": 120 + }, + "machine_depth": { + "default_value": 120 + }, + "machine_height": { + "default_value": 115 + }, + "machine_heated_bed": { + "default_value": false + }, + "machine_disallowed_areas": { + "default_value": [ + [[-60, 60], [-33, 60], [-35, 52], [-60, 52]], + [[ 60, 60], [ 60, 52], [ 35, 52], [ 33, 60]], + [[-60, -60], [-60, -52], [-35, -52], [-33, -60]], + [[ 60, -60], [ 33, -60], [ 35, -52], [ 60, -52]] + ] + }, + "machine_platform_offset": { + "default_value": [0, 0, 0] + } + } +} diff --git a/resources/machines/ultimaker2_go.json b/resources/machines/ultimaker2_go.json deleted file mode 100644 index cc2cde09d7..0000000000 --- a/resources/machines/ultimaker2_go.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "id": "ultimaker2_go", - "version": 1, - "name": "Ultimaker 2 Go", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "icon": "icon_ultimaker2.png", - "platform": "ultimaker2go_platform.obj", - "platform_texture": "Ultimaker2Gobackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2.json", - - "overrides": { - "machine_width": { "default": 120 }, - "machine_depth": { "default": 120 }, - "machine_height": { "default": 115 }, - "machine_heated_bed": { "default": false }, - "machine_disallowed_areas": { "default": [ - [[-60.0, 60.0], [-33.0, 60.0], [-35.0, 52.0], [-60.0, 52.0]], - [[ 60.0, 60.0], [ 60.0, 52.0], [ 35.0, 52.0], [ 33.0, 60.0]], - [[-60.0, -60.0], [-60.0, -52.0], [-35.0, -52.0], [-33.0, -60.0]], - [[ 60.0, -60.0], [ 33.0, -60.0], [ 35.0, -52.0], [ 60.0, -52.0]] - ]}, - "machine_platform_offset": { "default": [0.0, 0.0, 0.0] } - } -} From 2b47fc738b3c5cf5af936ef793a5a0bbac6befbc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 10:16:54 +0200 Subject: [PATCH 127/224] Translate definition for Ultimaker 2+ I've translated the inherit functions as values. Contributes to issue CURA-1278. --- .../definitions/ultimaker2_plus.def.json | 71 +++++++++++++++++++ resources/machines/ultimaker2plus.json | 54 -------------- 2 files changed, 71 insertions(+), 54 deletions(-) create mode 100644 resources/definitions/ultimaker2_plus.def.json delete mode 100644 resources/machines/ultimaker2plus.json diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json new file mode 100644 index 0000000000..6a61d18d3c --- /dev/null +++ b/resources/definitions/ultimaker2_plus.def.json @@ -0,0 +1,71 @@ +{ + "id": "ultimaker2plus_base", + "version": 2, + "name": "Ultimaker 2+", + "inherits": "ultimaker2", + "visible": "false", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "category": "Ultimaker", + "file_formats": "text/x-gcode", + "platform": "ultimaker2_platform.obj", + "platform_texture": "Ultimaker2Plusbackplate.png" + }, + + "overrides": { + "speed_infill": { + "value": "speed_print" + }, + "speed_wall_x": { + "value": "speed_wall" + }, + "layer_height_0": { + "value": "round(machine_nozzle_size / 1.5, 2)" + }, + "line_width": { + "value": "round(machine_nozzle_size * 0.875, 2)" + }, + "speed_layer_0": { + "default_value": 20 + }, + "speed_support": { + "value": "speed_wall_0" + }, + "machine_height": { + "default_value": 203 + }, + "machine_show_variants": { + "default_value": true + }, + "gantry_height": { + "default_value": 52 + }, + "machine_nozzle_head_distance": { + "default_value": 5 + }, + "machine_nozzle_expansion_angle": { + "default_value": 45 + }, + "machine_heat_zone_length": { + "default_value": 20 + }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [ -44, 14 ], + [ -44, -34 ], + [ 64, 14 ], + [ 64, -34 ] + ] + }, + "machine_disallowed_areas": { + "default_value": [ + [[-115, 112.5], [ -78, 112.5], [ -80, 102.5], [-115, 102.5]], + [[ 115, 112.5], [ 115, 102.5], [ 105, 102.5], [ 103, 112.5]], + [[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]], + [[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]] + ] + } + } +} diff --git a/resources/machines/ultimaker2plus.json b/resources/machines/ultimaker2plus.json deleted file mode 100644 index cc86bd8ce3..0000000000 --- a/resources/machines/ultimaker2plus.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "id": "ultimaker2plus_base", - "version": 1, - "name": "Ultimaker 2+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "visible": false, - "file_formats": "text/x-gcode", - "inherits": "ultimaker2.json", - - "overrides": { - "speed_infill": { "inherit_function": "speed_print" }, - "speed_wall_x": { "inherit_function": "speed_wall" }, - "layer_height_0": { "inherit_function": "round(machine_nozzle_size / 1.5, 2)" }, - "line_width": { "inherit_function": "round(machine_nozzle_size * 0.875, 2)" }, - "speed_layer_0": { "default": "20" }, - "speed_support": { "inherit_function": "speed_wall_0" }, - "machine_height": { "default": 203 }, - "machine_show_variants": { "default": true }, - "gantry_height": { "default": 52 }, - "machine_nozzle_head_distance": { "default": 5 }, - "machine_nozzle_expansion_angle": { "default": 45 }, - "machine_heat_zone_length": { "default": 20 }, - "machine_head_with_fans_polygon": - { - "default": [ - [ - -44, - 14 - ], - [ - -44, - -34 - ], - [ - 64, - 14 - ], - [ - 64, - -34 - ] - ] - }, - "machine_disallowed_areas": { "default": [ - [[-115.0, 112.5], [ -78.0, 112.5], [ -80.0, 102.5], [-115.0, 102.5]], - [[ 115.0, 112.5], [ 115.0, 102.5], [ 105.0, 102.5], [ 103.0, 112.5]], - [[-115.0, -112.5], [-115.0, -104.5], [ -84.0, -104.5], [ -82.0, -112.5]], - [[ 115.0, -112.5], [ 108.0, -112.5], [ 110.0, -104.5], [ 115.0, -104.5]] - ]} - } -} From 7714d6f720b4cdeedce8fc4b934964c5c0d5f4bc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 10:21:30 +0200 Subject: [PATCH 128/224] Translate definition for Ultimaker Original Contributes to issue CURA-1278. --- .../definitions/ultimaker_original.def.json | 70 ++++++++++++++++ resources/machines/ultimaker_original.json | 83 ------------------- 2 files changed, 70 insertions(+), 83 deletions(-) create mode 100644 resources/definitions/ultimaker_original.def.json delete mode 100644 resources/machines/ultimaker_original.json diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json new file mode 100644 index 0000000000..8f47962be9 --- /dev/null +++ b/resources/definitions/ultimaker_original.def.json @@ -0,0 +1,70 @@ +{ + "id": "ultimaker_original", + "version": 2, + "name": "Ultimaker Original", + "inherits": "ultimaker", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker.png", + "platform": "ultimaker_platform.stl", + "pages": [ + "SelectUpgradedParts", + "UpgradeFirmware", + "UltimakerCheckup", + "BedLeveling" + ] + }, + + "overrides": { + "machine_width": { + "default": 205 + }, + "machine_height": { + "default": 200 + }, + "machine_depth": { + "default": 205 + }, + "machine_center_is_zero": { + "default": false + }, + "machine_nozzle_size": { + "default": 0.4 + }, + "machine_nozzle_heat_up_speed": { + "default": 2 + }, + "machine_nozzle_cool_down_speed": { + "default": 2 + }, + "machine_head_with_fans_polygon": + { + "default": [ + [ -75, 35 ], + [ -75, -18 ], + [ 18, 35 ], + [ 18, -18 ] + ] + }, + "gantry_height": { + "default": 55 + }, + "machine_use_extruder_offset_to_offset_coords": { + "default": true + }, + "machine_gcode_flavor": { + "default": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + }, + "machine_extruder_drive_upgrade": { + "default": false + } + } +} diff --git a/resources/machines/ultimaker_original.json b/resources/machines/ultimaker_original.json deleted file mode 100644 index 3e694c1b8e..0000000000 --- a/resources/machines/ultimaker_original.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "id": "ultimaker_original", - "version": 1, - "name": "Ultimaker Original", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "icon": "icon_ultimaker.png", - "platform": "ultimaker_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "ultimaker.json", - - "pages": [ - "SelectUpgradedParts", - "UpgradeFirmware", - "UltimakerCheckup", - "BedLeveling" - ], - - "machine_extruder_trains": { - "0": { - "machine_nozzle_heat_up_speed": { - "default": 2.0 - }, - "machine_nozzle_cool_down_speed": { - "default": 2.0 - }, - "machine_nozzle_tip_outer_diameter": { - "default": 1 - }, - "machine_nozzle_head_distance": { - "default": 3 - }, - "machine_nozzle_expansion_angle": { - "default": 45 - }, - "machine_heat_zone_length": { - "default": 16 - } - } - }, - "overrides": { - "machine_width": { "default": 205 }, - "machine_height": { "default": 200 }, - "machine_depth": { "default": 205 }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.4 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_with_fans_polygon": - { - "default": [ - [ - -75, - 35 - ], - [ - -75, - -18 - ], - [ - 18, - 35 - ], - [ - 18, - -18 - ] - ] - }, - "gantry_height": { "default": 55 }, - "machine_use_extruder_offset_to_offset_coords": { "default": true }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - }, - - "machine_extruder_drive_upgrade": { "default": false } - } -} From 13726f1ec1444e1a5f0fc9bf35daee9060d3db31 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 10:24:18 +0200 Subject: [PATCH 129/224] Use default_value instead of default D'oh. Contributes to issue CURA-1278. --- .../definitions/ultimaker_original.def.json | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index 8f47962be9..cd2fac4599 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -19,29 +19,29 @@ "overrides": { "machine_width": { - "default": 205 + "default_value": 205 }, "machine_height": { - "default": 200 + "default_value": 200 }, "machine_depth": { - "default": 205 + "default_value": 205 }, "machine_center_is_zero": { - "default": false + "default_value": false }, "machine_nozzle_size": { - "default": 0.4 + "default_value": 0.4 }, "machine_nozzle_heat_up_speed": { - "default": 2 + "default_value": 2 }, "machine_nozzle_cool_down_speed": { - "default": 2 + "default_value": 2 }, "machine_head_with_fans_polygon": { - "default": [ + "default_value": [ [ -75, 35 ], [ -75, -18 ], [ 18, 35 ], @@ -49,22 +49,22 @@ ] }, "gantry_height": { - "default": 55 + "default_value": 55 }, "machine_use_extruder_offset_to_offset_coords": { - "default": true + "default_value": true }, "machine_gcode_flavor": { - "default": "RepRap (Marlin/Sprinter)" + "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { - "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" }, "machine_extruder_drive_upgrade": { - "default": false + "default_value": false } } } From 39907c23db19c16f1922ccdc484a1477369c60c7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 10:25:03 +0200 Subject: [PATCH 130/224] Translate definition for Ultimaker Original+ Contributes to issue CURA-1278. --- .../ultimaker_original_plus.def.json | 26 +++++++++++++++++++ .../machines/ultimaker_original_plus.json | 22 ---------------- 2 files changed, 26 insertions(+), 22 deletions(-) create mode 100644 resources/definitions/ultimaker_original_plus.def.json delete mode 100644 resources/machines/ultimaker_original_plus.json diff --git a/resources/definitions/ultimaker_original_plus.def.json b/resources/definitions/ultimaker_original_plus.def.json new file mode 100644 index 0000000000..830050beb0 --- /dev/null +++ b/resources/definitions/ultimaker_original_plus.def.json @@ -0,0 +1,26 @@ +{ + "id": "ultimaker_original_plus", + "version": 2, + "name": "Ultimaker Original+", + "inherits": "ultimaker_original", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "category": "Ultimaker", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker.png", + "platform": "ultimaker2_platform.obj", + "platform_texture": "UltimakerPlusbackplate.png", + "pages": [ + "UpgradeFirmware", + "UltimakerCheckup", + "BedLeveling" + ] + }, + + "overrides": { + "machine_heated_bed": { + "default_value": true + } + } +} diff --git a/resources/machines/ultimaker_original_plus.json b/resources/machines/ultimaker_original_plus.json deleted file mode 100644 index 07c5a04549..0000000000 --- a/resources/machines/ultimaker_original_plus.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "ultimaker_original_plus", - "version": 1, - "name": "Ultimaker Original+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "icon": "icon_ultimaker.png", - "platform": "ultimaker2_platform.obj", - "platform_texture": "UltimakerPlusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker_original.json", - - "pages": [ - "UpgradeFirmware", - "UltimakerCheckup", - "BedLeveling" - ], - - "overrides": { - "machine_heated_bed": { "default": true } - } -} From 07fea431c7946d0e555c36606390d2c7f5ff6e40 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 10:28:23 +0200 Subject: [PATCH 131/224] Translate definition for Uniqbot One Contributes to issue CURA-1278. --- resources/definitions/uniqbot_one.def.json | 55 ++++++++++++++++++++++ resources/machines/uniqbot_one.json | 31 ------------ 2 files changed, 55 insertions(+), 31 deletions(-) create mode 100644 resources/definitions/uniqbot_one.def.json delete mode 100644 resources/machines/uniqbot_one.json diff --git a/resources/definitions/uniqbot_one.def.json b/resources/definitions/uniqbot_one.def.json new file mode 100644 index 0000000000..ee536edfb0 --- /dev/null +++ b/resources/definitions/uniqbot_one.def.json @@ -0,0 +1,55 @@ +{ + "id": "uniqbot_one", + "version": 2, + "name": "Uniqbot", + "inherits": "fdmprinter", + "metadata": { + "author": "Unimatech", + "manufacturer": "Unimatech", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2.png" + }, + + "overrides": { + "machine_heated_bed": { + "default_value": false + }, + "machine_width": { + "default_value": 140 + }, + "machine_height": { + "default_value": 120 + }, + "machine_depth": { + "default_value": 160 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.5 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "machine_nozzle_gantry_distance": { + "default_value": 55 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} \ No newline at end of file diff --git a/resources/machines/uniqbot_one.json b/resources/machines/uniqbot_one.json deleted file mode 100644 index f07dae9b24..0000000000 --- a/resources/machines/uniqbot_one.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "id": "uniqbot_one", - "version": 1, - "name": "Uniqbot", - "manufacturer": "Unimatech", - "author": "Unimatech", - "icon": "icon_ultimaker2.png", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_heated_bed": { "default": false }, - "machine_width": { "default": 140 }, - "machine_height": { "default": 120 }, - "machine_depth": { "default": 160 }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.5 }, - "material_diameter": { "default": 1.75 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_nozzle_gantry_distance": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - } - } -} From 4e3e466a11e8c063cf64cc4426c19fa4a36276e3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 10:34:28 +0200 Subject: [PATCH 132/224] Move platform offset to metadata Also removed the setting from fdmprinter just to be clear. Contributes to issue CURA-1278. --- resources/definitions/bq_witbox_2.def.json | 6 ++---- resources/definitions/innovo_inventor.def.json | 6 ++---- resources/definitions/maker_starter.def.json | 5 +---- resources/definitions/ultimaker2.def.json | 6 ++---- resources/definitions/ultimaker2_go.def.json | 6 ++---- resources/machines/fdmprinter.json | 9 --------- 6 files changed, 9 insertions(+), 29 deletions(-) diff --git a/resources/definitions/bq_witbox_2.def.json b/resources/definitions/bq_witbox_2.def.json index a98a8b909d..b9d9b497cd 100644 --- a/resources/definitions/bq_witbox_2.def.json +++ b/resources/definitions/bq_witbox_2.def.json @@ -9,7 +9,8 @@ "manufacturer": "BQ", "category": "Other", "file_formats": "text/x-gcode", - "platform": "bq_witbox_platform.stl" + "platform": "bq_witbox_platform.stl", + "platform_offset": [0, -145, -38] }, "overrides": { @@ -37,9 +38,6 @@ "machine_gcode_flavor": { "default_value": "RepRap" }, - "machine_platform_offset": { - "default_value": [0, -145, -38] - }, "material_print_temperature": { "default_value": 210 }, diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index d40256813b..cd63423094 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -9,7 +9,8 @@ "manufacturer": "Innovo", "category": "Other", "file_formats": "text/x-gcode", - "platform": "inventor_platform.stl" + "platform": "inventor_platform.stl", + "platform_offset": [-180, -0.25, 160] }, "overrides": { @@ -61,9 +62,6 @@ "machine_end_gcode": { "default_value": "M104 S0\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors" }, - "machine_platform_offset": { - "default_value": [-180, -0.25, 160] - }, "layer_height": { "default_value": 0.15 }, diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json index 797b57f771..24033d8968 100644 --- a/resources/definitions/maker_starter.def.json +++ b/resources/definitions/maker_starter.def.json @@ -4,9 +4,9 @@ "name": "3DMaker Starter", "inherits": "fdmprinter", "metadata": { - "visible": true, "author": "tvlgiao", "manufacturer": "3DMaker", + "category": "Other", "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj", "icon": "icon_ultimaker2.png", "platform": "makerstarter_platform.stl" @@ -58,9 +58,6 @@ "machine_disallowed_areas": { "default_value": [] }, - "machine_platform_offset": { - "default_value": [0, 0, 0] - }, "machine_nozzle_tip_outer_diameter": { "default_value": 1 }, diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index ae35858730..606d51c545 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -10,7 +10,8 @@ "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2backplate.png" + "platform_texture": "Ultimaker2backplate.png", + "platform_offset": [9, 0, 0] }, "overrides": { "machine_start_gcode" : { @@ -69,9 +70,6 @@ [[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]], [[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]] ]}, - "machine_platform_offset": { - "default_value": [9, 0, 0] - }, "machine_nozzle_tip_outer_diameter": { "default_value": 1 }, diff --git a/resources/definitions/ultimaker2_go.def.json b/resources/definitions/ultimaker2_go.def.json index e439006170..7bedb70add 100644 --- a/resources/definitions/ultimaker2_go.def.json +++ b/resources/definitions/ultimaker2_go.def.json @@ -10,7 +10,8 @@ "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", "platform": "ultimaker2go_platform.obj", - "platform_texture": "Ultimaker2Gobackplate.png" + "platform_texture": "Ultimaker2Gobackplate.png", + "platform_offset": [0, 0, 0] }, "overrides": { @@ -34,8 +35,5 @@ [[ 60, -60], [ 33, -60], [ 35, -52], [ 60, -52]] ] }, - "machine_platform_offset": { - "default_value": [0, 0, 0] - } } } diff --git a/resources/machines/fdmprinter.json b/resources/machines/fdmprinter.json index 2751c69db2..955bb36c5a 100644 --- a/resources/machines/fdmprinter.json +++ b/resources/machines/fdmprinter.json @@ -121,15 +121,6 @@ "default": [], "global_only": true }, - "machine_platform_offset": { - "description": "Where to display the platform mesh.", - "default": [ - 0, - 0, - 0 - ], - "global_only": true - }, "machine_head_polygon": { "description": "A 2D silhouette of the print head (fan caps excluded).", "type": "polygon", From dafff9159e5130ba2c5f7cb834bce906d28e6e3b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 18 May 2016 11:03:44 +0200 Subject: [PATCH 133/224] Added materials & qualities CURA-1278 --- cura/MachineManagerModel.py | 32 ++++++++++++------- resources/definitions/fdmprinter.def.json | 4 ++- .../{instances => materials}/abs.inst.cfg | 0 .../{instances => materials}/cpe.inst.cfg | 0 .../{instances => materials}/pla.inst.cfg | 0 resources/quality/high.inst.cfg | 9 ++++++ resources/quality/normal.inst.cfg | 9 ++++++ 7 files changed, 42 insertions(+), 12 deletions(-) rename resources/{instances => materials}/abs.inst.cfg (100%) rename resources/{instances => materials}/cpe.inst.cfg (100%) rename resources/{instances => materials}/pla.inst.cfg (100%) create mode 100644 resources/quality/high.inst.cfg create mode 100644 resources/quality/normal.inst.cfg diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 0d3540475e..0f45f0a7b1 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -58,21 +58,29 @@ class MachineManagerModel(QObject): new_global_stack.addMetaDataEntry("type", "machine") UM.Settings.ContainerRegistry.getInstance().addContainer(new_global_stack) - ## DEBUG CODE - material_instance_container = UM.Settings.InstanceContainer("test_material") - material_instance_container.addMetaDataEntry("type", "material") - material_instance_container.setDefinition(definitions[0]) + preferred_material_id = definitions[0].getMetaDataEntry("preferred_material") + material_instance_container = None + if preferred_material_id: + preferred_material_id = preferred_material_id.lower() + container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = preferred_material_id) + if container: + material_instance_container = container[0] + + preferred_quality_id = definitions[0].getMetaDataEntry("preferred_quality") + quality_instance_container = None + if preferred_quality_id: + preferred_quality_id = preferred_quality_id.lower() + container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = preferred_quality_id) + if container: + quality_instance_container = container[0] + + ## DEBUG CODE variant_instance_container = UM.Settings.InstanceContainer("test_variant") variant_instance_container.addMetaDataEntry("type", "variant") variant_instance_container.setDefinition(definitions[0]) - quality_instance_container = UM.Settings.InstanceContainer(name + "_quality") - UM.Settings.ContainerRegistry.getInstance().addContainer(material_instance_container) UM.Settings.ContainerRegistry.getInstance().addContainer(variant_instance_container) - UM.Settings.ContainerRegistry.getInstance().addContainer(quality_instance_container) - quality_instance_container.addMetaDataEntry("type", "quality") - quality_instance_container.setDefinition(definitions[0]) current_settings_instance_container = UM.Settings.InstanceContainer(name + "_current_settings") current_settings_instance_container.addMetaDataEntry("machine", name) @@ -82,9 +90,11 @@ class MachineManagerModel(QObject): # If a definition is found, its a list. Should only have one item. new_global_stack.addContainer(definitions[0]) - new_global_stack.addContainer(material_instance_container) + if material_instance_container: + new_global_stack.addContainer(material_instance_container) new_global_stack.addContainer(variant_instance_container) - new_global_stack.addContainer(quality_instance_container) + if quality_instance_container: + new_global_stack.addContainer(quality_instance_container) new_global_stack.addContainer(current_settings_instance_container) Application.getInstance().setGlobalContainerStack(new_global_stack) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 11436bdcce..603dc18e92 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -8,7 +8,9 @@ "category": "Ultimaker", "manufacturer": "Ultimaker", "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", - "visible": false + "visible": false, + "preferred_material": "pla", + "preferred_quality": "normal" }, "settings": { diff --git a/resources/instances/abs.inst.cfg b/resources/materials/abs.inst.cfg similarity index 100% rename from resources/instances/abs.inst.cfg rename to resources/materials/abs.inst.cfg diff --git a/resources/instances/cpe.inst.cfg b/resources/materials/cpe.inst.cfg similarity index 100% rename from resources/instances/cpe.inst.cfg rename to resources/materials/cpe.inst.cfg diff --git a/resources/instances/pla.inst.cfg b/resources/materials/pla.inst.cfg similarity index 100% rename from resources/instances/pla.inst.cfg rename to resources/materials/pla.inst.cfg diff --git a/resources/quality/high.inst.cfg b/resources/quality/high.inst.cfg new file mode 100644 index 0000000000..2e860cf380 --- /dev/null +++ b/resources/quality/high.inst.cfg @@ -0,0 +1,9 @@ +[general] +version = 2 +name = high +definition = fdmprinter + +[metadata] +type = quality + +[values] diff --git a/resources/quality/normal.inst.cfg b/resources/quality/normal.inst.cfg new file mode 100644 index 0000000000..6bb23d841c --- /dev/null +++ b/resources/quality/normal.inst.cfg @@ -0,0 +1,9 @@ +[general] +version = 2 +name = normal +definition = fdmprinter + +[metadata] +type = quality + +[values] From 1578fdee98532868be4698c2d0c14ecb46f805e9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 18 May 2016 11:06:39 +0200 Subject: [PATCH 134/224] Fixed minor errors in definitions CURA-1278 --- resources/definitions/ultimaker2_extended_plus.def.json | 2 +- resources/definitions/ultimaker2_go.def.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json index 5283209745..d4220927e3 100644 --- a/resources/definitions/ultimaker2_extended_plus.def.json +++ b/resources/definitions/ultimaker2_extended_plus.def.json @@ -2,7 +2,7 @@ "id": "ultimaker2_extended_plus_base", "version": 2, "name": "Ultimaker 2 Extended+", - "inherits": "ultimaker2plus", + "inherits": "ultimaker2_plus", "visible": false, "metadata": { "author": "Ultimaker", diff --git a/resources/definitions/ultimaker2_go.def.json b/resources/definitions/ultimaker2_go.def.json index 7bedb70add..d3ef53d633 100644 --- a/resources/definitions/ultimaker2_go.def.json +++ b/resources/definitions/ultimaker2_go.def.json @@ -34,6 +34,6 @@ [[-60, -60], [-60, -52], [-35, -52], [-33, -60]], [[ 60, -60], [ 33, -60], [ 35, -52], [ 60, -52]] ] - }, + } } } From cbf3fe0ddf970d31a0cab50529a2db242f14e905 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 10:59:10 +0200 Subject: [PATCH 135/224] Add variants for Ultimaker 2+ Contributes to issue CURA-1278. --- resources/variants/ultimaker2_plus_0.25.cfg | 16 ++++++++++++++++ resources/variants/ultimaker2_plus_0.4.cfg | 14 ++++++++++++++ resources/variants/ultimaker2_plus_0.6.cfg | 15 +++++++++++++++ resources/variants/ultimaker2_plus_0.8.cfg | 15 +++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 resources/variants/ultimaker2_plus_0.25.cfg create mode 100644 resources/variants/ultimaker2_plus_0.4.cfg create mode 100644 resources/variants/ultimaker2_plus_0.6.cfg create mode 100644 resources/variants/ultimaker2_plus_0.8.cfg diff --git a/resources/variants/ultimaker2_plus_0.25.cfg b/resources/variants/ultimaker2_plus_0.25.cfg new file mode 100644 index 0000000000..18839a8871 --- /dev/null +++ b/resources/variants/ultimaker2_plus_0.25.cfg @@ -0,0 +1,16 @@ +[general] +name = 0.25 mm +version = 2 +definition = ultimaker2_plus + +[metadata] +author = Ultimaker + +[values] +machine_nozzle_size = 0.25 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.1 +coasting_min_volume = 0.17 +speed_wall = round(speed_print / 1.2, 1) +speed_wall_0 = 1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = round(speed_print / 1.5, 1) \ No newline at end of file diff --git a/resources/variants/ultimaker2_plus_0.4.cfg b/resources/variants/ultimaker2_plus_0.4.cfg new file mode 100644 index 0000000000..b7dc47ea6e --- /dev/null +++ b/resources/variants/ultimaker2_plus_0.4.cfg @@ -0,0 +1,14 @@ +[general] +name = 0.4 mm +version = 2 +definition = ultimaker2_plus + +[metadata] +author = Ultimaker + +[values] +machine_nozzle_size = 0.4 +machine_nozzle_tip_outer_diameter = 1.05 +speed_wall = round(speed_print / 1.25, 1) +speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = round(speed_print / 2.25, 1) \ No newline at end of file diff --git a/resources/variants/ultimaker2_plus_0.6.cfg b/resources/variants/ultimaker2_plus_0.6.cfg new file mode 100644 index 0000000000..d6a7da7437 --- /dev/null +++ b/resources/variants/ultimaker2_plus_0.6.cfg @@ -0,0 +1,15 @@ +[general] +name = 0.6 mm +version = 2 +definition = ultimaker2_plus + +[metadata] +author = Ultimaker + +[values] +machine_nozzle_size = 0.6 +machine_nozzle_tip_outer_diameter = 1.25 +coasting_volume = 1.36 +speed_wall = round(speed_print * 4 / 3, 1) +speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = round(speed_print / 2, 1) \ No newline at end of file diff --git a/resources/variants/ultimaker2_plus_0.8.cfg b/resources/variants/ultimaker2_plus_0.8.cfg new file mode 100644 index 0000000000..cb97151642 --- /dev/null +++ b/resources/variants/ultimaker2_plus_0.8.cfg @@ -0,0 +1,15 @@ +[general] +name = 0.8 mm +version = 2 +definition = ultimaker2_plus + +[metadata] +author = Ultimaker + +[values] +machine_nozzle_size = 0.8 +machine_nozzle_tip_outer_diameter = 1.35 +coasting_volume = 3.22 +speed_wall = round(speed_print * 4 / 3, 1) +speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = round(speed_print / 2, 1) \ No newline at end of file From 5ed881859d34a2955f90ccc2493a1c985fe973a5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 11:01:38 +0200 Subject: [PATCH 136/224] Fix ID of Ultimaker 2+ It's no longer necessary to append '_base' to the ID of printers with variants. Contributes to issue CURA-1278. --- resources/definitions/ultimaker2_plus.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json index 6a61d18d3c..646b424c5c 100644 --- a/resources/definitions/ultimaker2_plus.def.json +++ b/resources/definitions/ultimaker2_plus.def.json @@ -1,5 +1,5 @@ { - "id": "ultimaker2plus_base", + "id": "ultimaker2_plus", "version": 2, "name": "Ultimaker 2+", "inherits": "ultimaker2", From 25c9c95e105851548a5d3d559160c547930c9fe6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 11:02:31 +0200 Subject: [PATCH 137/224] Fix ID of Ultimaker 2 Extended+ It's no longer necessary to append '_base' to the ID of printers with variants. Contributes to issue CURA-1278. --- resources/definitions/ultimaker2_extended_plus.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json index d4220927e3..eae48773b6 100644 --- a/resources/definitions/ultimaker2_extended_plus.def.json +++ b/resources/definitions/ultimaker2_extended_plus.def.json @@ -1,5 +1,5 @@ { - "id": "ultimaker2_extended_plus_base", + "id": "ultimaker2_extended_plus", "version": 2, "name": "Ultimaker 2 Extended+", "inherits": "ultimaker2_plus", From dce4b71f63fb6c502583dca14e0078bd919d462e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 11:06:16 +0200 Subject: [PATCH 138/224] Add variants for Ultimaker 2 Extended+ Contributes to issue CURA-1278. --- resources/variants/ultimaker2_extended_plus_0.25.cfg | 11 +++++++++++ resources/variants/ultimaker2_extended_plus_0.4.cfg | 11 +++++++++++ resources/variants/ultimaker2_extended_plus_0.6.cfg | 11 +++++++++++ resources/variants/ultimaker2_extended_plus_0.8.cfg | 11 +++++++++++ 4 files changed, 44 insertions(+) create mode 100644 resources/variants/ultimaker2_extended_plus_0.25.cfg create mode 100644 resources/variants/ultimaker2_extended_plus_0.4.cfg create mode 100644 resources/variants/ultimaker2_extended_plus_0.6.cfg create mode 100644 resources/variants/ultimaker2_extended_plus_0.8.cfg diff --git a/resources/variants/ultimaker2_extended_plus_0.25.cfg b/resources/variants/ultimaker2_extended_plus_0.25.cfg new file mode 100644 index 0000000000..0d358821c0 --- /dev/null +++ b/resources/variants/ultimaker2_extended_plus_0.25.cfg @@ -0,0 +1,11 @@ +[general] +name = 0.25 mm +version = 2 +definition = ultimaker2_extended_plus + +[metadata] +author = Ultimaker + +[values] +machine_nozzle_size = 0.25 +machine_nozzle_tip_outer_diameter = 0.8 \ No newline at end of file diff --git a/resources/variants/ultimaker2_extended_plus_0.4.cfg b/resources/variants/ultimaker2_extended_plus_0.4.cfg new file mode 100644 index 0000000000..e0ab37c06b --- /dev/null +++ b/resources/variants/ultimaker2_extended_plus_0.4.cfg @@ -0,0 +1,11 @@ +[general] +name = 0.4 mm +version = 2 +definition = ultimaker2_extended_plus + +[metadata] +author = Ultimaker + +[values] +machine_nozzle_size = 0.4 +machine_nozzle_tip_outer_diameter = 1.05 \ No newline at end of file diff --git a/resources/variants/ultimaker2_extended_plus_0.6.cfg b/resources/variants/ultimaker2_extended_plus_0.6.cfg new file mode 100644 index 0000000000..2b65b472b8 --- /dev/null +++ b/resources/variants/ultimaker2_extended_plus_0.6.cfg @@ -0,0 +1,11 @@ +[general] +name = 0.6 mm +version = 2 +definition = ultimaker2_extended_plus + +[metadata] +author = Ultimaker + +[values] +machine_nozzle_size = 0.6 +machine_nozzle_tip_outer_diameter = 1.25 \ No newline at end of file diff --git a/resources/variants/ultimaker2_extended_plus_0.8.cfg b/resources/variants/ultimaker2_extended_plus_0.8.cfg new file mode 100644 index 0000000000..7a879977c7 --- /dev/null +++ b/resources/variants/ultimaker2_extended_plus_0.8.cfg @@ -0,0 +1,11 @@ +[general] +name = 0.8 mm +version = 2 +definition = ultimaker2_extended_plus + +[metadata] +author = Ultimaker + +[values] +machine_nozzle_size = 0.8 +machine_nozzle_tip_outer_diameter = 1.35 \ No newline at end of file From 1e1aec57460d0dbc8a6207bf043c0ee2739905ec Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 11:07:02 +0200 Subject: [PATCH 139/224] Remove superfluous variants These are now in the resources/variants folder in the translated form. Contributes to issue CURA-1278. --- .../ultimaker2_extended_plus_025.json | 17 -------------- .../ultimaker2_extended_plus_040.json | 17 -------------- .../ultimaker2_extended_plus_060.json | 17 -------------- .../ultimaker2_extended_plus_080.json | 17 -------------- resources/machines/ultimaker2plus_025.json | 23 ------------------- resources/machines/ultimaker2plus_040.json | 21 ----------------- resources/machines/ultimaker2plus_060.json | 22 ------------------ resources/machines/ultimaker2plus_080.json | 22 ------------------ 8 files changed, 156 deletions(-) delete mode 100644 resources/machines/ultimaker2_extended_plus_025.json delete mode 100644 resources/machines/ultimaker2_extended_plus_040.json delete mode 100644 resources/machines/ultimaker2_extended_plus_060.json delete mode 100644 resources/machines/ultimaker2_extended_plus_080.json delete mode 100644 resources/machines/ultimaker2plus_025.json delete mode 100644 resources/machines/ultimaker2plus_040.json delete mode 100644 resources/machines/ultimaker2plus_060.json delete mode 100644 resources/machines/ultimaker2plus_080.json diff --git a/resources/machines/ultimaker2_extended_plus_025.json b/resources/machines/ultimaker2_extended_plus_025.json deleted file mode 100644 index 187079aa33..0000000000 --- a/resources/machines/ultimaker2_extended_plus_025.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "ultimaker2_extended_plus", - "version": 1, - "name": "Ultimaker 2 Extended+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2_extended_plus.json", - "variant": "0.25 mm", - "profiles_machine": "ultimaker2plus", - "machine_settings": { - "machine_nozzle_size": { "default": 0.25 }, - "machine_nozzle_tip_outer_diameter": { "default": 0.8 } - } -} diff --git a/resources/machines/ultimaker2_extended_plus_040.json b/resources/machines/ultimaker2_extended_plus_040.json deleted file mode 100644 index b548bbe423..0000000000 --- a/resources/machines/ultimaker2_extended_plus_040.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "ultimaker2_extended_plus", - "version": 1, - "name": "Ultimaker 2 Extended+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2_extended_plus.json", - "variant": "0.4 mm", - "profiles_machine": "ultimaker2plus", - "machine_settings": { - "machine_nozzle_size": { "default": 0.40 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.05 } - } -} diff --git a/resources/machines/ultimaker2_extended_plus_060.json b/resources/machines/ultimaker2_extended_plus_060.json deleted file mode 100644 index 9d39c267ba..0000000000 --- a/resources/machines/ultimaker2_extended_plus_060.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "ultimaker2_extended_plus", - "version": 1, - "name": "Ultimaker 2 Extended+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2_extended_plus.json", - "variant": "0.6 mm", - "profiles_machine": "ultimaker2plus", - "machine_settings": { - "machine_nozzle_size": { "default": 0.60 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.25 } - } -} diff --git a/resources/machines/ultimaker2_extended_plus_080.json b/resources/machines/ultimaker2_extended_plus_080.json deleted file mode 100644 index bf74998f57..0000000000 --- a/resources/machines/ultimaker2_extended_plus_080.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "ultimaker2_extended_plus", - "version": 1, - "name": "Ultimaker 2 Extended+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2_extended_plus.json", - "variant": "0.8 mm", - "profiles_machine": "ultimaker2plus", - "machine_settings": { - "machine_nozzle_size": { "default": 0.80 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.35 } - } -} diff --git a/resources/machines/ultimaker2plus_025.json b/resources/machines/ultimaker2plus_025.json deleted file mode 100644 index 2c022f8448..0000000000 --- a/resources/machines/ultimaker2plus_025.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "id": "ultimaker2plus", - "version": 1, - "name": "Ultimaker 2+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2plus.json", - - "variant": "0.25 mm", - - "overrides": { - "speed_wall": { "inherit_function": "round(speed_print / 1.2, 1)" }, - "speed_wall_0": { "inherit_function": "1 if speed_wall < 5 else (speed_wall - 5)" }, - "speed_topbottom": { "inherit_function": "round(speed_print / 1.5, 1)" }, - "machine_nozzle_size": { "default": 0.25 }, - "machine_nozzle_tip_outer_diameter": { "default": 0.8 }, - "coasting_volume": { "default": 0.1 }, - "coasting_min_volume": { "default": 0.17 } - } -} diff --git a/resources/machines/ultimaker2plus_040.json b/resources/machines/ultimaker2plus_040.json deleted file mode 100644 index f5a0f5a710..0000000000 --- a/resources/machines/ultimaker2plus_040.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "ultimaker2plus", - "version": 1, - "name": "Ultimaker 2+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2plus.json", - - "variant": "0.4 mm", - - "overrides": { - "speed_wall": { "inherit_function": "round(speed_print / 1.25, 1)" }, - "speed_wall_0": { "inherit_function": "1 if speed_wall < 10 else (speed_wall - 10)" }, - "speed_topbottom": { "inherit_function": "round(speed_print / 2.25, 1)" }, - "machine_nozzle_size": { "default": 0.40 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.05 } - } -} diff --git a/resources/machines/ultimaker2plus_060.json b/resources/machines/ultimaker2plus_060.json deleted file mode 100644 index 89538f2fd0..0000000000 --- a/resources/machines/ultimaker2plus_060.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "ultimaker2plus", - "version": 1, - "name": "Ultimaker 2+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2plus.json", - - "variant": "0.6 mm", - - "overrides": { - "speed_wall": { "inherit_function": "round(speed_print / 1.333333, 1)" }, - "speed_wall_0": { "inherit_function": "1 if speed_wall < 10 else (speed_wall - 10)" }, - "speed_topbottom": { "inherit_function": "round(speed_print / 2, 1)" }, - "machine_nozzle_size": { "default": 0.60 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.25 }, - "coasting_volume": { "default": 1.36 } - } -} diff --git a/resources/machines/ultimaker2plus_080.json b/resources/machines/ultimaker2plus_080.json deleted file mode 100644 index e231fbb9f5..0000000000 --- a/resources/machines/ultimaker2plus_080.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "ultimaker2plus", - "version": 1, - "name": "Ultimaker 2+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2plus.json", - - "variant": "0.8 mm", - - "overrides": { - "speed_wall": { "inherit_function": "round(speed_print / 1.333333, 1)" }, - "speed_wall_0": { "inherit_function": "1 if speed_wall < 10 else (speed_wall - 10)" }, - "speed_topbottom": { "inherit_function": "round(speed_print / 2, 1)" }, - "machine_nozzle_size": { "default": 0.80 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.35 }, - "coasting_volume": { "default": 3.22 } - } -} From 54c29187c9d5c413ef5791688fbfa0de58071c77 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 11:16:22 +0200 Subject: [PATCH 140/224] Also use different speeds and coast volumes for UME+ variants I've discussed this with Paul and he confirms that they should also be different for Extended just like not-Extended. Contributes to issue CURA-1278. --- resources/variants/ultimaker2_extended_plus_0.25.cfg | 7 ++++++- resources/variants/ultimaker2_extended_plus_0.4.cfg | 5 ++++- resources/variants/ultimaker2_extended_plus_0.6.cfg | 6 +++++- resources/variants/ultimaker2_extended_plus_0.8.cfg | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/resources/variants/ultimaker2_extended_plus_0.25.cfg b/resources/variants/ultimaker2_extended_plus_0.25.cfg index 0d358821c0..2bc14d7588 100644 --- a/resources/variants/ultimaker2_extended_plus_0.25.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.25.cfg @@ -8,4 +8,9 @@ author = Ultimaker [values] machine_nozzle_size = 0.25 -machine_nozzle_tip_outer_diameter = 0.8 \ No newline at end of file +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.1 +coasting_min_volume = 0.17 +speed_wall = round(speed_print / 1.2, 1) +speed_wall_0 = 1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = round(speed_print / 1.5, 1) \ No newline at end of file diff --git a/resources/variants/ultimaker2_extended_plus_0.4.cfg b/resources/variants/ultimaker2_extended_plus_0.4.cfg index e0ab37c06b..a0de0ad2d7 100644 --- a/resources/variants/ultimaker2_extended_plus_0.4.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.4.cfg @@ -8,4 +8,7 @@ author = Ultimaker [values] machine_nozzle_size = 0.4 -machine_nozzle_tip_outer_diameter = 1.05 \ No newline at end of file +machine_nozzle_tip_outer_diameter = 1.05 +speed_wall = round(speed_print / 1.25, 1) +speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = round(speed_print / 2.25, 1) \ No newline at end of file diff --git a/resources/variants/ultimaker2_extended_plus_0.6.cfg b/resources/variants/ultimaker2_extended_plus_0.6.cfg index 2b65b472b8..10fa9dd4de 100644 --- a/resources/variants/ultimaker2_extended_plus_0.6.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.6.cfg @@ -8,4 +8,8 @@ author = Ultimaker [values] machine_nozzle_size = 0.6 -machine_nozzle_tip_outer_diameter = 1.25 \ No newline at end of file +machine_nozzle_tip_outer_diameter = 1.25 +coasting_volume = 1.36 +speed_wall = round(speed_print * 4 / 3, 1) +speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = round(speed_print / 2, 1) \ No newline at end of file diff --git a/resources/variants/ultimaker2_extended_plus_0.8.cfg b/resources/variants/ultimaker2_extended_plus_0.8.cfg index 7a879977c7..2980215ebd 100644 --- a/resources/variants/ultimaker2_extended_plus_0.8.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.8.cfg @@ -8,4 +8,8 @@ author = Ultimaker [values] machine_nozzle_size = 0.8 -machine_nozzle_tip_outer_diameter = 1.35 \ No newline at end of file +machine_nozzle_tip_outer_diameter = 1.35 +coasting_volume = 3.22 +speed_wall = round(speed_print * 4 / 3, 1) +speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = round(speed_print / 2, 1) \ No newline at end of file From a8fc830f2b1154abc3aa934311d5a538bd36a9ee Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 11:36:45 +0200 Subject: [PATCH 141/224] Translate ancient machine_head_shape settings It has been machine_head_polygon for a while. Contributes to issue CURA-1278. --- resources/definitions/grr_neo.def.json | 18 +++++++----------- resources/definitions/innovo_inventor.def.json | 18 +++++++----------- resources/definitions/maker_starter.def.json | 12 ------------ resources/definitions/prusa_i3.def.json | 18 +++++++----------- resources/definitions/prusa_i3_xl.def.json | 18 +++++++----------- resources/definitions/rigidbot.def.json | 12 ------------ resources/definitions/rigidbot_big.def.json | 12 ------------ 7 files changed, 28 insertions(+), 80 deletions(-) diff --git a/resources/definitions/grr_neo.def.json b/resources/definitions/grr_neo.def.json index 9fc5d2121e..76ae73540f 100644 --- a/resources/definitions/grr_neo.def.json +++ b/resources/definitions/grr_neo.def.json @@ -35,17 +35,13 @@ "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_head_shape_min_x": { - "default_value": 75 - }, - "machine_head_shape_min_y": { - "default_value": 18 - }, - "machine_head_shape_max_x": { - "default_value": 18 - }, - "machine_head_shape_max_y": { - "default_value": 35 + "machine_head_polygon": { + "default_value": [ + [-75, -18], + [-75, 35], + [18, 35], + [18, -18] + ] }, "machine_nozzle_gantry_distance": { "default_value": 55 diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index cd63423094..a0e8bd8b8f 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -32,17 +32,13 @@ "machine_nozzle_size": { "default_value": 0.4 }, - "machine_head_shape_min_x": { - "default_value": 43.7 - }, - "machine_head_shape_min_y": { - "default_value": 19.2 - }, - "machine_head_shape_max_x": { - "default_value": 43.7 - }, - "machine_head_shape_max_y": { - "default_value": 55 + "machine_head_polygon": { + "default_value": [ + [-43.7, -19.2], + [-43.7, 55], + [43.7, 55], + [43.7, -19.2] + ] }, "machine_nozzle_gantry_distance": { "default_value": 82.3 diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json index 24033d8968..94caa5d789 100644 --- a/resources/definitions/maker_starter.def.json +++ b/resources/definitions/maker_starter.def.json @@ -37,18 +37,6 @@ "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_head_shape_min_x": { - "default_value": 0 - }, - "machine_head_shape_min_y": { - "default_value": 0 - }, - "machine_head_shape_max_x": { - "default_value": 0 - }, - "machine_head_shape_max_y": { - "default_value": 0 - }, "machine_nozzle_gantry_distance": { "default_value": 55 }, diff --git a/resources/definitions/prusa_i3.def.json b/resources/definitions/prusa_i3.def.json index 21db84838a..dbd5877248 100644 --- a/resources/definitions/prusa_i3.def.json +++ b/resources/definitions/prusa_i3.def.json @@ -41,17 +41,13 @@ "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_head_shape_min_x": { - "default_value": 75 - }, - "machine_head_shape_min_y": { - "default_value": 18 - }, - "machine_head_shape_max_x": { - "default_value": 18 - }, - "machine_head_shape_max_y": { - "default_value": 35 + "machine_head_polygon": { + "default_value": [ + [-75, -18], + [-75, 35], + [18, 35], + [18, -18] + ] }, "machine_nozzle_gantry_distance": { "default_value": 55 diff --git a/resources/definitions/prusa_i3_xl.def.json b/resources/definitions/prusa_i3_xl.def.json index ddd1796eb7..049705abd4 100644 --- a/resources/definitions/prusa_i3_xl.def.json +++ b/resources/definitions/prusa_i3_xl.def.json @@ -41,17 +41,13 @@ "machine_nozzle_cool_down_speed": { "default_value": 2.0 }, - "machine_head_shape_min_x": { - "default_value": 75 - }, - "machine_head_shape_min_y": { - "default_value": 18 - }, - "machine_head_shape_max_x": { - "default_value": 18 - }, - "machine_head_shape_max_y": { - "default_value": 35 + "machine_head_polygon": { + "default_value": [ + [-75, -18], + [-75, 35], + [18, 35], + [18, -18] + ] }, "machine_nozzle_gantry_distance": { "default_value": 55 diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json index e70c407463..f8b8801395 100644 --- a/resources/definitions/rigidbot.def.json +++ b/resources/definitions/rigidbot.def.json @@ -31,18 +31,6 @@ "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_head_shape_min_x": { - "default_value": 0 - }, - "machine_head_shape_min_y": { - "default_value": 0 - }, - "machine_head_shape_max_x": { - "default_value": 0 - }, - "machine_head_shape_max_y": { - "default_value": 0 - }, "machine_nozzle_gantry_distance": { "default_value": 0 }, diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json index f4b282d9db..1037e3ea12 100644 --- a/resources/definitions/rigidbot_big.def.json +++ b/resources/definitions/rigidbot_big.def.json @@ -34,18 +34,6 @@ "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_head_shape_min_x": { - "default_value": 0 - }, - "machine_head_shape_min_y": { - "default_value": 0 - }, - "machine_head_shape_max_x": { - "default_value": 0 - }, - "machine_head_shape_max_y": { - "default_value": 0 - }, "machine_nozzle_gantry_distance": { "default_value": 0 }, From afb7a45bb07b99c9209922685ecc56e8d9bab392 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 11:48:43 +0200 Subject: [PATCH 142/224] Translate ancient machine_nozzle_gantry_distance setting It was changed to gantry_height long ago but not updated in these definitions. Contributes to issue CURA-1278. --- resources/definitions/grr_neo.def.json | 2 +- resources/definitions/innovo_inventor.def.json | 2 +- resources/definitions/maker_starter.def.json | 2 +- resources/definitions/prusa_i3.def.json | 2 +- resources/definitions/prusa_i3_xl.def.json | 2 +- resources/definitions/rigidbot.def.json | 2 +- resources/definitions/rigidbot_big.def.json | 2 +- resources/definitions/uniqbot_one.def.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/definitions/grr_neo.def.json b/resources/definitions/grr_neo.def.json index 76ae73540f..563bdd1a67 100644 --- a/resources/definitions/grr_neo.def.json +++ b/resources/definitions/grr_neo.def.json @@ -43,7 +43,7 @@ [18, -18] ] }, - "machine_nozzle_gantry_distance": { + "gantry_height": { "default_value": 55 }, "machine_gcode_flavor": { diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index a0e8bd8b8f..14619833a7 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -40,7 +40,7 @@ [43.7, -19.2] ] }, - "machine_nozzle_gantry_distance": { + "gantry_height": { "default_value": 82.3 }, "machine_nozzle_offset_x_1": { diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json index 94caa5d789..a26ca058f0 100644 --- a/resources/definitions/maker_starter.def.json +++ b/resources/definitions/maker_starter.def.json @@ -37,7 +37,7 @@ "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_nozzle_gantry_distance": { + "gantry_height": { "default_value": 55 }, "machine_gcode_flavor": { diff --git a/resources/definitions/prusa_i3.def.json b/resources/definitions/prusa_i3.def.json index dbd5877248..12e7054694 100644 --- a/resources/definitions/prusa_i3.def.json +++ b/resources/definitions/prusa_i3.def.json @@ -49,7 +49,7 @@ [18, -18] ] }, - "machine_nozzle_gantry_distance": { + "gantry_height": { "default_value": 55 }, "machine_gcode_flavor": { diff --git a/resources/definitions/prusa_i3_xl.def.json b/resources/definitions/prusa_i3_xl.def.json index 049705abd4..819a93b860 100644 --- a/resources/definitions/prusa_i3_xl.def.json +++ b/resources/definitions/prusa_i3_xl.def.json @@ -49,7 +49,7 @@ [18, -18] ] }, - "machine_nozzle_gantry_distance": { + "gantry_height": { "default_value": 55 }, "machine_gcode_flavor": { diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json index f8b8801395..ace8300d5d 100644 --- a/resources/definitions/rigidbot.def.json +++ b/resources/definitions/rigidbot.def.json @@ -31,7 +31,7 @@ "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_nozzle_gantry_distance": { + "gantry_height": { "default_value": 0 }, "machine_gcode_flavor": { diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json index 1037e3ea12..ce27d36745 100644 --- a/resources/definitions/rigidbot_big.def.json +++ b/resources/definitions/rigidbot_big.def.json @@ -34,7 +34,7 @@ "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_nozzle_gantry_distance": { + "gantry_height": { "default_value": 0 }, "machine_gcode_flavor": { diff --git a/resources/definitions/uniqbot_one.def.json b/resources/definitions/uniqbot_one.def.json index ee536edfb0..d6410a26e7 100644 --- a/resources/definitions/uniqbot_one.def.json +++ b/resources/definitions/uniqbot_one.def.json @@ -39,7 +39,7 @@ "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_nozzle_gantry_distance": { + "gantry_height": { "default_value": 55 }, "machine_gcode_flavor": { From a5f8546d698d31c9f9840a7ff4b50aa7d0968dc7 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 18 May 2016 16:29:57 +0200 Subject: [PATCH 143/224] Fixed cases where getValue was still used. We now use getProperty instead CURA-1278 --- cura/BuildVolume.py | 42 +++++++++++++++++----------------- plugins/SolidView/SolidView.py | 2 +- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 4397c798f7..77bda87825 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -161,12 +161,12 @@ class BuildVolume(SceneNode): self._active_container_stack = Application.getInstance().getGlobalContainerStack() if self._active_container_stack: - self._width = self._active_container_stack.getValue("machine_width") - if self._active_container_stack.getValue("print_sequence") == "one_at_a_time": - self._height = self._active_container_stack.getValue("gantry_height") + self._width = self._active_container_stack.getProperty("machine_width", "value") + if self._active_container_stack.getProperty("print_sequence", "value") == "one_at_a_time": + self._height = self._active_container_stack.getProperty("gantry_height", "value") else: - self._height = self._active_container_stack.getValue("machine_height") - self._depth = self._active_container_stack.getValue("machine_depth") + self._height = self._active_container_stack.getProperty("machine_height", "value") + self._depth = self._active_container_stack.getProperty("machine_depth", "value") self._updateDisallowedAreas() @@ -174,10 +174,10 @@ class BuildVolume(SceneNode): def _onSettingValueChanged(self, setting_key): if setting_key == "print_sequence": - if Application.getInstance().getGlobalContainerStack().getValue("print_sequence") == "one_at_a_time": - self._height = self._active_container_stack.getValue("gantry_height") + if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time": + self._height = self._active_container_stack.getProperty("gantry_height", "value") else: - self._height = self._active_container_stack.getValue("machine_depth") + self._height = self._active_container_stack.getProperty("machine_depth", "value") self.rebuild() if setting_key in self._skirt_settings: self._updateDisallowedAreas() @@ -187,7 +187,7 @@ class BuildVolume(SceneNode): if not self._active_container_stack: return - disallowed_areas = self._active_container_stack.getValue("machine_disallowed_areas") + disallowed_areas = self._active_container_stack.getProperty("machine_disallowed_areas", "value") areas = [] skirt_size = 0.0 @@ -212,8 +212,8 @@ class BuildVolume(SceneNode): # Add the skirt areas around the borders of the build plate. if skirt_size > 0: - half_machine_width = self._active_container_stack.getValue("machine_width") / 2 - half_machine_depth = self._active_container_stack.getValue("machine_depth") / 2 + half_machine_width = self._active_container_stack.getProperty("machine_width", "value") / 2 + half_machine_depth = self._active_container_stack.getProperty("machine_depth", "value") / 2 areas.append(Polygon(numpy.array([ [-half_machine_width, -half_machine_depth], @@ -249,21 +249,21 @@ class BuildVolume(SceneNode): def _getSkirtSize(self, container_stack): skirt_size = 0.0 - adhesion_type = container_stack.getValue("adhesion_type") + adhesion_type = container_stack.getProperty("adhesion_type", "value") if adhesion_type == "skirt": - skirt_distance = container_stack.getValue("skirt_gap") - skirt_line_count = container_stack.getValue("skirt_line_count") - skirt_size = skirt_distance + (skirt_line_count * container_stack.getValue("skirt_line_width")) + skirt_distance = container_stack.getProperty("skirt_gap", "value") + skirt_line_count = container_stack.getProperty("skirt_line_count", "value") + skirt_size = skirt_distance + (skirt_line_count * container_stack.getProperty("skirt_line_width", "value")) elif adhesion_type == "brim": - skirt_size = container_stack.getValue("brim_line_count") * container_stack.getValue("skirt_line_width") + skirt_size = container_stack.getProperty("brim_line_count", "value") * container_stack.getProperty("skirt_line_width", "value") elif adhesion_type == "raft": - skirt_size = container_stack.getValue("raft_margin") + skirt_size = container_stack.getProperty("raft_margin", "value") - if container_stack.getValue("draft_shield_enabled"): - skirt_size += container_stack.getValue("draft_shield_dist") + if container_stack.getProperty("draft_shield_enabled", "value"): + skirt_size += container_stack.getProperty("draft_shield_dist", "value") - if container_stack.getValue("xy_offset"): - skirt_size += container_stack.getValue("xy_offset") + if container_stack.getProperty("xy_offset", "value"): + skirt_size += container_stack.getProperty("xy_offset", "value") return skirt_size diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 1c65ea5dfe..9aec1a7290 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -37,7 +37,7 @@ class SolidView(View): if Application.getInstance().getGlobalContainerStack(): if Preferences.getInstance().getValue("view/show_overhang"): - angle = Application.getInstance().getGlobalContainerStack().getValue("support_angle") + angle = Application.getInstance().getGlobalContainerStack().getProperty("support_angle", "value") if angle is not None: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle))) else: From b621958098a7d4080de1b366d6bc1fd819423aa4 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 18 May 2016 16:33:10 +0200 Subject: [PATCH 144/224] Fix uses of getValue after its removal from Uranium API --- cura/BuildVolume.py | 13 +++++++++++-- plugins/SolidView/SolidView.py | 1 - 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 77bda87825..61802167a7 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -37,6 +37,7 @@ class BuildVolume(SceneNode): self.setCalculateBoundingBox(False) + self._active_container_stack = None Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged) self._onGlobalContainerStackChanged() @@ -158,9 +159,14 @@ class BuildVolume(SceneNode): Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds def _onGlobalContainerStackChanged(self): + if self._active_container_stack: + self._active_container_stack.propertyChanged.disconnect(self._onSettingPropertyChanged) + self._active_container_stack = Application.getInstance().getGlobalContainerStack() if self._active_container_stack: + self._active_container_stack.propertyChanged.connect(self._onSettingPropertyChanged) + self._width = self._active_container_stack.getProperty("machine_width", "value") if self._active_container_stack.getProperty("print_sequence", "value") == "one_at_a_time": self._height = self._active_container_stack.getProperty("gantry_height", "value") @@ -172,12 +178,15 @@ class BuildVolume(SceneNode): self.rebuild() - def _onSettingValueChanged(self, setting_key): + def _onSettingPropertyChanged(self, setting_key, property_name): + if property_name != "value": + return + if setting_key == "print_sequence": if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time": self._height = self._active_container_stack.getProperty("gantry_height", "value") else: - self._height = self._active_container_stack.getProperty("machine_depth", "value") + self._height = self._active_container_stack.getProperty("machine_height", "value") self.rebuild() if setting_key in self._skirt_settings: self._updateDisallowedAreas() diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 9aec1a7290..71b29c8186 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -35,7 +35,6 @@ class SolidView(View): self._disabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) if Application.getInstance().getGlobalContainerStack(): - if Preferences.getInstance().getValue("view/show_overhang"): angle = Application.getInstance().getGlobalContainerStack().getProperty("support_angle", "value") if angle is not None: From 3b5a74047bcb64890480cc9fc4f951c247d44ca8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 13:40:42 +0200 Subject: [PATCH 145/224] Add setting instance type for extruder This type is not included in the global stack structure yet since there is no global stack structure per extruder yet. Contributes to issue CURA-1278. --- cura/CuraApplication.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 39a25c34ad..ee9b71dd33 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -74,6 +74,7 @@ class CuraApplication(QtApplication): VariantInstanceContainer = Resources.UserType + 5 UserInstanceContainer = Resources.UserType + 6 MachineStack = Resources.UserType + 7 + ExtruderInstanceContainer = Resources.UserType + 8 Q_ENUMS(ResourceTypes) @@ -124,6 +125,7 @@ class CuraApplication(QtApplication): Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") Resources.addStorageType(self.ResourceTypes.MaterialInstanceContainer, "materials") + Resources.addStorageType(self.ResourceTypes.ExtruderInstanceContainer, "extruder") Resources.addStorageType(self.ResourceTypes.UserInstanceContainer, "user") Resources.addStorageType(self.ResourceTypes.MachineStack, "machine_instances") From 6b0a33e166c4d916852a17a5edb70ce19150d90d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 18 May 2016 17:53:27 +0200 Subject: [PATCH 146/224] Move dual extrusion settings into FDMPrinter This involves making labels and descriptions for some dual-extrusion machine settings, and default values for everything, making sure inheritance is correct, etc. Contributes to issue CURA-1278. --- cura/CuraApplication.py | 2 +- resources/definitions/fdmprinter.def.json | 362 ++++++++++++++++++ .../machines/dual_extrusion_printer.json | 361 ----------------- 3 files changed, 363 insertions(+), 362 deletions(-) delete mode 100644 resources/machines/dual_extrusion_printer.json diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ee9b71dd33..eee0807161 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -125,7 +125,7 @@ class CuraApplication(QtApplication): Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") Resources.addStorageType(self.ResourceTypes.MaterialInstanceContainer, "materials") - Resources.addStorageType(self.ResourceTypes.ExtruderInstanceContainer, "extruder") + Resources.addStorageType(self.ResourceTypes.ExtruderInstanceContainer, "extruders") Resources.addStorageType(self.ResourceTypes.UserInstanceContainer, "user") Resources.addStorageType(self.ResourceTypes.MachineStack, "machine_instances") diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 603dc18e92..cd997c3f34 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -241,6 +241,92 @@ "default_value": 0.4, "minimum_value": "0.001", "maximum_value_warning": "10" + }, + "machine_nozzle_offset_x": + { + "label": "Nozzle X Offset", + "description": "The x-coordinate of the offset of the nozzle.", + "type": "float", + "unit": "mm", + "default_value": 0, + "global_only": "True" + }, + "machine_nozzle_offset_y": + { + "label": "Nozzle Y Offset", + "description": "The y-coordinate of the offset of the nozzle.", + "type": "float", + "unit": "mm", + "default_value": 0, + "global_only": "True" + }, + "machine_extruder_start_code": + { + "label": "Extruder Start G-Code", + "description": "Start g-code to execute whenever turning the extruder on.", + "type": "str", + "default_value": "", + "global_only": "True" + }, + "machine_extruder_start_pos_abs": + { + "label": "Extruder Start Position Absolute", + "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" + }, + "machine_extruder_start_pos_x": + { + "label": "Extruder Start Position X", + "description": "The x-coordinate of the starting position when turning the extruder on.", + "type": "float", + "unit": "mm", + "default_value": 0, + "global_only": "True" + }, + "machine_extruder_start_pos_y": + { + "label": "Extruder Start Position Y", + "description": "The y-coordinate of the starting position when turning the extruder on.", + "type": "float", + "unit": "mm", + "default_value": 0, + "global_only": "True" + }, + "machine_extruder_end_code": + { + "label": "Extruder End G-Code", + "description": "End g-code to execute whenever turning the extruder off.", + "type": "str", + "default_value": "", + "global_only": "True" + }, + "machine_extruder_end_pos_abs": + { + "label": "Extruder End Position Absolute", + "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" + }, + "machine_extruder_end_pos_x": + { + "label": "Extruder End Position X", + "description": "The x-coordinate of the ending position when turning the extruder off.", + "type": "float", + "unit": "mm", + "default_value": 0, + "global_only": "True" + }, + "machine_extruder_end_pos_y": + { + "label": "Extruder End Position Y", + "description": "The y-coordinate of the ending position when turning the extruder off.", + "type": "float", + "unit": "mm", + "default_value": 0, + "global_only": "True" } } }, @@ -391,6 +477,20 @@ "enabled": "support_roof_enable", "global_only": true, "value": "line_width" + }, + "prime_tower_line_width": + { + "label": "Prime Tower Line Width", + "description": "Width of a single prime tower line.", + "type": "float", + "unit": "mm", + "enabled": "prime_tower_enable", + "default_value": 0.4, + "value": "line_width", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "global_only": "True" } } } @@ -889,6 +989,71 @@ "minimum_value_warning": "-0.0001", "maximum_value_warning": "10", "enabled": "retraction_enable" + }, + "material_standby_temperature": + { + "label": "Standby Temperature", + "description": "The temperature of the nozzle when another nozzle is currently used for printing.", + "type": "float", + "unit": "°C", + "default_value": 150, + "minimum_value": "0", + "maximum_value_warning": "260", + "global_only": "True" + }, + "switch_extruder_retraction_amount": + { + "label": "Nozzle Switch Retraction Distance", + "description": "The amount of retraction: Set at 0 for no retraction at all. This should generally be the same as the length of the heat zone.", + "type": "float", + "unit": "mm", + "enabled": "retraction_enable", + "default_value": 20, + "value": "machine_heat_zone_length", + "minimum_value_warning": "0", + "maximum_value_warning": "100", + "global_only": "True" + }, + "switch_extruder_retraction_speeds": + { + "label": "Nozzle Switch Retraction Speed", + "description": "The speed at which the filament is retracted. A higher retraction speed works better, but a very high retraction speed can lead to filament grinding.", + "type": "float", + "unit": "mm/s", + "enabled": "retraction_enable", + "default_value": 20, + "minimum_value": "0.1", + "maximum_value_warning": "300", + "global_only": "True", + "children": + { + "switch_extruder_retraction_speed": + { + "label": "Nozzle Switch Retract Speed", + "description": "The speed at which the filament is retracted during a nozzle switch retract.", + "type": "float", + "unit": "mm/s", + "enabled": "retraction_enable", + "default_value": 20, + "value": "switch_extruder_retraction_speeds", + "minimum_value": "0.1", + "maximum_value_warning": "300", + "global_only": "True" + }, + "switch_extruder_prime_speed": + { + "label": "Nozzle Switch Prime Speed", + "description": "The speed at which the filament is pushed back after a nozzle switch retraction.", + "type": "float", + "unit": "mm/s", + "enabled": "retraction_enable", + "default_value": 20, + "value": "switch_extruder_retraction_speeds", + "minimum_value": "0.1", + "maximum_value_warning": "300", + "global_only": "True" + } + } } } }, @@ -1018,6 +1183,19 @@ "global_only": true } } + }, + "speed_prime_tower": + { + "label": "Prime Tower Speed", + "description": "The speed at which the prime tower is printed. Printing the prime tower slower can make it more stable when the adhesion between the different filaments is suboptimal.", + "type": "float", + "unit": "mm/s", + "enabled": "prime_tower_enable", + "default_value": 60, + "value": "speed_print", + "minimum_value": "0.1", + "maximum_value_warning": "150", + "global_only": "True" } } }, @@ -1962,6 +2140,190 @@ } } }, + "dual": + { + "label": "Dual Extrusion", + "type": "category", + "icon": "category_dual", + "description": "Settings used for printing with multiple extruders.", + "children": + { + "extruder_nr": + { + "label": "Extruder", + "description": "The extruder train used for printing. This is used in multi-extrusion.", + "type": "int", + "default_value": 0, + "minimum_value": "0", + "maximum_value": "machine_extruder_count - 1" + }, + "adhesion_extruder_nr": + { + "label": "Platform Adhesion Extruder", + "description": "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion.", + "type": "int", + "default_value": 0, + "minimum_value": "0", + "maximum_value": "machine_extruder_count - 1", + "global_only": "True" + }, + "support_extruder_nr": + { + "label": "Support Extruder", + "description": "The extruder train to use for printing the support. This is used in multi-extrusion.", + "type": "int", + "default_value": 0, + "minimum_value": "0", + "maximum_value": "machine_extruder_count - 1", + "global_only": "True", + "children": { + "support_infill_extruder_nr": + { + "label": "Support Infill Extruder", + "description": "The extruder train to use for printing the infill of the support. This is used in multi-extrusion.", + "type": "int", + "default_value": 0, + "value": "support_extruder_nr", + "minimum_value": "0", + "maximum_value": "machine_extruder_count - 1", + "global_only": "True" + }, + "support_extruder_nr_layer_0": + { + "label": "First Layer Support Extruder", + "description": "The extruder train to use for printing the first layer of support infill. This is used in multi-extrusion.", + "type": "int", + "default_value": 0, + "value": "support_extruder_nr", + "minimum_value": "0", + "maximum_value": "machine_extruder_count - 1", + "global_only": "True" + }, + "support_roof_extruder_nr": + { + "label": "Support Roof Extruder", + "description": "The extruder train to use for printing the roof of the support. This is used in multi-extrusion.", + "type": "int", + "default_value": 0, + "value": "support_extruder_nr", + "minimum_value": "0", + "maximum_value": "machine_extruder_count - 1", + "global_only": "True" + } + } + }, + "prime_tower_enable": + { + "label": "Enable Prime Tower", + "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" + }, + "prime_tower_size": + { + "label": "Prime Tower Size", + "description": "The width of the prime tower.", + "type": "float", + "unit": "mm", + "enabled": "prime_tower_enable", + "default_value": 15, + "value": "15 if prime_tower_enable else 0", + "minimum_value": "0", + "maximum_value_warning": "20", + "global_only": "True" + }, + "prime_tower_position_x": + { + "label": "Prime Tower X Position", + "description": "The x coordinate of the position of the prime tower.", + "type": "float", + "unit": "mm", + "enabled": "prime_tower_enable", + "default_value": 200, + "minimum_value_warning": "-1000", + "maximum_value_warning": "1000", + "global_only": "True" + }, + "prime_tower_position_y": + { + "label": "Prime Tower Y Position", + "description": "The y coordinate of the position of the prime tower.", + "type": "float", + "unit": "mm", + "enabled": "prime_tower_enable", + "default_value": 200, + "minimum_value_warning": "-1000", + "maximum_value_warning": "1000", + "global_only": "True" + }, + "prime_tower_flow": + { + "label": "Prime Tower Flow", + "description": "Flow compensation: the amount of material extruded is multiplied by this value.", + "type": "float", + "unit": "%", + "enabled": "prime_tower_enable", + "default_value": 100, + "minimum_value": "0.0001", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "global_only": "True" + }, + "prime_tower_wipe_enabled": + { + "label": "Wipe Nozzle on Prime Tower", + "description": "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower.", + "type": "bool", + "enabled": "prime_tower_enable", + "default_value": false, + "global_only": "True" + }, + "multiple_mesh_overlap": + { + "label": "Dual Extrusion Overlap", + "description": "Make the objects printed with different extruder trains overlap a bit. This makes the different materials bond together better.", + "type": "float", + "unit": "mm", + "default_value": 0.15, + "minimum_value": "0", + "maximum_value_warning": "1.0", + "global_only": "True" + }, + "ooze_shield_enabled": + { + "label": "Enable Ooze Shield", + "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" + }, + "ooze_shield_angle": + { + "label": "Ooze Shield Angle", + "description": "The maximum angle a part in the ooze shield will have. With 0 degrees being vertical, and 90 degrees being horizontal. A smaller angle leads to less failed ooze shields, but more material.", + "type": "float", + "unit": "°", + "enabled": "ooze_shield_enabled", + "default_value": 60, + "minimum_value": "0", + "maximum_value": "90", + "global_only": "True" + }, + "ooze_shield_dist": + { + "label": "Ooze Shield Distance", + "description": "Distance of the ooze shield from the print, in the X/Y directions.", + "type": "float", + "unit": "mm", + "enabled": "ooze_shield_enabled", + "default_value": 2, + "minimum_value": "0", + "maximum_value_warning": "30", + "global_only": "True" + } + } + }, "experimental": { "label": "Experimental Modes", diff --git a/resources/machines/dual_extrusion_printer.json b/resources/machines/dual_extrusion_printer.json deleted file mode 100644 index 57ad490cdd..0000000000 --- a/resources/machines/dual_extrusion_printer.json +++ /dev/null @@ -1,361 +0,0 @@ -{ - "version": 1, - "id": "dual_extrusion", - "name": "Dual Extrusion Base File", - "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", - "inherits": "fdmprinter.json", - - "visible": false, - - "machine_extruder_trains": { - "0": { - "extruder_nr": { - "default": 0 - }, - "machine_nozzle_offset_x": { - "default": 0 - }, - "machine_nozzle_offset_y": { - "default": 0 - }, - "machine_nozzle_heat_up_speed": { - "default": 2 - }, - "machine_nozzle_cool_down_speed": { - "default": 2 - }, - "machine_nozzle_tip_outer_diameter": { - "default": 1 - }, - "machine_nozzle_head_distance": { - "default": 3 - }, - "machine_nozzle_expansion_angle": { - "default": 45 - }, - "machine_heat_zone_length": { - "default": 16 - } - }, - "1": { - "extruder_nr": { - "default": 1 - }, - "machine_nozzle_offset_x": { - "default": 0 - }, - "machine_nozzle_offset_y": { - "default": 0 - }, - "machine_nozzle_heat_up_speed": { - "default": 2 - }, - "machine_nozzle_cool_down_speed": { - "default": 2 - }, - "machine_nozzle_tip_outer_diameter": { - "default": 1 - }, - "machine_nozzle_head_distance": { - "default": 3 - }, - "machine_nozzle_expansion_angle": { - "default": 45 - }, - "machine_heat_zone_length": { - "default": 16 - } - } - }, - - "machine_settings": { - "machine_use_extruder_offset_to_offset_coords": { "default": false }, - - "machine_nozzle_offset_x": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_nozzle_offset_y": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_extruder_start_code": { "default": "", "SEE_machine_extruder_trains": true }, - "machine_extruder_start_pos_abs": { "default": false, "SEE_machine_extruder_trains": true }, - "machine_extruder_start_pos_x": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_extruder_start_pos_y": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_extruder_end_pos_abs": { "default": false, "SEE_machine_extruder_trains": true }, - "machine_extruder_end_pos_x": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_extruder_end_pos_y": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_extruder_end_code": { "default": "", "SEE_machine_extruder_trains": true } - }, - "overrides": { - "speed_print": { - "children": { - "speed_prime_tower": { - "label": "Prime Tower Speed", - "description": "The speed at which the prime tower is printed. Printing the prime tower slower can make it more stable when the adhesion between the different filaments is suboptimal.", - "unit": "mm/s", - "type": "float", - "min_value": "0.1", - "max_value_warning": "150", - "default": 60, - "visible": false, - "enabled": "prime_tower_enable", - "global_only": true - } - } - }, - "line_width": { - "children": { - "prime_tower_line_width": { - "label": "Prime Tower Line Width", - "description": "Width of a single prime tower line.", - "unit": "mm", - "min_value": "0.0001", - "min_value_warning": "0.2", - "max_value_warning": "5", - "default": 0.4, - "type": "float", - "visible": false, - "enabled": "prime_tower_enable", - "global_only": true - } - } - } - }, - "categories": { - "dual": { - "label": "Dual Extrusion", - "visible": true, - "icon": "category_dual", - "settings": { - "extruder_nr": { - "label": "Extruder", - "description": "The extruder train used for printing. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "always_visible": true - }, - "adhesion_extruder_nr": { - "label": "Platform Adhesion Extruder", - "description": "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "global_only": true - }, - "support_extruder_nr": { - "label": "Support Extruder", - "description": "The extruder train to use for printing the support. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "global_only": true, - "children": { - "support_infill_extruder_nr": { - "label": "Support Infill Extruder", - "description": "The extruder train to use for printing the infill of the support. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "global_only": true - }, - "support_extruder_nr_layer_0": { - "label": "First Layer Support Extruder", - "description": "The extruder train to use for printing the first layer of support infill. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "global_only": true - }, - "support_roof_extruder_nr": { - "label": "Support Roof Extruder", - "description": "The extruder train to use for printing the roof of the support. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "enabled": "support_roof_enable", - "global_only": true - } - } - }, - "prime_tower_enable": { - "label": "Enable Prime Tower", - "description": "Print a tower next to the print which serves to prime the material after each nozzle switch.", - "type": "boolean", - "visible": true, - "default": false, - "global_only": true - }, - "prime_tower_size": { - "label": "Prime Tower Size", - "description": "The width of the prime tower.", - "visible": false, - "type": "float", - "unit": "mm", - "default": 15, - "min_value": "0", - "max_value_warning": "20", - "inherit_function": "15 if prime_tower_enable else 0", - "enabled": "prime_tower_enable", - "global_only": true - }, - "prime_tower_position_x": { - "label": "Prime Tower X Position", - "description": "The x position of the prime tower.", - "visible": false, - "type": "float", - "unit": "mm", - "default": 200, - "min_value_warning": "-1000", - "max_value_warning": "1000", - "enabled": "prime_tower_enable", - "global_only": true - }, - "prime_tower_position_y": { - "label": "Prime Tower Y Position", - "description": "The y position of the prime tower.", - "visible": false, - "type": "float", - "unit": "mm", - "default": 200, - "min_value_warning": "-1000", - "max_value_warning": "1000", - "enabled": "prime_tower_enable", - "global_only": true - }, - "prime_tower_flow": { - "label": "Prime Tower Flow", - "description": "Flow compensation: the amount of material extruded is multiplied by this value.", - "visible": false, - "unit": "%", - "default": 100, - "type": "float", - "min_value": "5", - "min_value_warning": "50", - "max_value_warning": "150", - "enabled": "prime_tower_enable", - "global_only": true - }, - "prime_tower_wipe_enabled": { - "label": "Wipe Nozzle on Prime tower", - "description": "After printing the prime tower with the one nozzle, wipe the oozed material from the other nozzle off on the prime tower.", - "type": "boolean", - "default": false, - "enabled": "prime_tower_enable", - "global_only": true - }, - "multiple_mesh_overlap": { - "label": "Dual Extrusion Overlap", - "description": "Make the objects printed with different extruder trains overlap a bit. This makes the different materials bond together better.", - "visible": false, - "type": "float", - "unit": "mm", - "default": 0.15, - "min_value": "0", - "max_value_warning": "1.0", - "global_only": true - }, - "ooze_shield_enabled": { - "label": "Enable Ooze Shield", - "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": "boolean", - "default": false, - "global_only": true - }, - "ooze_shield_angle": { - "label": "Ooze Shield Angle", - "description": "The maximum angle a part in the ooze shield will have. With 0 degrees being vertical, and 90 degrees being horizontal. A smaller angle leads to less failed ooze shields, but more material.", - "unit": "°", - "type": "float", - "min_value": "0", - "max_value": "90", - "default": 60, - "visible": false, - "enabled": "ooze_shield_enabled", - "global_only": true - }, - "ooze_shield_dist": { - "label": "Ooze Shields Distance", - "description": "Distance of the ooze shield from the print, in the X/Y directions.", - "unit": "mm", - "type": "float", - "min_value": "0", - "max_value_warning": "30", - "default": 2, - "visible": false, - "enabled": "ooze_shield_enabled", - "global_only": true - } - } - }, - "material": { - "settings": { - "material_standby_temperature": { - "label": "Standby Temperature", - "description": "The temperature of the nozzle when another nozzle is currently used for printing.", - "unit": "°C", - "type": "float", - "default": 150, - "min_value": "0", - "max_value_warning": "260", - "global_only": "True", - "visible": false - }, - "switch_extruder_retraction_amount": { - "label": "Nozzle Switch Retraction Distance", - "description": "The amount of retraction: Set at 0 for no retraction at all. This should generally be the same as the length of the heat zone.", - "unit": "mm", - "type": "float", - "default": 20, - "min_value_warning": "0", - "max_value_warning": "100", - "visible": false, - "inherit_function": "machine_heat_zone_length", - "enabled": "retraction_enable", - "global_only": true - }, - "switch_extruder_retraction_speeds": { - "label": "Nozzle Switch Retraction Speed", - "description": "The speed at which the filament is retracted. A higher retraction speed works better, but a very high retraction speed can lead to filament grinding.", - "unit": "mm/s", - "type": "float", - "default": 20, - "min_value": "0.1", - "max_value_warning": "300", - "visible": false, - "inherit": false, - "enabled": "retraction_enable", - "global_only": true, - "children": { - "switch_extruder_retraction_speed": { - "label": "Nozzle Switch Retract Speed", - "description": "The speed at which the filament is retracted during a nozzle switch retract. ", - "unit": "mm/s", - "type": "float", - "default": 20, - "min_value": "0.1", - "max_value_warning": "300", - "visible": false, - "enabled": "retraction_enable", - "global_only": true - }, - "switch_extruder_prime_speed": { - "label": "Nozzle Switch Prime Speed", - "description": "The speed at which the filament is pushed back after a nozzle switch retraction.", - "unit": "mm/s", - "type": "float", - "default": 20, - "min_value": "0.1", - "max_value_warning": "300", - "visible": false, - "enabled": "retraction_enable", - "global_only": true - } - } - } - } - } - } -} From 0e792e7a2257da9af263ab491980540f2431f7f7 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 19 May 2016 11:25:25 +0200 Subject: [PATCH 147/224] Added SettingOverrideDecorator stub CURA-1278 --- cura/SettingOverrideDecorator.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 cura/SettingOverrideDecorator.py diff --git a/cura/SettingOverrideDecorator.py b/cura/SettingOverrideDecorator.py new file mode 100644 index 0000000000..5574fb3182 --- /dev/null +++ b/cura/SettingOverrideDecorator.py @@ -0,0 +1,13 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. +from UM.Scene.SceneNodeDecorator import SceneNodeDecorator + + +## 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): + + def __init__(self): + super().__init__() + From e20691c4216483f5edf0a554c7b7873fcb55d05f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 19 May 2016 11:41:10 +0200 Subject: [PATCH 148/224] Fleshing out of SettingOverrideDecorator CURA-1278 --- cura/SettingOverrideDecorator.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/cura/SettingOverrideDecorator.py b/cura/SettingOverrideDecorator.py index 5574fb3182..826970c51f 100644 --- a/cura/SettingOverrideDecorator.py +++ b/cura/SettingOverrideDecorator.py @@ -2,12 +2,28 @@ # Cura is released under the terms of the AGPLv3 or higher. from UM.Scene.SceneNodeDecorator import SceneNodeDecorator +from UM.Settings.ContainerStack import ContainerStack +from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.ContainerRegistry import ContainerRegistry + +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. class SettingOverrideDecorator(SceneNodeDecorator): - def __init__(self): super().__init__() + self._stack = ContainerStack(id = "SettingOverrideStack") + self._instance = InstanceContainer(id = "SettingOverrideInstanceContainer") + self._stack.addContainer(self._instance) + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged) + self._onGlobalContainerStackChanged() + + def _onGlobalContainerStackChanged(self): + ## Ensure that the next stack is always the global stack. + self._stack.setNextStack(Application.getInstance().getGlobalContainerStack()) + + def getStack(self): + return self._stack \ No newline at end of file From 570910187fd7f2557955d19aba7549a8d79050ce Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 19 May 2016 16:27:51 +0200 Subject: [PATCH 149/224] Fix typo in method name CURA-1278 --- resources/qml/Settings/SettingCategory.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml index 56a20aec3b..f4e3dbe5ae 100644 --- a/resources/qml/Settings/SettingCategory.qml +++ b/resources/qml/Settings/SettingCategory.qml @@ -62,7 +62,7 @@ Button { width: height; onClicked: { - base.showAllHidenInheritedSettings() + base.showAllHiddenInheritedSettings() } color: UM.Theme.getColor("setting_control_button") From 2696f883b026fe4ea49fc22d62770099ee5521c6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 19 May 2016 16:31:29 +0200 Subject: [PATCH 150/224] Add a bit of documentation I was going further with this, but then it was decided that we need to do this later but I won't throw away this bit of documentation when I have it anyway. Contributes to issue CURA-1278. --- plugins/CuraEngineBackend/StartSliceJob.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index f51cff5d93..9fecb20646 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -38,20 +38,23 @@ class StartSliceJob(Job): self._profile = profile self._socket = socket + ## Runs the job that initiates the slicing. def run(self): self._scene.acquireLock() + # Remove old layer data. for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("getLayerData"): node.getParent().removeChild(node) break + # Get the objects in their groups to print. object_groups = [] if self._profile.getSettingValue("print_sequence") == "one_at_a_time": for node in OneAtATimeIterator(self._scene.getRoot()): temp_list = [] - ## Node can't be printed, so don't bother sending it. + # Node can't be printed, so don't bother sending it. if getattr(node, "_outside_buildarea", False): continue From 2fa24edc1fdac439ce23450ee85994039b146af3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 20 May 2016 11:29:48 +0200 Subject: [PATCH 151/224] Fixed type for global_only property CURA-1278 --- cura/CuraApplication.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index eee0807161..adce2f854e 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -24,7 +24,7 @@ from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation -from UM.Settings.SettingDefinition import SettingDefinition +from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog @@ -119,7 +119,7 @@ class CuraApplication(QtApplication): Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") - SettingDefinition.addSupportedProperty("global_only", "bool") + SettingDefinition.addSupportedProperty("global_only", DefinitionPropertyType.Function, default = False) ## Add the 4 types of profiles to storage. Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") From 9dc70fba02b1c52d3724a5b66fa80926300a4814 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 May 2016 12:42:18 +0200 Subject: [PATCH 152/224] Add missing category-metadata Forgot to add this, apparently. Contributes to issue CURA-1278. --- resources/definitions/ultimaker2.def.json | 1 + resources/definitions/ultimaker_original.def.json | 1 + 2 files changed, 2 insertions(+) diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index 606d51c545..7b2222e5b3 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -7,6 +7,7 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Ultimaker", + "category": "Ultimaker", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", "platform": "ultimaker2_platform.obj", diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index cd2fac4599..ae659174bd 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -6,6 +6,7 @@ "metadata": { "author": "Ultimaker", "manufacturer": "Ultimaker", + "category": "Ultimaker", "file_formats": "text/x-gcode", "icon": "icon_ultimaker.png", "platform": "ultimaker_platform.stl", From 6fe70fc7e9a4e9674c7375c129fe2e71fa1ec53b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 May 2016 13:28:05 +0200 Subject: [PATCH 153/224] Add definition for machine_use_extruder_offset_to_offset_coords While this was only used by Ultimaker printers, it is not specific to Ultimaker's printers so I'm putting the definition in FDMPrinter. Contributes to issue CURA-1278. --- resources/definitions/fdmprinter.def.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index cd997c3f34..e22d10f2aa 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -327,6 +327,13 @@ "unit": "mm", "default_value": 0, "global_only": "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 } } }, From 7656f5a19b45b8eec11b7617ff1d6f213161014d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 May 2016 13:30:19 +0200 Subject: [PATCH 154/224] Make definition of machine_extruder_drive_upgrade This setting is specific to UMO, so I'm defining it in the UMO definition. Contributes to issue CURA-1278. --- resources/definitions/ultimaker_original.def.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index ae659174bd..76b6c8b4ff 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -18,6 +18,14 @@ ] }, + "settings": { + "machine_extruder_drive_upgrade": { + "label": "Extruder Drive Upgrade", + "description": "This machine has the extruder drive upgrade.", + "type": "bool", + "default_value": false + } + }, "overrides": { "machine_width": { "default_value": 205 @@ -63,9 +71,6 @@ }, "machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - }, - "machine_extruder_drive_upgrade": { - "default_value": false } } } From 8e3d6cf2b549ace769387f4e157e27bdae79314a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 May 2016 13:34:47 +0200 Subject: [PATCH 155/224] Repair x and y nozzle offsets The setting name is different. This probably wasn't updated for a while. Contributes to issue CURA-1278. --- resources/definitions/innovo_inventor.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index 14619833a7..9ba8d0d44b 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -43,10 +43,10 @@ "gantry_height": { "default_value": 82.3 }, - "machine_nozzle_offset_x_1": { + "machine_nozzle_offset_x": { "default_value": 0 }, - "machine_nozzle_offset_y_1": { + "machine_nozzle_offset_y": { "default_value": 15 }, "machine_gcode_flavor": { From 305cb27ac0e6550f359c2e5f52031970f1a80d67 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 20 May 2016 13:35:38 +0200 Subject: [PATCH 156/224] Global_only is now a string, as the filtering does not work with settingFunctions CURA-1278 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index adce2f854e..f328e83174 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -119,7 +119,7 @@ class CuraApplication(QtApplication): Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") - SettingDefinition.addSupportedProperty("global_only", DefinitionPropertyType.Function, default = False) + SettingDefinition.addSupportedProperty("global_only", DefinitionPropertyType.String, default = "False") ## Add the 4 types of profiles to storage. Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") From 295cea338cbfcfa141b485acec90a3b9fe78e2e1 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 20 May 2016 14:09:58 +0200 Subject: [PATCH 157/224] Translate tool is now no longer stopped by ton of errors CURA-1278 --- cura/ConvexHullDecorator.py | 6 +++--- cura/ConvexHullJob.py | 10 +++++----- .../CuraEngineBackend/CuraEngineBackend.py | 20 +++++++++---------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index b53737cc80..04a46ecaca 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -25,9 +25,9 @@ class ConvexHullDecorator(SceneNodeDecorator): self._convex_hull_job = None self._profile = None - Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged) - Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineInstanceChanged) - self._onActiveProfileChanged() + #Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged) + #Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineInstanceChanged) + #self._onActiveProfileChanged() ## Force that a new (empty) object is created upon copy. def __deepcopy__(self, memo): diff --git a/cura/ConvexHullJob.py b/cura/ConvexHullJob.py index 9fb18981d3..7e814af7d7 100644 --- a/cura/ConvexHullJob.py +++ b/cura/ConvexHullJob.py @@ -59,12 +59,12 @@ class ConvexHullJob(Job): # This is done because of rounding errors. hull = hull.getMinkowskiHull(Polygon(numpy.array([[-0.5, -0.5], [-0.5, 0.5], [0.5, 0.5], [0.5, -0.5]], numpy.float32))) - profile = Application.getInstance().getMachineManager().getWorkingProfile() - if profile: - if profile.getSettingValue("print_sequence") == "one_at_a_time" and not self._node.getParent().callDecoration("isGroup"): + global_stack = Application.getInstance().getGlobalContainerStack() + if global_stack: + if global_stack.getProperty("print_sequence", "value")== "one_at_a_time" and not self._node.getParent().callDecoration("isGroup"): # Printing one at a time and it's not an object in a group self._node.callDecoration("setConvexHullBoundary", copy.deepcopy(hull)) - head_and_fans = Polygon(numpy.array(profile.getSettingValue("machine_head_with_fans_polygon"), numpy.float32)) + head_and_fans = Polygon(numpy.array(global_stack.getProperty("machine_head_with_fans_polygon", "value"), numpy.float32)) # Full head hull is used to actually check the order. full_head_hull = hull.getMinkowskiHull(head_and_fans) @@ -77,7 +77,7 @@ class ConvexHullJob(Job): # Min head hull is used for the push free min_head_hull = hull.getMinkowskiHull(head_and_fans) self._node.callDecoration("setConvexHullHead", min_head_hull) - hull = hull.getMinkowskiHull(Polygon(numpy.array(profile.getSettingValue("machine_head_polygon"),numpy.float32))) + hull = hull.getMinkowskiHull(Polygon(numpy.array(global_stack.getProperty("machine_head_polygon","value"),numpy.float32))) else: self._node.callDecoration("setConvexHullHead", None) if self._node.getParent() is None: # Node was already deleted before job is done. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 5102427823..a57aa01ba9 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -134,14 +134,15 @@ class CuraEngineBackend(Backend): self._process_layers_job.abort() self._process_layers_job = None - if self._profile.hasErrorValue(): - Logger.log("w", "Profile has error values. Aborting slicing") - if self._message: - self._message.hide() - self._message = None - self._message = Message(catalog.i18nc("@info:status", "Unable to slice. Please check your setting values for errors.")) - self._message.show() - return #No slicing if we have error values since those are by definition illegal values. + #TODO: Re-add don't slice with error stuff. + #if self._profile.hasErrorValue(): + # Logger.log("w", "Profile has error values. Aborting slicing") + # if self._message: + # self._message.hide() + # self._message = None + # self._message = Message(catalog.i18nc("@info:status", "Unable to slice. Please check your setting values for errors.")) + # self._message.show() + # return #No slicing if we have error values since those are by definition illegal values. self.processingProgress.emit(0.0) self.backendStateChange.emit(BackendState.NOT_STARTED) @@ -265,9 +266,6 @@ class CuraEngineBackend(Backend): self._change_timer.start() def _onChanged(self): - if not self._profile: - return - self._change_timer.start() def _onBackendConnected(self): From bcff683fb0cd2a415c561a0fcf02490979ecdb06 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 20 May 2016 14:15:06 +0200 Subject: [PATCH 158/224] Removed old perobject setting code, so plugin is actually loaded (instead of crashing) CURA-1278 --- .../PerObjectSettingsModel.py | 16 ++++++++-------- .../SettingOverrideModel.py | 13 +++++++------ plugins/PerObjectSettingsTool/__init__.py | 2 +- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsModel.py b/plugins/PerObjectSettingsTool/PerObjectSettingsModel.py index 7f7cef049b..cbe22d129e 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsModel.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsModel.py @@ -7,8 +7,8 @@ from UM.Application import Application from UM.Qt.ListModel import ListModel from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Scene.SceneNode import SceneNode -from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator -from UM.Settings.ProfileOverrideDecorator import ProfileOverrideDecorator +#from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator +#from UM.Settings.ProfileOverrideDecorator import ProfileOverrideDecorator from . import SettingOverrideModel @@ -35,7 +35,7 @@ class PerObjectSettingsModel(ListModel): self.setProperty(self.find("id", object_id), "profile", profile_name) profile = None - if profile_name != "global": + '''if profile_name != "global": profile = Application.getInstance().getMachineManager().findProfile(profile_name) node = self._scene.findObject(object_id) @@ -45,7 +45,7 @@ class PerObjectSettingsModel(ListModel): node.callDecoration("setProfile", profile) else: if node.getDecorator(ProfileOverrideDecorator): - node.removeDecorator(ProfileOverrideDecorator) + node.removeDecorator(ProfileOverrideDecorator)''' @pyqtSlot("quint64", str) def addSettingOverride(self, object_id, key): @@ -54,8 +54,8 @@ class PerObjectSettingsModel(ListModel): return node = self._scene.findObject(object_id) - if not node.getDecorator(SettingOverrideDecorator): - node.addDecorator(SettingOverrideDecorator()) + #if not node.getDecorator(SettingOverrideDecorator): + # node.addDecorator(SettingOverrideDecorator()) node.callDecoration("addSetting", key) @@ -64,8 +64,8 @@ class PerObjectSettingsModel(ListModel): node = self._scene.findObject(object_id) node.callDecoration("removeSetting", key) - if len(node.callDecoration("getAllSettings")) == 0: - node.removeDecorator(SettingOverrideDecorator) + #if len(node.callDecoration("getAllSettings")) == 0: + # node.removeDecorator(SettingOverrideDecorator) def _updateModel(self): self.clear() diff --git a/plugins/PerObjectSettingsTool/SettingOverrideModel.py b/plugins/PerObjectSettingsTool/SettingOverrideModel.py index 860650015c..d4bebfdfee 100644 --- a/plugins/PerObjectSettingsTool/SettingOverrideModel.py +++ b/plugins/PerObjectSettingsTool/SettingOverrideModel.py @@ -5,7 +5,7 @@ from PyQt5.QtCore import Qt, pyqtSlot, QUrl from UM.Application import Application from UM.Qt.ListModel import ListModel -from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator +#from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator class SettingOverrideModel(ListModel): KeyRole = Qt.UserRole + 1 @@ -29,9 +29,9 @@ class SettingOverrideModel(ListModel): self._node.decoratorsChanged.connect(self._onDecoratorsChanged) self._onDecoratorsChanged(None) - self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile() #To be able to get notified when a setting changes. - self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged) - Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onProfileChanged) + #self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile() #To be able to get notified when a setting changes. + #self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged) + #Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onProfileChanged) self.addRoleName(self.KeyRole, "key") self.addRoleName(self.LabelRole, "label") @@ -53,7 +53,8 @@ class SettingOverrideModel(ListModel): self._decorator.setSettingValue(key, value) def _onDecoratorsChanged(self, node): - if not self._node.getDecorator(SettingOverrideDecorator): + return + '''if not self._node.getDecorator(SettingOverrideDecorator): self.clear() return @@ -61,7 +62,7 @@ class SettingOverrideModel(ListModel): self._decorator.settingAdded.connect(self._onSettingsChanged) self._decorator.settingRemoved.connect(self._onSettingsChanged) self._decorator.settingValueChanged.connect(self._onSettingValueChanged) - self._onSettingsChanged() + self._onSettingsChanged()''' def _createOptionsModel(self, options): if not options: diff --git a/plugins/PerObjectSettingsTool/__init__.py b/plugins/PerObjectSettingsTool/__init__.py index 0d49b2c892..d5d249b430 100644 --- a/plugins/PerObjectSettingsTool/__init__.py +++ b/plugins/PerObjectSettingsTool/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": i18n_catalog.i18nc("@info:whatsthis", "Provides the Per Object Settings."), - "api": 2 + "api": 3 }, "tool": { "name": i18n_catalog.i18nc("@label", "Per Object Settings"), From e9380ba83d0a3b7c45b659547149914aff784cc8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 20 May 2016 15:08:17 +0200 Subject: [PATCH 159/224] Added rudimentary display of settings again CURA-1278 --- .../PerObjectCategory.qml | 29 ++++ .../PerObjectSettingsTool/PerObjectItem.qml | 29 ++++ .../PerObjectSettingsPanel.qml | 147 +++++------------- 3 files changed, 97 insertions(+), 108 deletions(-) create mode 100644 plugins/PerObjectSettingsTool/PerObjectCategory.qml create mode 100644 plugins/PerObjectSettingsTool/PerObjectItem.qml diff --git a/plugins/PerObjectSettingsTool/PerObjectCategory.qml b/plugins/PerObjectSettingsTool/PerObjectCategory.qml new file mode 100644 index 0000000000..2113a623a0 --- /dev/null +++ b/plugins/PerObjectSettingsTool/PerObjectCategory.qml @@ -0,0 +1,29 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium 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.1 as UM + +import ".." + +Button { + id: base; + + style: UM.Theme.styles.sidebar_category; + + signal showTooltip(string text); + signal hideTooltip(); + signal contextMenuRequested() + + text: definition.label + iconSource: UM.Theme.getIcon(definition.icon) + + checkable: true + checked: definition.expanded + + onClicked: definition.expanded ? settingDefinitionsModel.collapse(definition.key) : settingDefinitionsModel.expandAll(definition.key) +} diff --git a/plugins/PerObjectSettingsTool/PerObjectItem.qml b/plugins/PerObjectSettingsTool/PerObjectItem.qml new file mode 100644 index 0000000000..d2243ab562 --- /dev/null +++ b/plugins/PerObjectSettingsTool/PerObjectItem.qml @@ -0,0 +1,29 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.2 as UM + +UM.TooltipArea +{ + x: model.depth * UM.Theme.getSize("default_margin").width; + text: model.description; + + width: childrenRect.width; + height: childrenRect.height; + + Button + { + id: check + + text: definition.label + + //onClicked: delegateItem.settingsModel.setSettingVisible(model.key, checked); + } +} + + diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index c664aeaeef..19dab6bc26 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -6,7 +6,10 @@ import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 import QtQuick.Window 2.2 -import UM 1.1 as UM +import UM 1.2 as UM +import Cura 1.0 as Cura +import ".." + Item { id: base; @@ -133,6 +136,7 @@ Item { id: settingPickDialog title: catalog.i18nc("@title:window", "Pick a Setting to Customize") + property string labelFilter: "" TextField { id: filter; @@ -145,123 +149,50 @@ Item { placeholderText: catalog.i18nc("@label:textbox", "Filter..."); - onTextChanged: settingCategoriesModel.filter(text); + onTextChanged: settingPickDialog.labelFilter = text; } - ScrollView { - id: view; - anchors { + ScrollView + { + id: scrollView + + anchors + { top: filter.bottom; left: parent.left; right: parent.right; bottom: parent.bottom; } + ListView + { + model: UM.SettingDefinitionsModel + { + id: definitionsModel; + containerId: Cura.MachineManager.activeDefinitionId + filter: + { + "global_only": "False" + } + } + delegate:Loader + { + id: loader - Column { - width: view.width - UM.Theme.getSize("default_margin").width * 2; - height: childrenRect.height; + width: parent.width + height: model.type != undefined ? UM.Theme.getSize("section").height : 0; - Repeater { - id: settingList; + property var definition: model + property var settingDefinitionsModel: definitionsModel - model: UM.SettingCategoriesModel { id: settingCategoriesModel; } - - delegate: Item { - id: delegateItem; - - width: parent.width; - height: childrenRect.height; - visible: model.visible && settingsColumn.childrenHeight != 0 //If all children are hidden, the height is 0, and then the category header must also be hidden. - - ToolButton { - id: categoryHeader; - text: model.name; - checkable: true; - width: parent.width; - onCheckedChanged: settingsColumn.state != "" ? settingsColumn.state = "" : settingsColumn.state = "collapsed"; - - style: ButtonStyle { - background: Rectangle - { - width: control.width; - height: control.height; - color: control.hovered ? palette.highlight : "transparent"; - } - label: Row - { - spacing: UM.Theme.getSize("default_margin").width; - Image - { - anchors.verticalCenter: parent.verticalCenter; - source: control.checked ? UM.Theme.getIcon("arrow_right") : UM.Theme.getIcon("arrow_bottom"); - } - Label - { - text: control.text; - font.bold: true; - color: control.hovered ? palette.highlightedText : palette.text; - } - } - } - } - - property variant settingsModel: model.settings; - - Column { - id: settingsColumn; - - anchors.top: categoryHeader.bottom; - - property real childrenHeight: - { - var h = 0.0; - for(var i in children) - { - var item = children[i]; - h += children[i].height; - if(item.settingVisible) - { - if(i > 0) - { - h += spacing; - } - } - } - return h; - } - - width: childrenRect.width; - height: childrenHeight; - Repeater { - model: delegateItem.settingsModel; - - delegate: ToolButton { - id: button; - x: model.visible_depth * UM.Theme.getSize("default_margin").width; - text: model.name; - tooltip: model.description; - visible: !model.global_only - height: model.global_only ? 0 : undefined - - onClicked: { - var object_id = UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id; - UM.ActiveTool.properties.getValue("Model").addSettingOverride(object_id, model.key); - settingPickDialog.visible = false; - } - - states: State { - name: "filtered" - when: model.filtered || !model.visible || !model.enabled - PropertyChanges { target: button; height: 0; opacity: 0; } - } - } - } - - states: State { - name: "collapsed"; - - PropertyChanges { target: settingsColumn; opacity: 0; height: 0; } - } + asynchronous: true + source: + { + switch(model.type) + { + case "category": + return "PerObjectCategory.qml" + default: + return "PerObjectItem.qml" } } } From 7cc62db81dea84e367586a925d5cff10937df2b8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 May 2016 14:06:07 +0200 Subject: [PATCH 160/224] Increment XRayView API number This plug-in still works, so this can be incremented without trouble. Contributes to issue CURA-1278. --- plugins/XRayView/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/XRayView/__init__.py b/plugins/XRayView/__init__.py index 277dc69b92..34e4761863 100644 --- a/plugins/XRayView/__init__.py +++ b/plugins/XRayView/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Provides the X-Ray view."), - "api": 2 + "api": 3 }, "view": { "name": catalog.i18nc("@item:inlistbox", "X-Ray"), From 85ce8a719ed0bbafae04cafe83af3a81fb8fbcf3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 May 2016 16:16:25 +0200 Subject: [PATCH 161/224] Merge local with origin Contributes to issue CURA-1278. --- cura/CuraApplication.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index f328e83174..b95f6058b4 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -224,6 +224,7 @@ class CuraApplication(QtApplication): ## Handle loading of all plugin types (and the backend explicitly) # \sa PluginRegistery def _loadPlugins(self): + self._plugin_registry.addType("profile_reader", self._addProfileReader) 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")) @@ -711,3 +712,6 @@ class CuraApplication(QtApplication): job = ReadMeshJob(os.path.abspath(file)) job.finished.connect(self._onFileLoaded) job.start() + + def _addProfileReader(self, profile_reader): + pass \ No newline at end of file From 5a28eca2039bce9b6e8102c9330c3087ece9484a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 May 2016 16:16:55 +0200 Subject: [PATCH 162/224] Add profile reader plug-in type This type of plug-in will load a file as an instance container of the user profile type. Contributes to issue CURA-1278. --- cura/ProfileReader.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 cura/ProfileReader.py diff --git a/cura/ProfileReader.py b/cura/ProfileReader.py new file mode 100644 index 0000000000..36bb2c7177 --- /dev/null +++ b/cura/ProfileReader.py @@ -0,0 +1,17 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from UM.PluginObject import PluginObject + +## A type of plug-ins that reads profiles from a file. +# +# The profile is then stored as instance container of the type user profile. +class ProfileReader(PluginObject): + def __init__(self): + super().__init__() + + ## Read profile data from a file and return a filled profile. + # + # \return \type{Profile} The profile that was obtained from the file. + def read(self, file_name): + raise NotImplementedError("Profile reader plug-in was not correctly implemented. The read function was not implemented.") \ No newline at end of file From 117973ee25ddd7e4f3a63fd425118d8be8734538 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 May 2016 16:20:58 +0200 Subject: [PATCH 163/224] Add todo message for adding profile readers This should be done when we have a working profile manager again. Contributes to issue CURA-1278. --- cura/CuraApplication.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index b95f6058b4..c46833f6e0 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -714,4 +714,5 @@ class CuraApplication(QtApplication): job.start() def _addProfileReader(self, profile_reader): + # TODO: Add the profile reader to the list of plug-ins that can be used when importing profiles. pass \ No newline at end of file From 754932f83ad10c9ac045c240e3c838548040884d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 May 2016 16:22:00 +0200 Subject: [PATCH 164/224] Move LegacyProfileReader to new setting structure Untested as the profile manager is not functional at the moment. Contributes to issue CURA-1278. --- .../LegacyProfileReader/LegacyProfileReader.py | 16 +++++++++------- plugins/LegacyProfileReader/__init__.py | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 3daf360ee6..19154c9c5a 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -9,8 +9,9 @@ import os.path #For concatenating the path to the plugin and the relative path t from UM.Application import Application #To get the machine manager to create the new profile in. from UM.Logger import Logger #Logging errors. from UM.PluginRegistry import PluginRegistry #For getting the path to this plugin's directory. -from UM.Settings.Profile import Profile -from UM.Settings.ProfileReader import ProfileReader +from UM.Settings.DefinitionContainer import DefinitionContainer #For getting the current machine's defaults. +from UM.Settings.InstanceContainer import InstanceContainer #The new profile to make. +from cura.ProfileReader import ProfileReader #The plug-in type to implement. ## A plugin that reads profile data from legacy Cura versions. # @@ -66,7 +67,7 @@ class LegacyProfileReader(ProfileReader): if file_name.split(".")[-1] != "ini": return None Logger.log("i", "Importing legacy profile from file " + file_name + ".") - profile = Profile(machine_manager = Application.getInstance().getMachineManager(), read_only = False) #Create an empty profile. + profile = InstanceContainer("Imported Legacy Profile") #Create an empty profile. parser = configparser.ConfigParser(interpolation = None) try: @@ -103,23 +104,24 @@ class LegacyProfileReader(ProfileReader): if "target_version" not in dict_of_doom: Logger.log("e", "Dictionary of Doom has no target version. Is it the correct JSON file?") return None - if Profile.ProfileVersion != dict_of_doom["target_version"]: - Logger.log("e", "Dictionary of Doom of legacy profile reader (version %s) is not in sync with the profile version (version %s)!", dict_of_doom["target_version"], str(Profile.ProfileVersion)) + if InstanceContainer.Version != dict_of_doom["target_version"]: + Logger.log("e", "Dictionary of Doom of legacy profile reader (version %s) is not in sync with the current instance container version (version %s)!", dict_of_doom["target_version"], str(InstanceContainer.Version)) return None if "translation" not in dict_of_doom: Logger.log("e", "Dictionary of Doom has no translation. Is it the correct JSON file?") return None + current_printer = Application.getInstance().getGlobalContainerStack().findContainer({ }, DefinitionContainer) for new_setting in dict_of_doom["translation"]: #Evaluate all new settings that would get a value from the translations. old_setting_expression = dict_of_doom["translation"][new_setting] compiled = compile(old_setting_expression, new_setting, "eval") try: new_value = eval(compiled, {"math": math}, legacy_settings) #Pass the legacy settings as local variables to allow access to in the evaluation. value_using_defaults = eval(compiled, {"math": math}, defaults) #Evaluate again using only the default values to try to see if they are default. - except Exception as e: #Probably some setting name that was missing or something else that went wrong in the ini file. + except Exception: #Probably some setting name that was missing or something else that went wrong in the ini file. Logger.log("w", "Setting " + new_setting + " could not be set because the evaluation failed. Something is probably missing from the imported legacy profile.") continue - if new_value != value_using_defaults and profile.getSettingValue(new_setting) != new_value: #Not equal to the default in the new Cura OR the default in the legacy Cura. + if new_value != value_using_defaults and current_printer.findDefinitions(key = new_setting).default_value != new_value: #Not equal to the default in the new Cura OR the default in the legacy Cura. profile.setSettingValue(new_setting, new_value) #Store the setting in the profile! if len(profile.getChangedSettings()) == 0: diff --git a/plugins/LegacyProfileReader/__init__.py b/plugins/LegacyProfileReader/__init__.py index e671f02571..f8b1f5c156 100644 --- a/plugins/LegacyProfileReader/__init__.py +++ b/plugins/LegacyProfileReader/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Provides support for importing profiles from legacy Cura versions."), - "api": 2 + "api": 3 }, "profile_reader": [ { From fc7f3498017d4a35ebc21f9452fb6b4e43ceae34 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 20 May 2016 17:21:09 +0200 Subject: [PATCH 165/224] Added rudimentary filtering Current implementation looks for an exact mach, whereas we should look for text in property. CURA-1278 --- .../PerObjectSettingsPanel.qml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 19dab6bc26..e53b5d338b 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -149,7 +149,17 @@ Item { placeholderText: catalog.i18nc("@label:textbox", "Filter..."); - onTextChanged: settingPickDialog.labelFilter = text; + onTextChanged: + { + if(text != "") + { + listview.model.filter.label = = {"global_only":"False", "label": text} + } + else + { + listview.model.filter = {"global_only":"False"} + } + } } ScrollView @@ -165,6 +175,7 @@ Item { } ListView { + id:listview model: UM.SettingDefinitionsModel { id: definitionsModel; From 63b623a6ef9b557924fb45b918f0cc699c93a80f Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 23 May 2016 02:18:20 +0200 Subject: [PATCH 166/224] Move global_only property declaration to before the super() call so containerregistry knows about it when loading Also, properly set its type to function and default to False --- cura/CuraApplication.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c46833f6e0..bfe342d1e4 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -85,6 +85,9 @@ 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) + super().__init__(name = "cura", version = CuraVersion) self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) @@ -119,8 +122,6 @@ class CuraApplication(QtApplication): Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") - SettingDefinition.addSupportedProperty("global_only", DefinitionPropertyType.String, default = "False") - ## Add the 4 types of profiles to storage. Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") @@ -715,4 +716,4 @@ 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 \ No newline at end of file + pass From b452cf7ba4b3ae0f2df84b01ce828d1ca4d55dae Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 23 May 2016 02:19:11 +0200 Subject: [PATCH 167/224] Add a materials management page Based off Aldo's work which is in a different branch --- resources/qml/Cura.qml | 2 + resources/qml/Preferences/MaterialsPage.qml | 183 ++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 resources/qml/Preferences/MaterialsPage.qml diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index ba42bdc051..b03c5ed06a 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -551,6 +551,8 @@ UM.MainWindow insertPage(2, catalog.i18nc("@title:tab", "Printers"), Qt.resolvedUrl("MachinesPage.qml")); + insertPage(3, catalog.i18nc("@title:tab", "Materials"), Qt.resolvedUrl("Preferences/MaterialsPage.qml")) + //Force refresh setPage(0); } diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml new file mode 100644 index 0000000000..f58b1876e3 --- /dev/null +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -0,0 +1,183 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Dialogs 1.2 + +import UM 1.2 as UM + +UM.ManagementPage +{ + id: base; + + title: catalog.i18nc("@title:tab", "Materials"); + + model: UM.InstanceContainersModel { filter: { "type": "material" } } +/* + onAddObject: { var selectedMaterial = UM.MaterialManager.createProfile(); base.selectMaterial(selectedMaterial); } + onRemoveObject: confirmDialog.open(); + onRenameObject: { renameDialog.open(); renameDialog.selectText(); } +*/ +// activateEnabled: false + addEnabled: false + removeEnabled: false + renameEnabled: false + + scrollviewCaption: " " + detailsVisible: true + + property string currency: UM.Preferences.getValue("general/currency") + + Item { + UM.I18nCatalog { id: catalog; name: "cura"; } + + visible: base.currentItem != null + anchors.fill: parent + + Label { id: profileName; text: base.currentItem ? base.currentItem.name : ""; font: UM.Theme.getFont("large"); width: parent.width; } + + TabView { + id: scrollView + anchors.left: parent.left + anchors.right: parent.right + anchors.top: profileName.bottom + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.bottom: parent.bottom + + Tab { + title: "Information" + anchors.margins: UM.Theme.getSize("default_margin").height + + Column { + spacing: UM.Theme.getSize("default_margin").height + + Grid { + id: containerGrid + columns: 2 + spacing: UM.Theme.getSize("default_margin").width + + Label { text: catalog.i18nc("@label", "Profile Type") } + Label { text: base.currentItem ? base.currentItem.metadata.status : "Unknown"} + + Label { text: catalog.i18nc("@label", "Supplier") } + Label { text: base.currentItem ? base.currentItem.metadata.brand : "Unknown"} + + Label { text: catalog.i18nc("@label", "Material Type") } + Label { text: base.currentItem ? base.currentItem.metadata.material : "Unknown" } + + Label { text: catalog.i18nc("@label", "Color") } + Rectangle { color: base.currentItem ? base.currentItem.metadata.color_code : "yellow" } + + Label { text: "" + catalog.i18nc("@label", "Properties") + "" } + Label { text: " " } + + Label { text: catalog.i18nc("@label", "Density") } + Label { text: base.currentItem ? base.currentItem.metadata.properties.density + " " + "g/cm³" : "" } + + Label { text: catalog.i18nc("@label", "Diameter") } + Label { text: base.currentItem ? base.currentItem.metadata.properties.diameter + " " + "mm" : ""} + + Label { + text: catalog.i18nc("@label", "Filament cost") + height: spoolCostInput.height + verticalAlignment: Text.AlignVCenter + } + + Row { + Label { + text: base.currentItem && base.currentItem.spoolCost ? base.currency + " " : "" + anchors.verticalCenter: parent.verticalCenter + } + TextField { + id: spoolCostInput + text: base.currentItem.spoolCost + } + } + + Label { text: catalog.i18nc("@label", "Filament weight") } + Label { text: base.currentItem ? base.currentItem.metadata.properies.spool_weight + " " + "kg" : "" } + + Label { text: catalog.i18nc("@label", "Filament length") } + Label { text: base.currentItem ? catalog.i18nc("@label", "approx.") + " " + base.currentItem.metadata.properties.spool_length + " " + "m" : "" } + + Label { text: catalog.i18nc("@label", "Cost per meter") } + Label { text: base.currentItem && base.currentItem.lenghtCost ? catalog.i18nc("@label", "approx.") + " " + base.currency + " " + base.currentItem.lenghtCost + "/m" : "" } + +// Column { +// +// +// +// +// } +// Column { +// +// +// +// Column { +// Label { text: base.currentItem && base.currentItem.variant ? base.currentItem.variant : "" } +// Row { +// spacing: UM.Theme.getSize("default_margin").width/2 +// Rectangle { +// color: base.currentItem && base.currentItem.colorDisplay ? base.currentItem.colorDisplay : "yellow" +// width: colorLabel.height +// height: colorLabel.height +// border.width: UM.Theme.getSize("default_lining").height +// } +// Label { id: colorLabel; text: base.currentItem && base.currentItem.colorRAL ? base.currentItem.colorRAL : "" } +// } +// } +// } +// Column { +// +// } +// Column { +// +// +// +// +// +// +// +// } + } + Label { + text: base.currentItem && base.currentItem.infoGeneral ? "" + catalog.i18nc("@label", "Information") + "
" + base.currentItem.infoGeneral : "" + width: scrollView.width - 2 * UM.Theme.getSize("default_margin").width + wrapMode: Text.WordWrap + } + Label { + text: base.currentItem && base.currentItem.infoAdhesion ? "" + catalog.i18nc("@label", "Adhesion") + "
" + base.currentItem.infoAdhesion : "" + width: scrollView.width - 2 * UM.Theme.getSize("default_margin").width + wrapMode: Text.WordWrap + } + } + } + Tab { + title: catalog.i18nc("@label", "Print settings") + anchors.margins: UM.Theme.getSize("default_margin").height + + Grid { + columns: 2 + spacing: UM.Theme.getSize("default_margin").width + + Column { + Repeater { + model: base.currentItem ? base.currentItem.settings : null + Label { + text: modelData.name.toString(); + elide: Text.ElideMiddle; + } + } + } + Column { + Repeater { + model: base.currentItem ? base.currentItem.settings : null + Label { text: modelData.value.toString() + " " + modelData.unit.toString(); } + } + } + } + } + } + } +} From e0c7ed85617ba54759ae2c65179ccdedbeb40236 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 23 May 2016 02:19:39 +0200 Subject: [PATCH 168/224] Add a plugin that loads XML materials and an example material --- .../XmlMaterialProfile/XmlMaterialProfile.py | 84 +++++++++++++++++++ plugins/XmlMaterialProfile/__init__.py | 32 +++++++ .../materials/generic_pla.xml.fdm_material | 48 +++++++++++ 3 files changed, 164 insertions(+) create mode 100644 plugins/XmlMaterialProfile/XmlMaterialProfile.py create mode 100644 plugins/XmlMaterialProfile/__init__.py create mode 100644 resources/materials/generic_pla.xml.fdm_material diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py new file mode 100644 index 0000000000..5566301a09 --- /dev/null +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -0,0 +1,84 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +import math +import xml.etree.ElementTree as ET + +import UM.Settings + +def _tag_without_namespace(element): + return element.tag[element.tag.rfind("}") + 1:] + +class XmlMaterialProfile(UM.Settings.InstanceContainer): + def __init__(self, container_id, *args, **kwargs): + super().__init__(container_id, *args, **kwargs) + + def serialize(self): + raise NotImplementedError("Writing material profiles has not yet been implemented") + + def deserialize(self, serialized): + print("deserialize material profile") + data = ET.fromstring(serialized) + + self.addMetaDataEntry("type", "material") + + # TODO: Add material verfication + self.addMetaDataEntry("status", "Unknown") + + metadata = data.iterfind("./um:metadata/*", self.__namespaces) + for entry in metadata: + # The namespace is prepended to the tag name but between {}. + # We are only interested in the actual tag name. + tag_name = entry.tag[entry.tag.rfind("}") + 1:] + + if tag_name == "name": + brand = entry.find("./um:brand", self.__namespaces) + material = entry.find("./um:material", self.__namespaces) + color = entry.find("./um:color", self.__namespaces) + + self.setName("{0} {1} ({2})".format(brand.text, material.text, color.text)) + + self.addMetaDataEntry("brand", brand.text) + self.addMetaDataEntry("material", material.text) + self.addMetaDataEntry("color_name", color.text) + + self.addMetaDataEntry(tag_name, entry.text) + + property_values = {} + properties = data.iterfind("./um:properties/*", self.__namespaces) + for entry in properties: + tag_name = entry.tag[entry.tag.rfind("}") + 1:] + property_values[tag_name] = entry.text + + diameter = float(property_values.get("diameter", 2.85)) # In mm + density = float(property_values.get("density", 1.3)) # In g/cm3 + + weight_per_cm = (math.pi * (diameter / 20) ** 2 * 0.1) * density + + spool_weight = property_values.get("spool_weight") + spool_length = property_values.get("spool_length") + if spool_weight: + length = float(spool_weight) / weight_per_cm + property_values["spool_length"] = str(length / 100) + elif spool_length: + weight = (float(spool_length) * 100) * weight_per_cm + property_values["spool_weight"] = str(weight) + + self.addMetaDataEntry("properties", property_values) + + settings = data.iterfind("./um:settings/um:setting", self.__namespaces) + for entry in settings: + tag_name = _tag_without_namespace(entry) + + if tag_name in self.__material_property_setting_map: + self.setProperty(self.__material_property_setting_map[tag_name], "value", entry.text) + + __material_property_setting_map = { + "print temperature": "material_print_temperature", + "heated bed temperature": "material_bed_temperature", + "standby temperature": "material_standby_temperature", + } + + __namespaces = { + "um": "http://www.ultimaker.com/material" + } diff --git a/plugins/XmlMaterialProfile/__init__.py b/plugins/XmlMaterialProfile/__init__.py new file mode 100644 index 0000000000..041a3f6346 --- /dev/null +++ b/plugins/XmlMaterialProfile/__init__.py @@ -0,0 +1,32 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from . import XmlMaterialProfile + +from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + +def getMetaData(): + return { + "plugin": { + "name": catalog.i18nc("@label", "Material Profiles"), + "author": "Ultimaker", + "version": "1.0", + "description": catalog.i18nc("@info:whatsthis", "Provides capabilities to read and write XML-based material profiles."), + "api": 3 + }, + "settings_container": { + "mimetype": "application/x-ultimaker-material-profile" + } + } + +def register(app): + mime_type = MimeType( + name = "application/x-ultimaker-material-profile", + comment = "Ultimaker Material Profile", + suffixes = [ "xml.fdm_material" ] + ) + MimeTypeDatabase.addMimeType(mime_type) + return { "settings_container": XmlMaterialProfile.XmlMaterialProfile("default_xml_material_profile") } + diff --git a/resources/materials/generic_pla.xml.fdm_material b/resources/materials/generic_pla.xml.fdm_material new file mode 100644 index 0000000000..b64ecdc61b --- /dev/null +++ b/resources/materials/generic_pla.xml.fdm_material @@ -0,0 +1,48 @@ + + + + + + Generic + PLA + Generic + + 506c9f0d-e3aa-4bd4-b2d2-23e2425b1aa9 + 0 + #FFFFFF + + + 1.3 + 2.85 + 750 + + + 210 + 60 + 175 + + + + + + 150 + + + + + + + + + 150 + + 80 + + + 100 + + + + From 4877c35f063687429fb9eb9a1e03d756bfab4c1e Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 23 May 2016 13:35:52 +0200 Subject: [PATCH 169/224] Fix layout of SettingTextField items CURA-1278 --- resources/qml/Settings/SettingTextField.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 3cbd21387b..9972f83aa1 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -85,7 +85,7 @@ SettingItem anchors { left: parent.left - leftMargin: UM.Theme.unitRightMargin + leftMargin: UM.Theme.getSize("setting_unit_margin").width right: parent.right verticalCenter: parent.verticalCenter } From c23980437d05f4021cfc09a3e95ea61f360be149 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 23 May 2016 14:42:14 +0200 Subject: [PATCH 170/224] Fix naming of quality profiles --- resources/quality/high.inst.cfg | 2 +- resources/quality/normal.inst.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/quality/high.inst.cfg b/resources/quality/high.inst.cfg index 2e860cf380..89dcd4c9bc 100644 --- a/resources/quality/high.inst.cfg +++ b/resources/quality/high.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = high +name = High Quality definition = fdmprinter [metadata] diff --git a/resources/quality/normal.inst.cfg b/resources/quality/normal.inst.cfg index 6bb23d841c..6d317cdf7a 100644 --- a/resources/quality/normal.inst.cfg +++ b/resources/quality/normal.inst.cfg @@ -1,6 +1,6 @@ [general] version = 2 -name = normal +name = Normal Quality definition = fdmprinter [metadata] From f68a9ae90fc4b22b2533929cb0366825a2d7837f Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 23 May 2016 14:42:40 +0200 Subject: [PATCH 171/224] Fix materials page so it displays the proper data Also, make sure the code is reasonably clean --- resources/qml/Preferences/MaterialsPage.qml | 211 +++++++++++--------- 1 file changed, 122 insertions(+), 89 deletions(-) diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index f58b1876e3..f1f3432a41 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -35,7 +35,7 @@ UM.ManagementPage visible: base.currentItem != null anchors.fill: parent - Label { id: profileName; text: base.currentItem ? base.currentItem.name : ""; font: UM.Theme.getFont("large"); width: parent.width; } + Label { id: profileName; text: materialProperties.name; font: UM.Theme.getFont("large"); width: parent.width; } TabView { id: scrollView @@ -49,106 +49,83 @@ UM.ManagementPage title: "Information" anchors.margins: UM.Theme.getSize("default_margin").height - Column { - spacing: UM.Theme.getSize("default_margin").height + Flow { + id: containerGrid - Grid { - id: containerGrid - columns: 2 - spacing: UM.Theme.getSize("default_margin").width + width: scrollView.width; + property real columnWidth: width / 2 - Label { text: catalog.i18nc("@label", "Profile Type") } - Label { text: base.currentItem ? base.currentItem.metadata.status : "Unknown"} + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Profile Type") } + Label { width: parent.columnWidth; text: materialProperties.profile_type } - Label { text: catalog.i18nc("@label", "Supplier") } - Label { text: base.currentItem ? base.currentItem.metadata.brand : "Unknown"} + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Supplier") } + Label { width: parent.columnWidth; text: materialProperties.supplier } - Label { text: catalog.i18nc("@label", "Material Type") } - Label { text: base.currentItem ? base.currentItem.metadata.material : "Unknown" } + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Material Type") } + Label { width: parent.columnWidth; text: materialProperties.material_type } - Label { text: catalog.i18nc("@label", "Color") } - Rectangle { color: base.currentItem ? base.currentItem.metadata.color_code : "yellow" } + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Color") } - Label { text: "" + catalog.i18nc("@label", "Properties") + "" } - Label { text: " " } - - Label { text: catalog.i18nc("@label", "Density") } - Label { text: base.currentItem ? base.currentItem.metadata.properties.density + " " + "g/cm³" : "" } - - Label { text: catalog.i18nc("@label", "Diameter") } - Label { text: base.currentItem ? base.currentItem.metadata.properties.diameter + " " + "mm" : ""} - - Label { - text: catalog.i18nc("@label", "Filament cost") - height: spoolCostInput.height - verticalAlignment: Text.AlignVCenter + Row { + width: parent.columnWidth; + spacing: UM.Theme.getSize("default_margin").width/2 + Rectangle { + color: materialProperties.color_code + width: colorLabel.height + height: colorLabel.height + border.width: UM.Theme.getSize("default_lining").height } - - Row { - Label { - text: base.currentItem && base.currentItem.spoolCost ? base.currency + " " : "" - anchors.verticalCenter: parent.verticalCenter - } - TextField { - id: spoolCostInput - text: base.currentItem.spoolCost - } - } - - Label { text: catalog.i18nc("@label", "Filament weight") } - Label { text: base.currentItem ? base.currentItem.metadata.properies.spool_weight + " " + "kg" : "" } - - Label { text: catalog.i18nc("@label", "Filament length") } - Label { text: base.currentItem ? catalog.i18nc("@label", "approx.") + " " + base.currentItem.metadata.properties.spool_length + " " + "m" : "" } - - Label { text: catalog.i18nc("@label", "Cost per meter") } - Label { text: base.currentItem && base.currentItem.lenghtCost ? catalog.i18nc("@label", "approx.") + " " + base.currency + " " + base.currentItem.lenghtCost + "/m" : "" } - -// Column { -// -// -// -// -// } -// Column { -// -// -// -// Column { -// Label { text: base.currentItem && base.currentItem.variant ? base.currentItem.variant : "" } -// Row { -// spacing: UM.Theme.getSize("default_margin").width/2 -// Rectangle { -// color: base.currentItem && base.currentItem.colorDisplay ? base.currentItem.colorDisplay : "yellow" -// width: colorLabel.height -// height: colorLabel.height -// border.width: UM.Theme.getSize("default_lining").height -// } -// Label { id: colorLabel; text: base.currentItem && base.currentItem.colorRAL ? base.currentItem.colorRAL : "" } -// } -// } -// } -// Column { -// -// } -// Column { -// -// -// -// -// -// -// -// } + Label { id: colorLabel; text: materialProperties.color_name } } + + Item { width: parent.width; height: UM.Theme.getSize("default_margin").height } + + Label { width: parent.width; text: "" + catalog.i18nc("@label", "Properties") + "" } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Density") } + Label { width: parent.columnWidth; text: materialProperties.density } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Diameter") } + Label { width: parent.columnWidth; text: materialProperties.diameter } + Label { - text: base.currentItem && base.currentItem.infoGeneral ? "" + catalog.i18nc("@label", "Information") + "
" + base.currentItem.infoGeneral : "" - width: scrollView.width - 2 * UM.Theme.getSize("default_margin").width + text: catalog.i18nc("@label", "Filament cost") + width: parent.columnWidth; + height: spoolCostInput.height + verticalAlignment: Text.AlignVCenter + } + + Row { + width: parent.columnWidth; + Label { + text: base.currency ? base.currency + " " : " " + anchors.verticalCenter: parent.verticalCenter + } + TextField { + id: spoolCostInput + text: materialProperties.spool_cost + } + } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Filament weight") } + Label { width: parent.columnWidth; text: materialProperties.spool_weight + " " + "g" } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Filament length") } + Label { width: parent.columnWidth; text: materialProperties.spool_length + " " + "m" } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Cost per meter") } + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "approx. %1 %2/m").arg(materialProperties.cost_per_meter).arg(base.currency); } + + Item { width: parent.width; height: UM.Theme.getSize("default_margin").height } + + Label { + text: materialProperties.description ? "" + catalog.i18nc("@label", "Information") + "
" + materialProperties.description : ""; + width: parent.width wrapMode: Text.WordWrap } Label { - text: base.currentItem && base.currentItem.infoAdhesion ? "" + catalog.i18nc("@label", "Adhesion") + "
" + base.currentItem.infoAdhesion : "" - width: scrollView.width - 2 * UM.Theme.getSize("default_margin").width + text: materialProperties.adhesion_info ? "" + catalog.i18nc("@label", "Adhesion") + "
" + materialProperties.adhesion_info : ""; + width: parent.width wrapMode: Text.WordWrap } } @@ -179,5 +156,61 @@ UM.ManagementPage } } } + + QtObject + { + id: materialProperties + + property string name: "Unknown"; + property string profile_type: "Unknown"; + property string supplier: "Unknown"; + property string material_type: "Unknown"; + + property string color_name: "Yellow"; + property color color_code: "yellow"; + + property string density: "Unknown"; + property string diameter: "Unknown"; + + property string spool_cost: "Unknown"; + property string spool_weight: "Unknown"; + property string spool_length: "Unknown"; + property string cost_per_meter: "Unknown"; + + property string description: ""; + property string adhesion_info: ""; + } + } + + onCurrentItemChanged: + { + if(!currentItem == null) + { + return + } + + materialProperties.name = currentItem.name; + + if(currentItem.metadata != undefined && currentItem.metadata != null) + { + materialProperties.supplier = currentItem.metadata.brand ? currentItem.metadata.brand : "Unknown"; + materialProperties.material_type = currentItem.metadata.material ? currentItem.metadata.material : "Unknown"; + materialProperties.color_name = currentItem.metadata.color_name ? currentItem.metadata.color_name : "Yellow"; + materialProperties.color_code = currentItem.metadata.color_code ? currentItem.metadata.color_code : "yellow"; + + materialProperties.description = currentItem.metadata.description ? currentItem.metadata.description : ""; + materialProperties.adhesion_info = currentItem.metadata.adhesion_info ? currentItem.metadata.adhesion_info : ""; + + if(currentItem.metadata.properties != undefined && currentItem.metadata.properties != null) + { + materialProperties.density = currentItem.metadata.properties.density ? currentItem.metadata.properties.density : "Unknown"; + materialProperties.diameter = currentItem.metadata.properties.diameter ? currentItem.metadata.properties.diameter : "Unknown"; + } + else + { + materialProperties.density = "Unknown"; + materialProperties.diameter = "Unknown"; + } + } } } From bace52fccf80bc0153db3ba2f237b89d9eb01d92 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 13:02:46 +0200 Subject: [PATCH 172/224] Add documentation I need a bit of documentation for myself to understand this process. Contributes to issue CURA-1278. --- .../CuraEngineBackend/CuraEngineBackend.py | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index a57aa01ba9..0c569ce6f3 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -29,6 +29,10 @@ catalog = i18nCatalog("cura") class CuraEngineBackend(Backend): + ## Starts the back-end plug-in. + # + # This registers all the signal listeners and prepares for communication + # with the back-end in general. def __init__(self): super().__init__() @@ -50,19 +54,15 @@ class CuraEngineBackend(Backend): self._onActiveViewChanged() self._stored_layer_data = [] - # When there are current settings and machine instance is changed, there is no profile changed event. We should - # pretend there is though. - #Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveProfileChanged) - - #self._profile = None - #Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged) - #self._onActiveProfileChanged() - + #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. self._change_timer = QTimer() self._change_timer.setInterval(500) self._change_timer.setSingleShot(True) self._change_timer.timeout.connect(self.slice) + #Listeners for receiving messages from the back-end. self._message_handlers["cura.proto.Layer"] = self._onLayerMessage self._message_handlers["cura.proto.Progress"] = self._onProgressMessage self._message_handlers["cura.proto.GCodeLayer"] = self._onGCodeLayerMessage @@ -70,29 +70,31 @@ class CuraEngineBackend(Backend): self._message_handlers["cura.proto.ObjectPrintTime"] = self._onObjectPrintTimeMessage self._message_handlers["cura.proto.SlicingFinished"] = self._onSlicingFinishedMessage - self._slicing = False - self._restart = False - self._enabled = True - self._always_restart = True + self._slicing = False #Are we currently slicing? + self._restart = False #Back-end is currently restarting? + self._enabled = True #Should we be slicing? Slicing might be paused when, for instance, the user is dragging the mesh around. + self._always_restart = True #Always restart the engine when starting a new slice. Don't keep the process running. TODO: Fix engine statelessness. self._process_layers_job = None #The currently active job to process layers, or None if it is not processing layers. - self._message = None + self._message = None #Pop-up message that shows the slicing progress bar (or an error message). self.backendQuit.connect(self._onBackendQuit) - self.backendConnected.connect(self._onBackendConnected) + + #When a tool operation is in progress, don't slice. So we need to listen for tool operations. Application.getInstance().getController().toolOperationStarted.connect(self._onToolOperationStarted) Application.getInstance().getController().toolOperationStopped.connect(self._onToolOperationStopped) - #Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onInstanceChanged) - + ## Called when closing the application. + # + # This function should terminate the engine process. def close(self): # Terminate CuraEngine if it is still running at this point self._terminate() super().close() ## Get the command that is used to call the engine. - # This is usefull for debugging and used to actually start the engine + # This is useful for debugging and used to actually start the engine. # \return list of commands and args / parameters. def getEngineCommand(self): active_machine = Application.getInstance().getMachineManager().getActiveMachineInstance() @@ -112,7 +114,7 @@ class CuraEngineBackend(Backend): ## Emitted when the slicing process starts. slicingStarted = Signal() - ## Emitted whne the slicing process is aborted forcefully. + ## Emitted when the slicing process is aborted forcefully. slicingCancelled = Signal() ## Perform a slice of the scene. From e5df225b1e0e697640208b5d36d5099e8ffad33f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 13:04:36 +0200 Subject: [PATCH 173/224] Connect SettingChanged to new propertyChanged function The listener doesn't properly listen to the signal's parameters yet though. Contributes to issue CURA-1278. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 0c569ce6f3..7aaba3edce 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -54,6 +54,10 @@ class CuraEngineBackend(Backend): self._onActiveViewChanged() self._stored_layer_data = [] + #When any setting property changed, call the _onSettingChanged function. + #This function will then see if we need to start slicing. + Application.getInstance().getGlobalContainerStack().propertyChanged.connect(self._onSettingChanged) + #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. From ab2a6136d700167b5df7803fc8d46e0676a05728 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 13:20:42 +0200 Subject: [PATCH 174/224] Filter setting changed listener properly The parameters of the listener were out of date and it should only trigger a reslice if we're changing the value of a setting, not any other property. Contributes to issue CURA-1278. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 7aaba3edce..b101fae5fd 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -123,8 +123,7 @@ class CuraEngineBackend(Backend): ## Perform a slice of the scene. def slice(self): - - if not self._enabled: + if not self._enabled: #We shouldn't be slicing. return if self._slicing: @@ -225,8 +224,13 @@ class CuraEngineBackend(Backend): self._profile.settingValueChanged.connect(self._onSettingChanged) self._onChanged() - def _onSettingChanged(self, setting): - self._onChanged() + ## A setting has changed, so check if we must reslice. + # + # \param instance The setting instance that has changed. + # \param property The property of the setting instance that has changed. + def _onSettingChanged(self, instance, property): + if property == "value": #Only reslice if the value has changed. + self._onChanged() def _onLayerMessage(self, message): self._stored_layer_data.append(message) From 83c1ea2ccc600129c060473af98480c9e3147032 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 13:24:54 +0200 Subject: [PATCH 175/224] Move message hide into terminate function Always if we terminate we want to hide the old message. This fixes the message not hiding when using the tools. Contributes to issue CURA-1278. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index b101fae5fd..da4ba1a139 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -129,12 +129,6 @@ class CuraEngineBackend(Backend): if self._slicing: self._terminate() - if self._message: - self._message.hide() - self._message = None - - return - if self._process_layers_job: self._process_layers_job.abort() self._process_layers_job = None @@ -181,6 +175,9 @@ class CuraEngineBackend(Backend): #self._createSocket() # Re create the socket except Exception as e: # terminating a process that is already terminating causes an exception, silently ignore this. Logger.log("d", "Exception occured while trying to kill the engine %s", str(e)) + if self._message: + self._message.hide() + self._message = None def _onStartSliceCompleted(self, job): From ae6f4912e613ddea4e22729ab604c6b115b9439f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 13:28:04 +0200 Subject: [PATCH 176/224] Remove unnecessary variable initialisation This isn't C++ or anything. Variable scope isn't limited by if statements. Contributes to issue CURA-1278. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index da4ba1a139..6dc166129e 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -102,7 +102,6 @@ class CuraEngineBackend(Backend): # \return list of commands and args / parameters. def getEngineCommand(self): active_machine = Application.getInstance().getMachineManager().getActiveMachineInstance() - json_path = "" if not active_machine: json_path = Resources.getPath(Resources.MachineDefinitions, "fdmprinter.json") else: From a0645a44c8a51eecf587170b57adda754ebab04e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 13:36:32 +0200 Subject: [PATCH 177/224] Re-enable slicing message Nothing appears right now, but this enables progress to show later on in the progress (if it would get there). Contributes to issue CURA-1278. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 6dc166129e..b3755602d1 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -125,10 +125,10 @@ class CuraEngineBackend(Backend): if not self._enabled: #We shouldn't be slicing. return - if self._slicing: + if self._slicing: #We were already slicing. Stop the old job. self._terminate() - if self._process_layers_job: + if self._process_layers_job: #We were processing layers. Stop that, the layers are going to change soon. self._process_layers_job.abort() self._process_layers_job = None @@ -146,9 +146,9 @@ class CuraEngineBackend(Backend): self.backendStateChange.emit(BackendState.NOT_STARTED) if self._message: self._message.setProgress(-1) - #else: - # self._message = Message(catalog.i18nc("@info:status", "Slicing..."), 0, False, -1) - # self._message.show() + else: + self._message = Message(catalog.i18nc("@info:status", "Slicing..."), 0, False, -1) + self._message.show() self._scene.gcode_list = [] self._slicing = True From 63bf5bec3d5fc109a4d59abbec17f3a27b58cf35 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 13:56:42 +0200 Subject: [PATCH 178/224] Remove _profile from start slice job parameters Instead, the start slice job searches for the container stack itself. Contributes to issue CURA-1278. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- plugins/CuraEngineBackend/StartSliceJob.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index b3755602d1..a4c7e1c1ed 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -154,7 +154,7 @@ class CuraEngineBackend(Backend): self._slicing = True self.slicingStarted.emit() - job = StartSliceJob.StartSliceJob(self._profile, self._socket) + job = StartSliceJob.StartSliceJob(self._socket) job.start() job.finished.connect(self._onStartSliceCompleted) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 9fecb20646..480076b9cc 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -31,11 +31,11 @@ class GcodeStartEndFormatter(Formatter): ## Job that handles sending the current scene data to CuraEngine class StartSliceJob(Job): - def __init__(self, profile, socket): + def __init__(self, socket): super().__init__() self._scene = Application.getInstance().getController().getScene() - self._profile = profile + self._settings = Application.getInstance().getGlobalContainerStack() self._socket = socket ## Runs the job that initiates the slicing. From eb951ed07c4830f90eb1f771e36c8f04eb4d0392 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 13:58:36 +0200 Subject: [PATCH 179/224] Fix potential concurrency of finishing before connected to finishing This was a concurrency issue: If the slicing was very fast, it could finish slicing before the listener was connected to the message of being finished. Therefore, we should connect to being finished before we even start the start-slice job. Contributes to issue CURA-1278. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index a4c7e1c1ed..a854f29bf1 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -155,8 +155,8 @@ class CuraEngineBackend(Backend): self.slicingStarted.emit() job = StartSliceJob.StartSliceJob(self._socket) - job.start() job.finished.connect(self._onStartSliceCompleted) + job.start() def _terminate(self): self._slicing = False From b03aa246a08fd029f8ab7016a018f0b23d5f922d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 14:47:02 +0200 Subject: [PATCH 180/224] Call new function to send global settings I'm going to rename this function to be able to send per-extruder and per-object settings with different functions later on. This updates the call to the function to use the new one. Contributes to issue CURA-1278. --- plugins/CuraEngineBackend/StartSliceJob.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 480076b9cc..e98658b717 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -35,7 +35,6 @@ class StartSliceJob(Job): super().__init__() self._scene = Application.getInstance().getController().getScene() - self._settings = Application.getInstance().getGlobalContainerStack() self._socket = socket ## Runs the job that initiates the slicing. @@ -85,7 +84,7 @@ class StartSliceJob(Job): if not object_groups: return - self._sendSettings(self._profile) + self._sendGlobalSettings() slice_message = self._socket.createMessage("cura.proto.Slice") @@ -123,6 +122,13 @@ class StartSliceJob(Job): Logger.log("w", "Unabled to do token replacement on start/end gcode %s", traceback.format_exc()) return str(value).encode("utf-8") + ## Sends all global settings to the engine. + # + # The settings are taken from the global stack. This does not include any + # per-extruder settings or per-object settings. + def _sendGlobalSettings(self): + pass #TODO: Implement this. + def _sendSettings(self, profile): msg = self._socket.createMessage("cura.proto.SettingList") settings = profile.getAllSettingValues(include_machine = True) From 8a21ac77edc1c59e8a7b2bbc1a903fd93e27614c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 15:53:40 +0200 Subject: [PATCH 181/224] Re-implement sending global settings It turns out to be mostly the same. Contributes to issue CURA-1278 and CURA-1588. --- plugins/CuraEngineBackend/StartSliceJob.py | 42 ++++++++++++++-------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index e98658b717..3d58c74b93 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -5,8 +5,9 @@ import numpy from string import Formatter import traceback -from UM.Job import Job from UM.Application import Application +from UM.Settings.DefinitionContainer import DefinitionContainer +from UM.Job import Job from UM.Logger import Logger from UM.Scene.SceneNode import SceneNode @@ -127,23 +128,20 @@ class StartSliceJob(Job): # The settings are taken from the global stack. This does not include any # per-extruder settings or per-object settings. def _sendGlobalSettings(self): - pass #TODO: Implement this. - - def _sendSettings(self, profile): - msg = self._socket.createMessage("cura.proto.SettingList") - settings = profile.getAllSettingValues(include_machine = True) + message = self._socket.createMessage("cura.proto.SettingList") + settings = self._getAllSettingValues() #Get all the settings to send. start_gcode = settings["machine_start_gcode"] - settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode + settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode #Pre-compute material_bed_temp_prepend and material_print_temp_prepend. settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode - for key, value in settings.items(): - s = msg.addRepeatedMessage("settings") - s.name = key - if key == "machine_start_gcode" or key == "machine_end_gcode": - s.value = self._expandGcodeTokens(key, value, settings) + for key, value in settings.items(): #Add all submessages for each individual setting. + setting_message = message.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) else: - s.value = str(value).encode("utf-8") + setting_message.value = str(value).encode("utf-8") - self._socket.sendMessage(msg) + self._socket.sendMessage(message) def _handlePerObjectSettings(self, node, message): profile = node.callDecoration("getProfile") @@ -164,3 +162,19 @@ class StartSliceJob(Job): setting.value = str(value).encode() Job.yieldThread() + + ## Gets all setting values as a dictionary. + # + # \return A dictionary with the setting keys as keys and the setting + # values as values. + def _getAllSettingValues(self): + stack = Application.getInstance().getGlobalContainerStack() + setting_values = {} + + definition_containers = [container for container in stack.getContainers() if container.__class__ == DefinitionContainer] #To get all keys, get all definitions from all definition containers. + for definition_container in definition_containers: + for definition in definition_container.definitions: + if definition.key not in setting_values: #Prevent looking up the same key twice, for speed. + setting_values[definition.key] = stack.getProperty(definition.key, "value") + + return setting_values \ No newline at end of file From 8f1860413babff4770df12b439506f486f50169c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 16:00:39 +0200 Subject: [PATCH 182/224] Always send FDMPrinter definition via socket We don't save the file name any more. The engine doesn't need any machine-specific definitions at the moment, so we can always just send FDMPrinter.. This may later change, but later we will also send a serialised JSON rather than a file name so then we won't need the file name any more. Contributes to issues CURA-1278 and CURA-1588. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index a854f29bf1..38a78beda0 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -101,12 +101,7 @@ class CuraEngineBackend(Backend): # This is useful for debugging and used to actually start the engine. # \return list of commands and args / parameters. def getEngineCommand(self): - active_machine = Application.getInstance().getMachineManager().getActiveMachineInstance() - if not active_machine: - json_path = Resources.getPath(Resources.MachineDefinitions, "fdmprinter.json") - else: - json_path = active_machine.getMachineDefinition().getPath() - + json_path = Resources.getPath(Resources.DefinitionContainers, "fdmprinter.def.json") return [Preferences.getInstance().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", json_path, "-vv"] ## Emitted when we get a message containing print duration and material amount. This also implies the slicing has finished. From c996bcb191e1a76b0999bb73b960fd0e66d30c75 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 16:01:57 +0200 Subject: [PATCH 183/224] Remove extruder drive upgrade option It was originally included with the thought that there would be different firmware for this, but there isn't. So this setting is not needed. Contributes to issue CURA-1278. --- resources/definitions/ultimaker_original.def.json | 8 -------- resources/qml/WizardPages/SelectUpgradedParts.qml | 9 --------- 2 files changed, 17 deletions(-) diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index 76b6c8b4ff..f445057860 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -18,14 +18,6 @@ ] }, - "settings": { - "machine_extruder_drive_upgrade": { - "label": "Extruder Drive Upgrade", - "description": "This machine has the extruder drive upgrade.", - "type": "bool", - "default_value": false - } - }, "overrides": { "machine_width": { "default_value": 205 diff --git a/resources/qml/WizardPages/SelectUpgradedParts.qml b/resources/qml/WizardPages/SelectUpgradedParts.qml index 4a327a6ed4..a49401ada9 100644 --- a/resources/qml/WizardPages/SelectUpgradedParts.qml +++ b/resources/qml/WizardPages/SelectUpgradedParts.qml @@ -17,9 +17,6 @@ Item Component.onDestruction: { - if (extruderCheckBox.checked == true){ - UM.MachineManager.setMachineSettingValue("machine_extruder_drive_upgrade", true) - } if (heatedBedCheckBox1.checked == true || heatedBedCheckBox2.checked == true){ UM.MachineManager.setMachineSettingValue("machine_heated_bed", true) } @@ -52,12 +49,6 @@ Item anchors.topMargin: UM.Theme.getSize("default_margin").height width: parent.width - UM.Theme.getSize("default_margin").width CheckBox - { - id: extruderCheckBox - text: catalog.i18nc("@option:check","Extruder driver ugrades") - checked: true - } - CheckBox { id: heatedBedCheckBox1 text: catalog.i18nc("@option:check","Heated printer bed") From 9dab21c4d0dd4e1097eae165f4a396e60f86e329 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 16:06:38 +0200 Subject: [PATCH 184/224] Fix getting print_sequence setting The setting is used to group items for one-at-a-time printing before they're sent to the engine. This properly gets the setting value under the new setting system. Contributes to issues CURA-1278 and CURA-1588. --- 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 3d58c74b93..965ccc8b8a 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -50,7 +50,7 @@ class StartSliceJob(Job): # Get the objects in their groups to print. object_groups = [] - if self._profile.getSettingValue("print_sequence") == "one_at_a_time": + if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time": for node in OneAtATimeIterator(self._scene.getRoot()): temp_list = [] From 70b52f4b62755d48add1c7ae9269cb1613a5e3fd Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 16:34:14 +0200 Subject: [PATCH 185/224] Also get setting values of child definitions Otherwise we just get the setting categories, which is not very useful. Contributes to issues CURA-1278 and CURA-1588. --- plugins/CuraEngineBackend/StartSliceJob.py | 25 ++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 965ccc8b8a..5379e00156 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -37,6 +37,7 @@ class StartSliceJob(Job): self._scene = Application.getInstance().getController().getScene() self._socket = socket + self._stack = Application.getInstance().getGlobalContainerStack() ## Runs the job that initiates the slicing. def run(self): @@ -130,6 +131,7 @@ class StartSliceJob(Job): def _sendGlobalSettings(self): message = self._socket.createMessage("cura.proto.SettingList") settings = self._getAllSettingValues() #Get all the settings to send. + print(settings) start_gcode = settings["machine_start_gcode"] settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode #Pre-compute material_bed_temp_prepend and material_print_temp_prepend. settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode @@ -163,18 +165,33 @@ class StartSliceJob(Job): Job.yieldThread() + ## Gets the current values for all child definitions of a definition. + # + # To be clear, it looks up all child definitions, and returns the CURRENT + # VALUE of the keys of these definitions according to the global stack. It + # doesn't return the "value" property in the definition. + # + # \param definition The setting definition to get the child settings of. + def _getAllChildSettingValues(self, definition): + setting_values = { } + for child in definition.children: + setting_values[child.key] = self._stack.getProperty(child.key, "value") + for key, value in self._getAllChildSettingValues(child).items(): + setting_values[key] = value + return setting_values + ## Gets all setting values as a dictionary. # # \return A dictionary with the setting keys as keys and the setting # values as values. def _getAllSettingValues(self): - stack = Application.getInstance().getGlobalContainerStack() setting_values = {} - definition_containers = [container for container in stack.getContainers() if container.__class__ == DefinitionContainer] #To get all keys, get all definitions from all definition containers. + definition_containers = [container for container in self._stack.getContainers() if container.__class__ == DefinitionContainer] #To get all keys, get all definitions from all definition containers. for definition_container in definition_containers: for definition in definition_container.definitions: - if definition.key not in setting_values: #Prevent looking up the same key twice, for speed. - setting_values[definition.key] = stack.getProperty(definition.key, "value") + setting_values[definition.key] = self._stack.getProperty(definition.key, "value") + for key, value in self._getAllChildSettingValues(definition).items(): + setting_values[key] = value return setting_values \ No newline at end of file From 15333fa9407e2905b0a680a1e596672b18ede0a7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 16:37:11 +0200 Subject: [PATCH 186/224] Codestyle: Spaces after commas Contributes to issues CURA-1278 and CURA-1588. --- plugins/CuraEngineBackend/StartSliceJob.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 5379e00156..0b01b11992 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -101,8 +101,8 @@ class StartSliceJob(Job): obj.id = id(current_object) verts = numpy.array(mesh_data.getVertices()) - verts[:,[1,2]] = verts[:,[2,1]] - verts[:,1] *= -1 + verts[:, [1, 2]] = verts[:, [2, 1]] + verts[:, 1] *= -1 obj.vertices = verts From 6fcba4cdde7d75ba73cd66f6b672447c44e5a5d7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 16:38:08 +0200 Subject: [PATCH 187/224] Fix typo in error message Contributes to issues CURA-1278 and CURA-1588. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 38a78beda0..dee6f43bd6 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -168,7 +168,7 @@ class CuraEngineBackend(Backend): self._process = None #self._createSocket() # Re create the socket except Exception as e: # terminating a process that is already terminating causes an exception, silently ignore this. - Logger.log("d", "Exception occured while trying to kill the engine %s", str(e)) + Logger.log("d", "Exception occurred while trying to kill the engine %s", str(e)) if self._message: self._message.hide() self._message = None From e94220f46d93a0be1cb384ce77e1e41815e7ac04 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 16:39:37 +0200 Subject: [PATCH 188/224] Remove commented code Contributes to issues CURA-1278 and CURA-1588. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index dee6f43bd6..1f7d34556e 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -166,7 +166,6 @@ class CuraEngineBackend(Backend): self._process.terminate() Logger.log("d", "Engine process is killed. Received return code %s", self._process.wait()) self._process = None - #self._createSocket() # Re create the socket except Exception as e: # terminating a process that is already terminating causes an exception, silently ignore this. Logger.log("d", "Exception occurred while trying to kill the engine %s", str(e)) if self._message: From c8de272ec445023c467767336be043284514e99f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 16:45:43 +0200 Subject: [PATCH 189/224] Document old functions I was reading through these to check if they'd still work. They should still work, but since I went through them I went ahead and documented them too. Contributes to issues CURA-1278 and CURA-1588. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 1f7d34556e..d7c4d6bd8b 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -153,6 +153,7 @@ class CuraEngineBackend(Backend): job.finished.connect(self._onStartSliceCompleted) job.start() + ## Terminate the engine process. def _terminate(self): self._slicing = False self._restart = True @@ -172,7 +173,14 @@ class CuraEngineBackend(Backend): self._message.hide() self._message = None - + ## Event handler to call when the job to initiate the slicing process is + # completed. + # + # When the start slice job is successfully completed, it will be happily + # slicing. This function handles any errors that may occur during the + # bootstrapping of a slice job. + # + # \param job The start slice job that was just finished. def _onStartSliceCompleted(self, job): if job.getError() or job.getResult() != True: if self._message: @@ -180,6 +188,11 @@ class CuraEngineBackend(Backend): self._message = None return + ## Listener for when the scene has changed. + # + # This should start a slice if the scene is now ready to slice. + # + # \param source The scene node that was changed. def _onSceneChanged(self, source): if type(source) is not SceneNode: return @@ -195,6 +208,9 @@ class CuraEngineBackend(Backend): self._onChanged() + ## Called when an error occurs in the socket connection towards the engine. + # + # \param error The exception that occurred. def _onSocketError(self, error): if Application.getInstance().isShuttingDown(): return From 9217dd3e1bfbb519c88d43d6123a2386d1478da9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 16:47:22 +0200 Subject: [PATCH 190/224] Remove unused function No longer used due to fix for setting rework. Contributes to issues CURA-1278 and CURA-1288. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index d7c4d6bd8b..8414cd2cb6 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -221,15 +221,6 @@ class CuraEngineBackend(Backend): if error.getErrorCode() not in [Arcus.ErrorCode.BindFailedError, Arcus.ErrorCode.ConnectionResetError, Arcus.ErrorCode.Debug]: Logger.log("e", "A socket error caused the connection to be reset") - def _onActiveProfileChanged(self): - if self._profile: - self._profile.settingValueChanged.disconnect(self._onSettingChanged) - - self._profile = Application.getInstance().getMachineManager().getWorkingProfile() - if self._profile: - self._profile.settingValueChanged.connect(self._onSettingChanged) - self._onChanged() - ## A setting has changed, so check if we must reslice. # # \param instance The setting instance that has changed. From 90ce0f44c3045c4cf414e9c43a5172d96496e3d7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 17:00:10 +0200 Subject: [PATCH 191/224] Document remaining functions of CuraEngineBackend They have all been checked for correctness now. While I was doing that, I documented their working as far as I could understand. Contributes to issues CURA-1278 and CURA-1588. --- .../CuraEngineBackend/CuraEngineBackend.py | 43 ++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 8414cd2cb6..0410fc77fa 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -229,10 +229,15 @@ class CuraEngineBackend(Backend): if property == "value": #Only reslice if the value has changed. self._onChanged() + ## Called when a sliced layer data message is received from the engine. + # + # \param message The protobuf message containing sliced layer data. def _onLayerMessage(self, message): self._stored_layer_data.append(message) - + ## Called when a progress message is received from the engine. + # + # \param message The protobuf message containing the slicing progress. def _onProgressMessage(self, message): if self._message: self._message.setProgress(round(message.amount * 100)) @@ -240,6 +245,9 @@ class CuraEngineBackend(Backend): self.processingProgress.emit(message.amount) self.backendStateChange.emit(BackendState.PROCESSING) + ## Called when the engine sends a message that slicing is finished. + # + # \param message The protobuf message signalling that slicing is finished. def _onSlicingFinishedMessage(self, message): self.backendStateChange.emit(BackendState.DONE) self.processingProgress.emit(1.0) @@ -256,15 +264,27 @@ class CuraEngineBackend(Backend): self._process_layers_job.start() self._stored_layer_data = [] + ## Called when a g-code message is received from the engine. + # + # \param message The protobuf message containing g-code, encoded as UTF-8. def _onGCodeLayerMessage(self, message): self._scene.gcode_list.append(message.data.decode("utf-8", "replace")) + ## Called when a g-code prefix message is received from the engine. + # + # \param message The protobuf message containing the g-code prefix, + # encoded as UTF-8. def _onGCodePrefixMessage(self, message): self._scene.gcode_list.insert(0, message.data.decode("utf-8", "replace")) + ## Called when a print time message is received from the engine. + # + # \param message The protobuf message containing the print time and + # material amount. def _onObjectPrintTimeMessage(self, message): self.printDurationMessage.emit(message.time, message.material_amount) + ## Creates a new socket connection. def _createSocket(self): super()._createSocket(os.path.abspath(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "Cura.proto"))) @@ -272,25 +292,41 @@ class CuraEngineBackend(Backend): def forceSlice(self): self._change_timer.start() + ## Called when anything has changed to the stuff that needs to be sliced. + # + # This indicates that we should probably re-slice soon. def _onChanged(self): self._change_timer.start() + ## Called when the back-end connects to the front-end. def _onBackendConnected(self): if self._restart: self._onChanged() self._restart = False + ## Called when the user starts using some tool. + # + # When the user starts using a tool, we should pause slicing to prevent + # continuously slicing while the user is dragging some tool handle. + # + # \param tool The tool that the user is using. def _onToolOperationStarted(self, tool): self._terminate() # Do not continue slicing once a tool has started self._enabled = False # Do not reslice when a tool is doing it's 'thing' + ## Called when the user stops using some tool. + # + # This indicates that we can safely start slicing again. + # + # \param tool The tool that the user was using. def _onToolOperationStopped(self, tool): self._enabled = True # Tool stop, start listening for changes again. + ## Called when the user changes the active view mode. def _onActiveViewChanged(self): if Application.getInstance().getController().getActiveView(): view = Application.getInstance().getController().getActiveView() - if view.getPluginId() == "LayerView": + if view.getPluginId() == "LayerView": #If switching to layer view, we should process the layers if that hasn't been done yet. self._layer_view_active = True # There is data and we're not slicing at the moment # if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment. @@ -304,6 +340,9 @@ class CuraEngineBackend(Backend): def _onInstanceChanged(self): self._terminate() + ## Called when the back-end self-terminates. + # + # We should reset our state and start listening for new connections. def _onBackendQuit(self): if not self._restart and self._process: Logger.log("d", "Backend quit with return code %s. Resetting process and socket.", self._process.wait()) From c6d3677d6f2f46ab159f750e655d24acf8cf46ff Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 17:00:58 +0200 Subject: [PATCH 192/224] Remove unused function There are no machine instances any more. We can just listen for setting value changes. Contributes to issues CURA-1278 and CURA-1588. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 0410fc77fa..df4d5f6dd2 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -337,9 +337,6 @@ class CuraEngineBackend(Backend): else: self._layer_view_active = False - def _onInstanceChanged(self): - self._terminate() - ## Called when the back-end self-terminates. # # We should reset our state and start listening for new connections. From d235b36692db5b7d48998b294da2ce812fedd09c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 17:03:25 +0200 Subject: [PATCH 193/224] Fix computation of material length from volume The setting value was obtained wrongly. Contributes to issue CURA-1278. --- cura/PrintInformation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 994dac69d0..2663cab5a0 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -63,6 +63,6 @@ class PrintInformation(QObject): self.currentPrintTimeChanged.emit() # Material amount is sent as an amount of mm^3, so calculate length from that - r = Application.getInstance().getGlobalContainerStack().getValue("material_diameter") / 2 + r = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") / 2 self._material_amount = round((amount / (math.pi * r ** 2)) / 1000, 2) self.materialAmountChanged.emit() From 6116f592b3de0aced9e12ead0804e35550c9b0a8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 17:04:56 +0200 Subject: [PATCH 194/224] Remove print This was printing all settings that were being sent to the engine. Could've been useful, actually. Maybe I'll re-add it in the form of a log. Contributes to issues CURA-1278 and CURA-1588. --- plugins/CuraEngineBackend/StartSliceJob.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 0b01b11992..70c56dfcc5 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -131,7 +131,6 @@ class StartSliceJob(Job): def _sendGlobalSettings(self): message = self._socket.createMessage("cura.proto.SettingList") settings = self._getAllSettingValues() #Get all the settings to send. - print(settings) start_gcode = settings["machine_start_gcode"] settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode #Pre-compute material_bed_temp_prepend and material_print_temp_prepend. settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode From eb8b3e01e3b2ba39bbbad377dcd5aa6d0f354d40 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 23 May 2016 18:10:35 +0200 Subject: [PATCH 195/224] Properly catch exceptions when serializing containers and check for dirty state --- cura/CuraApplication.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index bfe342d1e4..dc3d777c2f 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -193,7 +193,17 @@ class CuraApplication(QtApplication): ## Cura has multiple locations where instance containers need to be saved, so we need to handle this differently. def _onExit(self): for instance in ContainerRegistry.getInstance().findInstanceContainers(): - data = instance.serialize() + if not instance.isDirty(): + continue + + try: + data = instance.serialize() + except NotImplementedError: + continue + except Exception: + Logger.logException("e", "An exception occurred when serializing container %s", instance.getId()) + continue + file_name = urllib.parse.quote_plus(instance.getId()) + ".inst.cfg" instance_type = instance.getMetaDataEntry("type") path = None @@ -211,7 +221,17 @@ class CuraApplication(QtApplication): f.write(data) for stack in ContainerRegistry.getInstance().findContainerStacks(): - data = stack.serialize() + if not stack.isDirty(): + continue + + try: + data = stack.serialize() + except NotImplementedError: + continue + except Exception: + Logger.logException("e", "An exception occurred when serializing container %s", instance.getId()) + continue + file_name = urllib.parse.quote_plus(stack.getId()) + ".stack.cfg" path = Resources.getStoragePath(self.ResourceTypes.MachineStack, file_name) with SaveFile(path, "wt", -1, "utf-8") as f: From ea5dc00080f4fcee2fc21c20c04bacc9c188638b Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 23 May 2016 18:11:03 +0200 Subject: [PATCH 196/224] Bump LayerView API version to 3 It does not use any setting API so it is safe --- plugins/LayerView/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/LayerView/__init__.py b/plugins/LayerView/__init__.py index 3d43532126..67750fb562 100644 --- a/plugins/LayerView/__init__.py +++ b/plugins/LayerView/__init__.py @@ -14,7 +14,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Provides the Layer view."), - "api": 2 + "api": 3 }, "view": { "name": catalog.i18nc("@item:inlistbox", "Layers"), From 8284ab9de539828825c31f182f9a95ba4e2f8f69 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 23 May 2016 18:11:24 +0200 Subject: [PATCH 197/224] Insert printers and materials pages at the right location --- resources/qml/Cura.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index b03c5ed06a..b8ea7b1a72 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -549,9 +549,9 @@ UM.MainWindow //: View preferences page title insertPage(1, catalog.i18nc("@title:tab","View"), Qt.resolvedUrl("ViewPage.qml")); - insertPage(2, catalog.i18nc("@title:tab", "Printers"), Qt.resolvedUrl("MachinesPage.qml")); + insertPage(3, catalog.i18nc("@title:tab", "Printers"), Qt.resolvedUrl("MachinesPage.qml")); - insertPage(3, catalog.i18nc("@title:tab", "Materials"), Qt.resolvedUrl("Preferences/MaterialsPage.qml")) + insertPage(4, catalog.i18nc("@title:tab", "Materials"), Qt.resolvedUrl("Preferences/MaterialsPage.qml")); //Force refresh setPage(0); From f90be96bc66b5339d1e6e709450d13a670f93b8a Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 23 May 2016 18:12:25 +0200 Subject: [PATCH 198/224] Add back the Profiles page --- resources/qml/Cura.qml | 2 + resources/qml/Preferences/ProfilesPage.qml | 222 +++++++++++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 resources/qml/Preferences/ProfilesPage.qml diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index b8ea7b1a72..733def1b81 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -553,6 +553,8 @@ UM.MainWindow insertPage(4, catalog.i18nc("@title:tab", "Materials"), Qt.resolvedUrl("Preferences/MaterialsPage.qml")); + insertPage(5, catalog.i18nc("@title:tab", "Profiles"), Qt.resolvedUrl("Preferences/ProfilesPage.qml")); + //Force refresh setPage(0); } diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml new file mode 100644 index 0000000000..6e5d39cb49 --- /dev/null +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -0,0 +1,222 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Dialogs 1.2 + +import UM 1.2 as UM + +UM.ManagementPage +{ + id: base; + + title: catalog.i18nc("@title:tab", "Profiles"); + addText: catalog.i18nc("@label", "Duplicate") + + model: UM.InstanceContainersModel { filter: { "type": "quality" } } + + onAddObject: { + var selectedProfile; + if (objectList.currentIndex == 0) { + // Current settings + selectedProfile = UM.MachineManager.createProfile(); + } else { + selectedProfile = UM.MachineManager.duplicateProfile(currentItem.name); + } + base.selectProfile(selectedProfile); + + renameDialog.removeWhenRejected = true; + renameDialog.open(); + renameDialog.selectText(); + } + onRemoveObject: confirmDialog.open(); + onRenameObject: { renameDialog.removeWhenRejected = false; renameDialog.open(); renameDialog.selectText(); } + + addEnabled: currentItem != null; + removeEnabled: currentItem != null ? !currentItem.readOnly : false; + renameEnabled: currentItem != null ? !currentItem.readOnly : false; + + scrollviewCaption: catalog.i18nc("@label %1 is printer name","Printer: %1").arg(UM.MachineManager.activeMachineInstance) + + signal selectProfile(string name) + onSelectProfile: { + objectList.currentIndex = objectList.model.find("name", name); + } + + Item { + visible: base.currentItem != null + anchors.fill: parent + + Label { + id: profileName + text: base.currentItem ? base.currentItem.name : "" + font: UM.Theme.getFont("large") + width: parent.width + elide: Text.ElideRight + } + + ScrollView { + anchors.left: parent.left + anchors.top: profileName.bottom + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.right: parent.right + anchors.bottom: parent.bottom + + Column + { + spacing: UM.Theme.getSize("default_margin").height + + Row + { + visible: base.currentItem.id == -1 || base.currentItem.active + Button + { + text: { + var profileName = UM.MachineManager.activeProfile; + profileName = (profileName.length > 20) ? profileName.substring(0, 20) + '...' : profileName; + return catalog.i18nc("@action:button", "Update \"%1\"".arg(profileName)); + } + enabled: UM.ActiveProfile.hasCustomisedValues && !UM.ActiveProfile.readOnly + onClicked: UM.ActiveProfile.updateProfile() + } + + Button + { + text: catalog.i18nc("@action:button", "Discard changes"); + enabled: UM.ActiveProfile.hasCustomisedValues + onClicked: UM.ActiveProfile.discardChanges() + } + } + + Grid + { + id: containerGrid + columns: 2 + spacing: UM.Theme.getSize("default_margin").width + + Label { + text: base.currentItem == null ? "" : + base.currentItem.id == -1 ? catalog.i18nc("@label", "Based on") : catalog.i18nc("@label", "Profile type") + } + Label { + text: base.currentItem == null ? "" : + base.currentItem.id == -1 ? UM.MachineManager.activeProfile : + base.currentItem.readOnly ? catalog.i18nc("@label", "Protected profile") : catalog.i18nc("@label", "Custom profile") + } + + Column { + Repeater { + model: base.currentItem ? base.currentItem.settings : null + Label { + text: modelData.name.toString(); + elide: Text.ElideMiddle; + } + } + } + Column { + Repeater { + model: base.currentItem ? base.currentItem.settings : null + Label { text: modelData.value.toString(); } + } + } + } + } + } + } + + buttons: Row { + + Button + { + text: catalog.i18nc("@action:button", "Import"); + iconName: "document-import"; + onClicked: importDialog.open(); + } + + Button + { + text: catalog.i18nc("@action:button", "Export"); + iconName: "document-export"; + onClicked: exportDialog.open(); + } + } + + Item + { + UM.I18nCatalog { id: catalog; name: "uranium"; } + + UM.ConfirmRemoveDialog + { + id: confirmDialog; + object: base.currentItem != null ? base.currentItem.name : ""; + onYes: base.model.removeProfile(base.currentItem.name); + } + UM.RenameDialog + { + id: renameDialog; + object: base.currentItem != null ? base.currentItem.name : ""; + property bool removeWhenRejected: false; + onAccepted: base.model.renameProfile(base.currentItem.name, newName.trim()); + onRejected: { + if(removeWhenRejected) { + base.model.removeProfile(base.currentItem.name) + } + } + } + MessageDialog + { + id: messageDialog + title: catalog.i18nc("@window:title", "Import Profile"); + standardButtons: StandardButton.Ok + modality: Qt.ApplicationModal + } + + FileDialog + { + id: importDialog; + title: catalog.i18nc("@title:window", "Import Profile"); + selectExisting: true; + nameFilters: base.model.getFileNameFiltersRead() + folder: base.model.getDefaultPath() + onAccepted: + { + var result = base.model.importProfile(fileUrl) + messageDialog.text = result.message + if(result.status == "ok") + { + messageDialog.icon = StandardIcon.Information + } + else if(result.status == "duplicate") + { + messageDialog.icon = StandardIcon.Warning + } + else + { + messageDialog.icon = StandardIcon.Critical + } + messageDialog.open() + } + } + + FileDialog + { + id: exportDialog; + title: catalog.i18nc("@title:window", "Export Profile"); + selectExisting: false; + nameFilters: base.model.getFileNameFiltersWrite() + folder: base.model.getDefaultPath() + onAccepted: + { + var result = base.model.exportProfile(base.currentItem.id, base.currentItem.name, fileUrl, selectedNameFilter) + if(result && result.status == "error") + { + messageDialog.icon = StandardIcon.Critical + messageDialog.text = result.message + messageDialog.open() + } + // else pop-up Message thing from python code + } + } + } +} From a1115649cfa69a63dc6aa6d51546612daad8e64a Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 23 May 2016 18:13:22 +0200 Subject: [PATCH 199/224] Rename all variant profiles to .inst.cfg and correctly mark them as type variant Still some issues with formulas causing errors, but it is getting closer --- ...ed_plus_0.25.cfg => ultimaker2_extended_plus_0.25.inst.cfg} | 3 ++- ...nded_plus_0.4.cfg => ultimaker2_extended_plus_0.4.inst.cfg} | 3 ++- ...nded_plus_0.6.cfg => ultimaker2_extended_plus_0.6.inst.cfg} | 3 ++- ...nded_plus_0.8.cfg => ultimaker2_extended_plus_0.8.inst.cfg} | 3 ++- ...{ultimaker2_plus_0.25.cfg => ultimaker2_plus_0.25.inst.cfg} | 3 ++- .../{ultimaker2_plus_0.4.cfg => ultimaker2_plus_0.4.inst.cfg} | 3 ++- .../{ultimaker2_plus_0.6.cfg => ultimaker2_plus_0.6.inst.cfg} | 3 ++- .../{ultimaker2_plus_0.8.cfg => ultimaker2_plus_0.8.inst.cfg} | 3 ++- 8 files changed, 16 insertions(+), 8 deletions(-) rename resources/variants/{ultimaker2_extended_plus_0.25.cfg => ultimaker2_extended_plus_0.25.inst.cfg} (84%) rename resources/variants/{ultimaker2_extended_plus_0.4.cfg => ultimaker2_extended_plus_0.4.inst.cfg} (82%) rename resources/variants/{ultimaker2_extended_plus_0.6.cfg => ultimaker2_extended_plus_0.6.inst.cfg} (83%) rename resources/variants/{ultimaker2_extended_plus_0.8.cfg => ultimaker2_extended_plus_0.8.inst.cfg} (83%) rename resources/variants/{ultimaker2_plus_0.25.cfg => ultimaker2_plus_0.25.inst.cfg} (84%) rename resources/variants/{ultimaker2_plus_0.4.cfg => ultimaker2_plus_0.4.inst.cfg} (81%) rename resources/variants/{ultimaker2_plus_0.6.cfg => ultimaker2_plus_0.6.inst.cfg} (83%) rename resources/variants/{ultimaker2_plus_0.8.cfg => ultimaker2_plus_0.8.inst.cfg} (83%) diff --git a/resources/variants/ultimaker2_extended_plus_0.25.cfg b/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg similarity index 84% rename from resources/variants/ultimaker2_extended_plus_0.25.cfg rename to resources/variants/ultimaker2_extended_plus_0.25.inst.cfg index 2bc14d7588..0c0154c03b 100644 --- a/resources/variants/ultimaker2_extended_plus_0.25.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg @@ -5,6 +5,7 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker +type = variant [values] machine_nozzle_size = 0.25 @@ -13,4 +14,4 @@ coasting_volume = 0.1 coasting_min_volume = 0.17 speed_wall = round(speed_print / 1.2, 1) speed_wall_0 = 1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = round(speed_print / 1.5, 1) \ No newline at end of file +speed_topbottom = round(speed_print / 1.5, 1) diff --git a/resources/variants/ultimaker2_extended_plus_0.4.cfg b/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg similarity index 82% rename from resources/variants/ultimaker2_extended_plus_0.4.cfg rename to resources/variants/ultimaker2_extended_plus_0.4.inst.cfg index a0de0ad2d7..87b74b2572 100644 --- a/resources/variants/ultimaker2_extended_plus_0.4.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg @@ -5,10 +5,11 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker +type = variant [values] machine_nozzle_size = 0.4 machine_nozzle_tip_outer_diameter = 1.05 speed_wall = round(speed_print / 1.25, 1) speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = round(speed_print / 2.25, 1) \ No newline at end of file +speed_topbottom = round(speed_print / 2.25, 1) diff --git a/resources/variants/ultimaker2_extended_plus_0.6.cfg b/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg similarity index 83% rename from resources/variants/ultimaker2_extended_plus_0.6.cfg rename to resources/variants/ultimaker2_extended_plus_0.6.inst.cfg index 10fa9dd4de..343b2d85e5 100644 --- a/resources/variants/ultimaker2_extended_plus_0.6.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg @@ -5,6 +5,7 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker +type = variant [values] machine_nozzle_size = 0.6 @@ -12,4 +13,4 @@ machine_nozzle_tip_outer_diameter = 1.25 coasting_volume = 1.36 speed_wall = round(speed_print * 4 / 3, 1) speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = round(speed_print / 2, 1) \ No newline at end of file +speed_topbottom = round(speed_print / 2, 1) diff --git a/resources/variants/ultimaker2_extended_plus_0.8.cfg b/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg similarity index 83% rename from resources/variants/ultimaker2_extended_plus_0.8.cfg rename to resources/variants/ultimaker2_extended_plus_0.8.inst.cfg index 2980215ebd..c1bb4555c1 100644 --- a/resources/variants/ultimaker2_extended_plus_0.8.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg @@ -5,6 +5,7 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker +type = variant [values] machine_nozzle_size = 0.8 @@ -12,4 +13,4 @@ machine_nozzle_tip_outer_diameter = 1.35 coasting_volume = 3.22 speed_wall = round(speed_print * 4 / 3, 1) speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = round(speed_print / 2, 1) \ No newline at end of file +speed_topbottom = round(speed_print / 2, 1) diff --git a/resources/variants/ultimaker2_plus_0.25.cfg b/resources/variants/ultimaker2_plus_0.25.inst.cfg similarity index 84% rename from resources/variants/ultimaker2_plus_0.25.cfg rename to resources/variants/ultimaker2_plus_0.25.inst.cfg index 18839a8871..51a4b44a4a 100644 --- a/resources/variants/ultimaker2_plus_0.25.cfg +++ b/resources/variants/ultimaker2_plus_0.25.inst.cfg @@ -5,6 +5,7 @@ definition = ultimaker2_plus [metadata] author = Ultimaker +type = variant [values] machine_nozzle_size = 0.25 @@ -13,4 +14,4 @@ coasting_volume = 0.1 coasting_min_volume = 0.17 speed_wall = round(speed_print / 1.2, 1) speed_wall_0 = 1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = round(speed_print / 1.5, 1) \ No newline at end of file +speed_topbottom = round(speed_print / 1.5, 1) diff --git a/resources/variants/ultimaker2_plus_0.4.cfg b/resources/variants/ultimaker2_plus_0.4.inst.cfg similarity index 81% rename from resources/variants/ultimaker2_plus_0.4.cfg rename to resources/variants/ultimaker2_plus_0.4.inst.cfg index b7dc47ea6e..aaea23a8df 100644 --- a/resources/variants/ultimaker2_plus_0.4.cfg +++ b/resources/variants/ultimaker2_plus_0.4.inst.cfg @@ -5,10 +5,11 @@ definition = ultimaker2_plus [metadata] author = Ultimaker +type = variant [values] machine_nozzle_size = 0.4 machine_nozzle_tip_outer_diameter = 1.05 speed_wall = round(speed_print / 1.25, 1) speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = round(speed_print / 2.25, 1) \ No newline at end of file +speed_topbottom = round(speed_print / 2.25, 1) diff --git a/resources/variants/ultimaker2_plus_0.6.cfg b/resources/variants/ultimaker2_plus_0.6.inst.cfg similarity index 83% rename from resources/variants/ultimaker2_plus_0.6.cfg rename to resources/variants/ultimaker2_plus_0.6.inst.cfg index d6a7da7437..c416b2ec3c 100644 --- a/resources/variants/ultimaker2_plus_0.6.cfg +++ b/resources/variants/ultimaker2_plus_0.6.inst.cfg @@ -5,6 +5,7 @@ definition = ultimaker2_plus [metadata] author = Ultimaker +type = variant [values] machine_nozzle_size = 0.6 @@ -12,4 +13,4 @@ machine_nozzle_tip_outer_diameter = 1.25 coasting_volume = 1.36 speed_wall = round(speed_print * 4 / 3, 1) speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = round(speed_print / 2, 1) \ No newline at end of file +speed_topbottom = round(speed_print / 2, 1) diff --git a/resources/variants/ultimaker2_plus_0.8.cfg b/resources/variants/ultimaker2_plus_0.8.inst.cfg similarity index 83% rename from resources/variants/ultimaker2_plus_0.8.cfg rename to resources/variants/ultimaker2_plus_0.8.inst.cfg index cb97151642..3b577384ec 100644 --- a/resources/variants/ultimaker2_plus_0.8.cfg +++ b/resources/variants/ultimaker2_plus_0.8.inst.cfg @@ -5,6 +5,7 @@ definition = ultimaker2_plus [metadata] author = Ultimaker +type = variant [values] machine_nozzle_size = 0.8 @@ -12,4 +13,4 @@ machine_nozzle_tip_outer_diameter = 1.35 coasting_volume = 3.22 speed_wall = round(speed_print * 4 / 3, 1) speed_wall_0 = 1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = round(speed_print / 2, 1) \ No newline at end of file +speed_topbottom = round(speed_print / 2, 1) From b6aa78cc8d858ba851f571f910fdd5fc4bad9c0e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 23:15:21 +0200 Subject: [PATCH 200/224] Use getAllKeys of ContainerStack to get all setting values Instead of traversing the setting definitions ourselves, let the stack do it. This code should be reusable for other places where we want to get certain properties of all settings, hopefully. Contributes to issues CURA-1278 and CURA-1588. --- plugins/CuraEngineBackend/StartSliceJob.py | 42 +++++----------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 70c56dfcc5..c0019b4401 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -130,10 +130,17 @@ class StartSliceJob(Job): # per-extruder settings or per-object settings. def _sendGlobalSettings(self): message = self._socket.createMessage("cura.proto.SettingList") - settings = self._getAllSettingValues() #Get all the settings to send. + + #Get all the settings to send. + stack = Application.getInstance().getGlobalContainerStack() + keys = stack.getAllKeys() + settings = { } + for key in keys: + settings[key] = stack.getProperty(key, "value") start_gcode = settings["machine_start_gcode"] settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode #Pre-compute material_bed_temp_prepend and material_print_temp_prepend. 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 = message.addRepeatedMessage("settings") setting_message.name = key @@ -162,35 +169,4 @@ class StartSliceJob(Job): setting.name = key setting.value = str(value).encode() - Job.yieldThread() - - ## Gets the current values for all child definitions of a definition. - # - # To be clear, it looks up all child definitions, and returns the CURRENT - # VALUE of the keys of these definitions according to the global stack. It - # doesn't return the "value" property in the definition. - # - # \param definition The setting definition to get the child settings of. - def _getAllChildSettingValues(self, definition): - setting_values = { } - for child in definition.children: - setting_values[child.key] = self._stack.getProperty(child.key, "value") - for key, value in self._getAllChildSettingValues(child).items(): - setting_values[key] = value - return setting_values - - ## Gets all setting values as a dictionary. - # - # \return A dictionary with the setting keys as keys and the setting - # values as values. - def _getAllSettingValues(self): - setting_values = {} - - definition_containers = [container for container in self._stack.getContainers() if container.__class__ == DefinitionContainer] #To get all keys, get all definitions from all definition containers. - for definition_container in definition_containers: - for definition in definition_container.definitions: - setting_values[definition.key] = self._stack.getProperty(definition.key, "value") - for key, value in self._getAllChildSettingValues(definition).items(): - setting_values[key] = value - - return setting_values \ No newline at end of file + Job.yieldThread() \ No newline at end of file From 1cbb3a3f285b5093c00afb2be4ca27c839df365c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 May 2016 23:47:38 +0200 Subject: [PATCH 201/224] Prevent slicing if there is an invalid setting value E.g. higher than maximum_value. This seems to work okay but is largely untested because switching to advanced mode gives a segfault. Contributes to issues CURA-1278 and CURA-1588. --- .../CuraEngineBackend/CuraEngineBackend.py | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index df4d5f6dd2..cc0d1b1600 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -11,6 +11,7 @@ from UM.Qt.Bindings.BackendProxy import BackendState #To determine the state of from UM.Message import Message 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.OneAtATimeIterator import OneAtATimeIterator from . import ProcessSlicedLayersJob @@ -127,15 +128,26 @@ class CuraEngineBackend(Backend): self._process_layers_job.abort() self._process_layers_job = None - #TODO: Re-add don't slice with error stuff. - #if self._profile.hasErrorValue(): - # Logger.log("w", "Profile has error values. Aborting slicing") - # if self._message: - # self._message.hide() - # self._message = None - # self._message = Message(catalog.i18nc("@info:status", "Unable to slice. Please check your setting values for errors.")) - # self._message.show() - # return #No slicing if we have error values since those are by definition illegal values. + #Don't slice if there is a setting with an error value. + stack = Application.getInstance().getGlobalContainerStack() + for key in stack.getAllKeys(): + validation_state = stack.getProperty(key, "validationState") + #Only setting instances have a validation state, so settings which + #are not overwritten by any instance will have none. The property + #then, and only then, evaluates to None. We make the assumption that + #the definition defines the setting with a default value that is + #valid. Therefore we can allow both ValidatorState.Valid and None as + #allowable validation states. + #TODO: This assumption is wrong! If the definition defines an inheritance function that through inheritance evaluates to a disallowed value, a setting is still invalid even though it's default! + #TODO: Therefore we must also validate setting definitions. + if validation_state != None and validation_state != ValidatorState.Valid: + Logger.log("w", "Setting %s is not valid, but %s. Aborting slicing.", key, validation_state) + if self._message: #Hide any old message before creating a new one. + self._message.hide() + self._message = None + self._message = Message(catalog.i18nc("@info:status", "Unable to slice. Please check your setting values for errors.")) + self._message.show() + return self.processingProgress.emit(0.0) self.backendStateChange.emit(BackendState.NOT_STARTED) From fa1d262123387918414b74e69a33a57ee2e10910 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 24 May 2016 01:16:11 +0200 Subject: [PATCH 202/224] Fix getting platform centre With the new setting system. Contributes to issues CURA-1278 and CURA-1591. --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 6a947866d3..59feec0fc2 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -62,8 +62,6 @@ class ProcessSlicedLayersJob(Job): self._progress.hide() return - settings = Application.getInstance().getMachineManager().getWorkingProfile() - mesh = MeshData() layer_data = LayerData.LayerData() layer_count = len(self._layers) @@ -132,8 +130,9 @@ class ProcessSlicedLayersJob(Job): new_node.setMeshData(mesh) new_node.setParent(self._scene.getRoot()) # Note: After this we can no longer abort! - if not settings.getSettingValue("machine_center_is_zero"): - new_node.setPosition(Vector(-settings.getSettingValue("machine_width") / 2, 0.0, settings.getSettingValue("machine_depth") / 2)) + settings = Application.getInstance().getGlobalContainerStack() + if not settings.getProperty("machine_center_is_zero", "value"): + new_node.setPosition(Vector(-settings.getProperty("machine_width", "value") / 2, 0.0, settings.getProperty("machine_depth", "value") / 2)) if self._progress: self._progress.setProgress(100) From 59b8d5c169bc762dfd80e847f1c6b23d10239217 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 24 May 2016 02:24:11 +0200 Subject: [PATCH 203/224] Fix saving g-code to file The settings that are serialised at the end of the g-code are now the serialised global container stack. That's fairly useless since the serialised version of a container stack just lists the IDs of the containers in the stack, not the settings themselves. One of these containers is likely a current_profile container and that's all the information you'll get from that serialisation. Contributes to issue CURA-1278. --- plugins/GCodeWriter/GCodeWriter.py | 23 ++++++++++++----------- plugins/GCodeWriter/__init__.py | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index ee766ef221..5db25aeac2 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -32,7 +32,7 @@ class GCodeWriter(MeshWriter): def write(self, stream, node, mode = MeshWriter.OutputMode.TextMode): if mode != MeshWriter.OutputMode.TextMode: - Logger.log("e", "GCode Writer does not support non-text mode") + Logger.log("e", "GCode Writer does not support non-text mode.") return False scene = Application.getInstance().getController().getScene() @@ -40,26 +40,27 @@ class GCodeWriter(MeshWriter): if gcode_list: for gcode in gcode_list: stream.write(gcode) - # Serialise the profile and put them at the end of the file. - profile = self._serialiseProfile(Application.getInstance().getMachineManager().getWorkingProfile()) - stream.write(profile) + # Serialise the current container stack and put it at the end of the file. + settings = self._serialiseSettings(Application.getInstance().getGlobalContainerStack()) + stream.write(settings) return True return False - ## Serialises the profile to prepare it for saving in the g-code. + ## Serialises a container stack to prepare it for writing at the end of the + # g-code. # - # The profile are serialised, and special characters (including newline) + # The settings are serialised, and special characters (including newline) # are escaped. # - # \param profile The profile to serialise. - # \return A serialised string of the profile. - def _serialiseProfile(self, profile): + # \param settings A container stack to serialise. + # \return A serialised string of the settings. + def _serialiseSettings(self, settings): prefix = ";SETTING_" + str(GCodeWriter.version) + " " # The prefix to put before each line. prefix_length = len(prefix) - # Serialise a deepcopy to remove the defaults from the profile - serialised = copy.deepcopy(profile).serialise() + #TODO: This just serialises the container stack, which only indicates the IDs of the containers in that stack, not the settings themselves, making this about 9001x as useless as the fax functionality in Adobe Acrobat. + serialised = settings.serialize() # Escape characters that have a special meaning in g-code comments. pattern = re.compile("|".join(GCodeWriter.escape_characters.keys())) diff --git a/plugins/GCodeWriter/__init__.py b/plugins/GCodeWriter/__init__.py index cd8a5d3418..efe3368c61 100644 --- a/plugins/GCodeWriter/__init__.py +++ b/plugins/GCodeWriter/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Writes GCode to a file."), - "api": 2 + "api": 3 }, "mesh_writer": { From 673f63cf51d9100d9a655e1a8a8a892125a8d738 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 24 May 2016 02:26:02 +0200 Subject: [PATCH 204/224] Remove unused import The deep copy is no longer needed. Also updated copyright year. Contributes to issue CURA-1278. --- plugins/GCodeWriter/GCodeWriter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index 5db25aeac2..3cbed77aab 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -1,11 +1,10 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. from UM.Mesh.MeshWriter import MeshWriter from UM.Logger import Logger from UM.Application import Application import re #For escaping characters in the settings. -import copy class GCodeWriter(MeshWriter): From 8b5c4b0361bf1aa9d5ad6572452700ee7579adf0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 24 May 2016 02:28:56 +0200 Subject: [PATCH 205/224] Document GCodeWriter class Contributes to issue CURA-1278. --- plugins/GCodeWriter/GCodeWriter.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index 3cbed77aab..ec5d1ceaf8 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -6,7 +6,16 @@ from UM.Logger import Logger from UM.Application import Application import re #For escaping characters in the settings. - +## Writes g-code to a file. +# +# While this poses as a mesh writer, what this really does is take the g-code +# in the entire scene and write it to an output device. Since the g-code of a +# single mesh isn't separable from the rest what with rafts and travel moves +# and all, it doesn't make sense to write just a single mesh. +# +# So this plug-in takes the g-code that is stored in the root of the scene +# node tree, adds a bit of extra information about the profiles and writes +# that to the output device. class GCodeWriter(MeshWriter): ## The file format version of the serialised g-code. # From d602c0754fa0a89ed5b5545b75d6f7d582198e17 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 24 May 2016 03:00:16 +0200 Subject: [PATCH 206/224] Properly serialise all settings to g-code file This makes for ugly g-code files, true, but at least the functionality of saving settings is useful now: It's traceable. Could've implemented this somewhere else too, but this is fine for now. Contributes to issue CURA-1278. --- plugins/GCodeWriter/GCodeWriter.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index ec5d1ceaf8..d304f0d046 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -4,6 +4,7 @@ from UM.Mesh.MeshWriter import MeshWriter from UM.Logger import Logger from UM.Application import Application +from UM.Settings.InstanceContainer import InstanceContainer #To create a complete setting profile to store in the g-code. import re #For escaping characters in the settings. ## Writes g-code to a file. @@ -67,8 +68,11 @@ class GCodeWriter(MeshWriter): prefix = ";SETTING_" + str(GCodeWriter.version) + " " # The prefix to put before each line. prefix_length = len(prefix) - #TODO: This just serialises the container stack, which only indicates the IDs of the containers in that stack, not the settings themselves, making this about 9001x as useless as the fax functionality in Adobe Acrobat. - serialised = settings.serialize() + all_settings = InstanceContainer("G-code-imported-profile") #Create a new 'profile' with ALL settings so that the slice can be precisely reproduced. + all_settings.setDefinition(settings.getBottom()) + for key in settings.getAllKeys(): + all_settings.setProperty(key, "value", settings.getProperty(key, "value")) #Just copy everything over to the setting instance. + serialised = all_settings.serialize() # Escape characters that have a special meaning in g-code comments. pattern = re.compile("|".join(GCodeWriter.escape_characters.keys())) From b1d5cad89842c3474fe4508a51cc14000f0690fd Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 24 May 2016 11:43:57 +0200 Subject: [PATCH 207/224] Document QTbug Took a while to find! Contributes to issue CURA-1278. --- resources/qml/Settings/SettingView.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 6b09c8b9a3..65c7546d02 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -44,6 +44,7 @@ ScrollView property var settingDefinitionsModel: definitionsModel property var propertyProvider: provider + //Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989 asynchronous: true source: From 332321b99119f7b0ebe96a11776bd6114c43d608 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 24 May 2016 11:50:39 +0200 Subject: [PATCH 208/224] Disable asynchronous loading of SettingItem when Qt Version < 5.5 --- 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 65c7546d02..0e99ecc4b7 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -45,7 +45,7 @@ ScrollView property var propertyProvider: provider //Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989 - asynchronous: true + asynchronous: QT_VERSION_STR.split(".")[1] >= 5 source: { From c80455c6bca2d79a54b5a0225bb6e14afdc2f64d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 24 May 2016 15:04:08 +0200 Subject: [PATCH 209/224] Fix creating print job name Also fixed up the code style of that bit. Perhaps this should've been done in Python, but that is for later. Contributes to issue CURA-1278. --- resources/qml/Cura.qml | 2 +- resources/qml/JobSpecs.qml | 50 ++++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 733def1b81..52a8498f5e 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -813,7 +813,7 @@ UM.MainWindow base.visible = true; restart(); } - else if(UM.MachineManager.activeMachineInstance == "") + else if(Cura.MachineManager.activeMachineName == "") { addMachineDialog.firstRun = true; addMachineDialog.open(); diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml index fac4fd841d..60e2c6698e 100644 --- a/resources/qml/JobSpecs.qml +++ b/resources/qml/JobSpecs.qml @@ -7,15 +7,16 @@ import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 import UM 1.1 as UM +import Cura 1.0 as Cura Rectangle { id: base; property bool activity: Printer.getPlatformActivity; property string fileBaseName - property variant activeMachineInstance: UM.MachineManager.activeMachineInstance + property variant activeMachineName: Cura.MachineManager.activeMachineName - onActiveMachineInstanceChanged: + onActiveMachineNameChanged: { base.createFileName() } @@ -28,27 +29,34 @@ Rectangle { height: childrenRect.height color: "transparent" - function createFileName(){ - var splitMachineName = UM.MachineManager.activeMachineInstance.split(" ") - var abbrMachine = '' - for (var i = 0; i < splitMachineName.length; i++){ - if (splitMachineName[i].search(/ultimaker/i) != -1){ - abbrMachine += 'UM' - } - else{ - if (splitMachineName[i].charAt(0).search(/[0-9]/g) == -1) - abbrMachine += splitMachineName[i].charAt(0) - } - var regExpAdditives = /[0-9\+]/g; - var resultAdditives = splitMachineName[i].match(regExpAdditives); - if (resultAdditives != null){ - for (var j = 0; j < resultAdditives.length; j++){ - abbrMachine += resultAdditives[j] - - } + function createFileName() + { + var splitMachineName = Cura.MachineManager.activeMachineName.split(" "); + var abbrMachine = ''; + for (var i = 0; i < splitMachineName.length; i++) + { + if (splitMachineName[i].search(/ultimaker/i) != -1) + { + abbrMachine += 'UM'; + } + else + { + if (splitMachineName[i].charAt(0).search(/[0-9]/g) == -1) + { + abbrMachine += splitMachineName[i].charAt(0); } } - printJobTextfield.text = abbrMachine + '_' + base.fileBaseName + var regExpAdditives = /[0-9\+]/g; + var resultAdditives = splitMachineName[i].match(regExpAdditives); + if (resultAdditives != null) + { + for (var j = 0; j < resultAdditives.length; j++) + { + abbrMachine += resultAdditives[j]; + } + } + } + printJobTextfield.text = abbrMachine + '_' + base.fileBaseName; } Connections { From fd3788ba7c8f830daf5a71f071aef79e01e09c4f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 25 May 2016 11:06:48 +0200 Subject: [PATCH 210/224] Removed stray = sign. CURA-1278 CURA-1592 --- 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 e53b5d338b..67534222fb 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -153,7 +153,7 @@ Item { { if(text != "") { - listview.model.filter.label = = {"global_only":"False", "label": text} + listview.model.filter.label = {"global_only":"False", "label": text} } else { From 5f54d611cf3f9ab7de3bc485229f28bc2fb23513 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 25 May 2016 11:14:11 +0200 Subject: [PATCH 211/224] Per object settings filter now uses correct bool types (instead of strings) CURA-1278 --- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 67534222fb..48ed7caaa5 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -153,11 +153,11 @@ Item { { if(text != "") { - listview.model.filter.label = {"global_only":"False", "label": text} + listview.model.filter.label = {"global_only": false, "label": text} } else { - listview.model.filter = {"global_only":"False"} + listview.model.filter = {"global_only": false} } } } @@ -182,7 +182,7 @@ Item { containerId: Cura.MachineManager.activeDefinitionId filter: { - "global_only": "False" + "global_only": false } } delegate:Loader From 81cdb3fd8c5000b5fb8d3b1004476b7b55fcbf83 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 25 May 2016 11:28:58 +0200 Subject: [PATCH 212/224] Added wildcard to filtering CURA-1278 --- 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 48ed7caaa5..9b78116d24 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -153,7 +153,7 @@ Item { { if(text != "") { - listview.model.filter.label = {"global_only": false, "label": text} + listview.model.filter = {"global_only": false, "label": "*" + text} } else { From 2e0205f174e3f778943f08978e051eaa752e283c Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 May 2016 11:21:33 +0200 Subject: [PATCH 213/224] Store the global container stack as an instance property This reduces the amount of function calls and makes it simpler to check for container existance --- cura/MachineManagerModel.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 0f45f0a7b1..b0fce98311 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -8,7 +8,10 @@ import UM.Settings class MachineManagerModel(QObject): def __init__(self, parent = None): super().__init__(parent) + + self._global_container_stack = None Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) + self._onGlobalContainerChanged() ## When the global container is changed, active material probably needs to be updated. self.globalContainerChanged.connect(self.activeMaterialChanged) @@ -31,10 +34,16 @@ class MachineManagerModel(QObject): activeQualityChanged = pyqtSignal() def _onGlobalContainerChanged(self): - Preferences.getInstance().setValue("cura/active_machine", Application.getInstance().getGlobalContainerStack().getId()) - Application.getInstance().getGlobalContainerStack().containersChanged.connect(self._onInstanceContainersChanged) + if self._global_container_stack: + self._global_container_stack.containersChanged.disconnect(self._onInstanceContainersChanged) + + self._global_container_stack = Application.getInstance().getGlobalContainerStack() self.globalContainerChanged.emit() + if self._global_container_stack: + Preferences.getInstance().setValue("cura/active_machine", self._global_container_stack.getId()) + self._global_container_stack.containersChanged.connect(self._onInstanceContainersChanged) + def _onInstanceContainersChanged(self, container): container_type = container.getMetaDataEntry("type") if container_type == "material": From b1f887a70f846307ac9361a1dcd4b7bd4f613202 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 May 2016 11:22:59 +0200 Subject: [PATCH 214/224] Use the global stack instance variable and account for it potentially being None --- cura/MachineManagerModel.py | 117 +++++++++++++++++++++++------------- 1 file changed, 76 insertions(+), 41 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index b0fce98311..eb92aa422e 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -110,78 +110,111 @@ class MachineManagerModel(QObject): @pyqtProperty(str, notify = globalContainerChanged) def activeMachineName(self): - return Application.getInstance().getGlobalContainerStack().getName() + if self._global_container_stack: + return self._global_container_stack.getName() + + return "" @pyqtProperty(str, notify = globalContainerChanged) def activeMachineId(self): - return Application.getInstance().getGlobalContainerStack().getId() + if self._global_container_stack: + return self._global_container_stack.getId() + + return "" @pyqtProperty(str, notify = activeMaterialChanged) def activeMaterialName(self): - material = Application.getInstance().getGlobalContainerStack().findContainer({"type":"material"}) - if material: - return material.getName() + if self._global_container_stack: + material = self._global_container_stack.findContainer({"type":"material"}) + if material: + return material.getName() + + return "" @pyqtProperty(str, notify=activeMaterialChanged) def activeMaterialId(self): - material = Application.getInstance().getGlobalContainerStack().findContainer({"type": "material"}) - if material: - return material.getId() + if self._global_container_stack: + material = self._global_container_stack.findContainer({"type": "material"}) + if material: + return material.getId() + + return "" @pyqtProperty(str, notify=activeQualityChanged) def activeQualityName(self): - quality = Application.getInstance().getGlobalContainerStack().findContainer({"type": "quality"}) - if quality: - return quality.getName() + if self._global_container_stack: + quality = self._global_container_stack.findContainer({"type": "quality"}) + if quality: + return quality.getName() + return "" @pyqtProperty(str, notify=activeQualityChanged) def activeQualityId(self): - quality = Application.getInstance().getGlobalContainerStack().findContainer({"type": "quality"}) - if quality: - return quality.getId() + if self._global_container_stack: + quality = self._global_container_stack.findContainer({"type": "quality"}) + if quality: + return quality.getId() + return "" @pyqtSlot(str) def setActiveMaterial(self, material_id): containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=material_id) - old_material = Application.getInstance().getGlobalContainerStack().findContainer({"type":"material"}) + if not containers or not self._global_container_stack: + return + + old_material = self._global_container_stack.findContainer({"type":"material"}) if old_material: - material_index = Application.getInstance().getGlobalContainerStack().getContainerIndex(old_material) - Application.getInstance().getGlobalContainerStack().replaceContainer(material_index, containers[0]) + material_index = self._global_container_stack.getContainerIndex(old_material) + self._global_container_stack.replaceContainer(material_index, containers[0]) @pyqtSlot(str) def setActiveVariant(self, variant_id): containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id=variant_id) - old_variant = Application.getInstance().getGlobalContainerStack().findContainer({"type": "variant"}) + if not containers or not self._global_container_stack: + return + + old_variant = self._global_container_stack.findContainer({"type": "variant"}) if old_variant: - variant_index = Application.getInstance().getGlobalContainerStack().getContainerIndex(old_variant) - Application.getInstance().getGlobalContainerStack().replaceContainer(variant_index, containers[0]) + variant_index = self._global_container_stack.getContainerIndex(old_variant) + self._global_container_stack.replaceContainer(variant_index, containers[0]) @pyqtSlot(str) def setActiveQuality(self, quality_id): containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = quality_id) - old_quality = Application.getInstance().getGlobalContainerStack().findContainer({"type": "quality"}) + if not containers or not self._global_container_stack: + return + + old_quality = self._global_container_stack.findContainer({"type": "quality"}) if old_quality: - quality_index = Application.getInstance().getGlobalContainerStack().getContainerIndex(old_quality) - Application.getInstance().getGlobalContainerStack().replaceContainer(quality_index, containers[0]) + quality_index = self._global_container_stack.getContainerIndex(old_quality) + self._global_container_stack.replaceContainer(quality_index, containers[0]) @pyqtProperty(str, notify = activeVariantChanged) def activeVariantName(self): - variant = Application.getInstance().getGlobalContainerStack().findContainer({"type": "variant"}) - if variant: - return variant.getName() + if self._global_container_stack: + variant = self._global_container_stack.findContainer({"type": "variant"}) + if variant: + return variant.getName() + + return "" @pyqtProperty(str, notify = activeVariantChanged) def activeVariantId(self): - variant = Application.getInstance().getGlobalContainerStack().findContainer({"type": "variant"}) - if variant: - return variant.getId() + if self._global_container_stack: + variant = self._global_container_stack.findContainer({"type": "variant"}) + if variant: + return variant.getId() + + return "" @pyqtProperty(str, notify = globalContainerChanged) def activeDefinitionId(self): - definition = Application.getInstance().getGlobalContainerStack().getBottom() - if definition: - return definition.id - return None + if self._global_container_stack: + definition = self._global_container_stack.getBottom() + if definition: + return definition.id + + return "" @pyqtSlot(str, str) def renameMachine(self, machine_id, new_name): @@ -193,17 +226,19 @@ class MachineManagerModel(QObject): def removeMachine(self, machine_id): UM.Settings.ContainerRegistry.getInstance().removeContainer(machine_id) - @pyqtProperty(bool) + @pyqtProperty(bool, notify = globalContainerChanged) def hasMaterials(self): - # Todo: Still hardcoded. - # We should implement this properly when it's clear how a machine notifies us if it can handle materials - return True + if self._global_container_stack: + return self._global_container_stack.getMetaDataEntry("has_materials", False) - @pyqtProperty(bool) + return False + + @pyqtProperty(bool, notify = globalContainerChanged) def hasVariants(self): - # Todo: Still hardcoded. - # We should implement this properly when it's clear how a machine notifies us if it can handle variants - return True + if self._global_container_stack: + return self._global_container_stack.getMetaDataEntry("has_variants", False) + + return False def createMachineManagerModel(engine, script_engine): return MachineManagerModel() From 396f023bdf7bbde07b9f8e74b553a560d0076dfd Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 May 2016 11:23:23 +0200 Subject: [PATCH 215/224] Account for global container stack being None in the backend plugin --- plugins/CuraEngineBackend/CuraEngineBackend.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index cc0d1b1600..e7fb946bb6 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -57,7 +57,8 @@ class CuraEngineBackend(Backend): #When any setting property changed, call the _onSettingChanged function. #This function will then see if we need to start slicing. - Application.getInstance().getGlobalContainerStack().propertyChanged.connect(self._onSettingChanged) + if Application.getInstance().getGlobalContainerStack(): + Application.getInstance().getGlobalContainerStack().propertyChanged.connect(self._onSettingChanged) #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. From 24210246eec01790fe668caf2a836d20460b766e Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 May 2016 11:23:49 +0200 Subject: [PATCH 216/224] Add preferred variant, material and quality to UM2+ definition --- resources/definitions/ultimaker2_plus.def.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json index 646b424c5c..9f68c2a16b 100644 --- a/resources/definitions/ultimaker2_plus.def.json +++ b/resources/definitions/ultimaker2_plus.def.json @@ -10,7 +10,10 @@ "category": "Ultimaker", "file_formats": "text/x-gcode", "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png" + "platform_texture": "Ultimaker2Plusbackplate.png", + "preferred_variant": "ultimaker2_plus_0.4", + "preferred_material": "pla", + "preferred_quality": "high" }, "overrides": { From a1d48fd51151a28760476f2dbd1b041bedf98b02 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 May 2016 11:25:03 +0200 Subject: [PATCH 217/224] When creating a new container stack, add empty containers for things where we cannot find containers Additionally, record this information in the metadata of the stack --- cura/MachineManagerModel.py | 39 +++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index eb92aa422e..8354f3a140 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -63,34 +63,52 @@ class MachineManagerModel(QObject): def addMachine(self,name, definition_id): definitions = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id=definition_id) if definitions: + definition = definitions[0] + new_global_stack = UM.Settings.ContainerStack(name) new_global_stack.addMetaDataEntry("type", "machine") UM.Settings.ContainerRegistry.getInstance().addContainer(new_global_stack) + empty_container = UM.Settings.ContainerRegistry.getInstance().getEmptyInstanceContainer() + + variants = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "variant", definition = definition.id) + if variants: + new_global_stack.addMetaDataEntry("has_variants", True) + + preferred_variant_id = definitions[0].getMetaDataEntry("preferred_variant") + variant_instance_container = empty_container + if preferred_variant_id: + preferred_variant_id = preferred_variant_id.lower() + container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = preferred_variant_id) + if container: + variant_instance_container = container[0] + + if variants and variant_instance_container == empty_container: + variant_instance_container = variants[0] + + materials = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "material", definition = definition.id) + if materials: + new_global_stack.addMetaDataEntry("has_materials", True) preferred_material_id = definitions[0].getMetaDataEntry("preferred_material") - material_instance_container = None + material_instance_container = empty_container if preferred_material_id: preferred_material_id = preferred_material_id.lower() container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = preferred_material_id) if container: material_instance_container = container[0] + if materials and material_instance_container == empty_container: + material_instance_container = materials[0] + preferred_quality_id = definitions[0].getMetaDataEntry("preferred_quality") - quality_instance_container = None + quality_instance_container = empty_container if preferred_quality_id: preferred_quality_id = preferred_quality_id.lower() container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = preferred_quality_id) if container: quality_instance_container = container[0] - ## DEBUG CODE - variant_instance_container = UM.Settings.InstanceContainer("test_variant") - variant_instance_container.addMetaDataEntry("type", "variant") - variant_instance_container.setDefinition(definitions[0]) - - UM.Settings.ContainerRegistry.getInstance().addContainer(variant_instance_container) - current_settings_instance_container = UM.Settings.InstanceContainer(name + "_current_settings") current_settings_instance_container.addMetaDataEntry("machine", name) current_settings_instance_container.addMetaDataEntry("type", "user") @@ -99,9 +117,10 @@ class MachineManagerModel(QObject): # If a definition is found, its a list. Should only have one item. new_global_stack.addContainer(definitions[0]) + if variant_instance_container: + new_global_stack.addContainer(variant_instance_container) if material_instance_container: new_global_stack.addContainer(material_instance_container) - new_global_stack.addContainer(variant_instance_container) if quality_instance_container: new_global_stack.addContainer(quality_instance_container) new_global_stack.addContainer(current_settings_instance_container) From e29cc5e699d70476936f652710964935d9d92025 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 May 2016 11:26:19 +0200 Subject: [PATCH 218/224] Create machine-specific material containers for machine specific overrides in XML material files --- .../XmlMaterialProfile/XmlMaterialProfile.py | 67 ++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 5566301a09..50c39238fd 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -2,10 +2,16 @@ # Cura is released under the terms of the AGPLv3 or higher. import math +import copy import xml.etree.ElementTree as ET +from UM.Logger import Logger + import UM.Settings +# The namespace is prepended to the tag name but between {}. +# We are only interested in the actual tag name, so discard everything +# before the last } def _tag_without_namespace(element): return element.tag[element.tag.rfind("}") + 1:] @@ -17,7 +23,6 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): raise NotImplementedError("Writing material profiles has not yet been implemented") def deserialize(self, serialized): - print("deserialize material profile") data = ET.fromstring(serialized) self.addMetaDataEntry("type", "material") @@ -27,9 +32,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): metadata = data.iterfind("./um:metadata/*", self.__namespaces) for entry in metadata: - # The namespace is prepended to the tag name but between {}. - # We are only interested in the actual tag name. - tag_name = entry.tag[entry.tag.rfind("}") + 1:] + tag_name = _tag_without_namespace(entry) if tag_name == "name": brand = entry.find("./um:brand", self.__namespaces) @@ -47,7 +50,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): property_values = {} properties = data.iterfind("./um:properties/*", self.__namespaces) for entry in properties: - tag_name = entry.tag[entry.tag.rfind("}") + 1:] + tag_name = _tag_without_namespace(entry) property_values[tag_name] = entry.text diameter = float(property_values.get("diameter", 2.85)) # In mm @@ -66,12 +69,50 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): self.addMetaDataEntry("properties", property_values) + global_setting_values = {} settings = data.iterfind("./um:settings/um:setting", self.__namespaces) for entry in settings: - tag_name = _tag_without_namespace(entry) + key = entry.get("key") + if key in self.__material_property_setting_map: + self.setProperty(self.__material_property_setting_map[key], "value", entry.text, self._definition) + global_setting_values[key] = entry.text + + machines = data.iterfind("./um:settings/um:machine", self.__namespaces) + for machine in machines: + machine_setting_values = {} + settings = machine.iterfind("./um:setting", self.__namespaces) + for entry in settings: + key = entry.get("key") + if key in self.__material_property_setting_map: + machine_setting_values[self.__material_property_setting_map[key]] = entry.text + + identifiers = machine.iterfind("./um:machine_identifier", self.__namespaces) + for identifier in identifiers: + machine_id = self.__product_id_map.get(identifier.get("product"), None) + if machine_id is None: + Logger.log("w", "Cannot create material for unknown machine %s", machine_id) + continue + + definitions = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) + if not definitions: + Logger.log("w", "No definition found for machine ID %s", machine_id) + continue + + new_material = XmlMaterialProfile(self.id + "_" + machine_id) + new_material.setName(self.getName()) + new_material.setMetaData(self.getMetaData()) + new_material.setDefinition(definitions[0]) + + for key, value in global_setting_values.items(): + new_material.setProperty(key, "value", value, definitions[0]) + + for key, value in machine_setting_values.items(): + new_material.setProperty(key, "value", value, definitions[0]) + + new_material._dirty = False + + UM.Settings.ContainerRegistry.getInstance().addContainer(new_material) - if tag_name in self.__material_property_setting_map: - self.setProperty(self.__material_property_setting_map[tag_name], "value", entry.text) __material_property_setting_map = { "print temperature": "material_print_temperature", @@ -79,6 +120,16 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): "standby temperature": "material_standby_temperature", } + __product_id_map = { + "Ultimaker2": "ultimaker2", + "Ultimaker2+": "ultimaker2_plus", + "Ultimaker2go": "ultimaker2_go", + "Ultimaker2extended": "ultimaker2_extended", + "Ultimaker2extended+": "ultimaker2_extended_plus", + "Ultimaker Original": "ultimaker_original", + "Ultimaker Original+": "ultimaker_original_plus" + } + __namespaces = { "um": "http://www.ultimaker.com/material" } From 2654033fae9847f5c321a8a93379433039085825 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 May 2016 11:26:51 +0200 Subject: [PATCH 219/224] Show the add machine dialog when we do not have an active machine --- resources/qml/Cura.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 52a8498f5e..42098e9883 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -813,9 +813,8 @@ UM.MainWindow base.visible = true; restart(); } - else if(Cura.MachineManager.activeMachineName == "") + else if(Cura.MachineManager.activeMachineId == null || Cura.MachineManager.activeMachineId == "") { - addMachineDialog.firstRun = true; addMachineDialog.open(); } } From b2a8810d04cc927c9fb7dab05b5b3f1abfd83945 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 May 2016 11:28:29 +0200 Subject: [PATCH 220/224] Filter available materials by the machine definition Since we now have some machine-specific materials --- resources/qml/Preferences/MaterialsPage.qml | 2 +- resources/qml/SidebarHeader.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index f1f3432a41..4ebe281c08 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -13,7 +13,7 @@ UM.ManagementPage title: catalog.i18nc("@title:tab", "Materials"); - model: UM.InstanceContainersModel { filter: { "type": "material" } } + model: UM.InstanceContainersModel { filter: { "type": "material", "definition": Cura.MachineManager.activeDefinitionId } } /* onAddObject: { var selectedMaterial = UM.MaterialManager.createProfile(); base.selectMaterial(selectedMaterial); } onRemoveObject: confirmDialog.open(); diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 5284178ba7..d8bc4291bb 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -197,7 +197,7 @@ Item id: materialSelectionInstantiator model: UM.InstanceContainersModel { - filter: {"type": "material"} + filter: { "type": "material", "definition": Cura.MachineManager.activeDefinitionId } } MenuItem { From 81d0b34f202e19adac3dd23586a8abe15e851a20 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 May 2016 11:28:53 +0200 Subject: [PATCH 221/224] Update example XML material to use the right product names --- resources/materials/generic_pla.xml.fdm_material | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/resources/materials/generic_pla.xml.fdm_material b/resources/materials/generic_pla.xml.fdm_material index b64ecdc61b..a4fe02c195 100644 --- a/resources/materials/generic_pla.xml.fdm_material +++ b/resources/materials/generic_pla.xml.fdm_material @@ -16,7 +16,6 @@ Generic PLA profile. Serves as an example file, data in this file is not correct 1.3 2.85 - 750 210 @@ -24,9 +23,8 @@ Generic PLA profile. Serves as an example file, data in this file is not correct 175 - - - + + 150 @@ -36,6 +34,7 @@ Generic PLA profile. Serves as an example file, data in this file is not correct + 150 80 From ab0d34d9acd4de2673a76327fa849d6a9ec2df3b Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 May 2016 11:29:15 +0200 Subject: [PATCH 222/224] Add layer height to high quality profile so we have something that changes --- resources/quality/high.inst.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/quality/high.inst.cfg b/resources/quality/high.inst.cfg index 89dcd4c9bc..0329e9ffe1 100644 --- a/resources/quality/high.inst.cfg +++ b/resources/quality/high.inst.cfg @@ -7,3 +7,4 @@ definition = fdmprinter type = quality [values] +layer_height = 0.06 From 9bb4917ae74b3d6d129e7e215976964dffa6f749 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 25 May 2016 11:30:47 +0200 Subject: [PATCH 223/224] Import Cura in materials preferences page so we can use the active definition id --- resources/qml/Preferences/MaterialsPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index 4ebe281c08..03ede39a5c 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -6,6 +6,7 @@ import QtQuick.Controls 1.1 import QtQuick.Dialogs 1.2 import UM 1.2 as UM +import Cura 1.0 as Cura UM.ManagementPage { From 6522aae915cccb2c2b4c82635dd99377783e326c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 25 May 2016 11:50:58 +0200 Subject: [PATCH 224/224] Improve slice trigger documentation Contributes to issue CURA-1278. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index e7fb946bb6..aa42a08393 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -55,10 +55,9 @@ class CuraEngineBackend(Backend): self._onActiveViewChanged() self._stored_layer_data = [] - #When any setting property changed, call the _onSettingChanged function. - #This function will then see if we need to start slicing. + #Triggers for when to (re)start slicing: if Application.getInstance().getGlobalContainerStack(): - Application.getInstance().getGlobalContainerStack().propertyChanged.connect(self._onSettingChanged) + Application.getInstance().getGlobalContainerStack().propertyChanged.connect(self._onSettingChanged) #Note: Only starts slicing when the value changed. #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.