From 88cdd34dfeb87fb2ad991972d12dbaf6918bb44c Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 24 Jul 2020 12:03:28 +0200 Subject: [PATCH 01/47] Remove all references to Wall Compensation from the resources/ CURA-7559 --- resources/definitions/anet3d.def.json | 1 - resources/definitions/creality_base.def.json | 1 - resources/definitions/cubicon_common.def.json | 3 -- resources/definitions/fdmprinter.def.json | 35 +------------------ .../definitions/flyingbear_base.def.json | 1 - resources/definitions/hms434.def.json | 1 - resources/definitions/peopoly_moai.def.json | 9 ----- resources/definitions/skriware_2.def.json | 9 ----- resources/definitions/tronxy_x.def.json | 1 - ...Pro_brass0.4_abs_natural_standard.inst.cfg | 3 -- ...o_nozzlex0.4_abs_natural_standard.inst.cfg | 3 -- ...ro_brass0.4_epla_natural_standard.inst.cfg | 3 -- ..._nozzlex0.4_epla_natural_standard.inst.cfg | 3 -- ...Pro_brass0.4_pva_natural_standard.inst.cfg | 3 -- ...o_nozzlex0.4_pva_natural_standard.inst.cfg | 3 -- .../abs/cartesio_0.25_abs_high.inst.cfg | 1 - .../abs/cartesio_0.25_abs_normal.inst.cfg | 1 - .../abs/cartesio_0.4_abs_high.inst.cfg | 1 - .../abs/cartesio_0.4_abs_normal.inst.cfg | 1 - .../abs/cartesio_0.8_abs_coarse.inst.cfg | 1 - .../cartesio_0.8_abs_extra_coarse.inst.cfg | 1 - .../abs/cartesio_0.8_abs_high.inst.cfg | 1 - .../abs/cartesio_0.8_abs_normal.inst.cfg | 1 - .../cartesio_0.4_arnitel2045_high.inst.cfg | 1 - .../cartesio_0.4_arnitel2045_normal.inst.cfg | 1 - .../hips/cartesio_0.25_hips_high.inst.cfg | 1 - .../hips/cartesio_0.25_hips_normal.inst.cfg | 1 - .../hips/cartesio_0.4_hips_high.inst.cfg | 1 - .../hips/cartesio_0.4_hips_normal.inst.cfg | 1 - .../hips/cartesio_0.8_hips_coarse.inst.cfg | 1 - .../cartesio_0.8_hips_extra_coarse.inst.cfg | 1 - .../hips/cartesio_0.8_hips_high.inst.cfg | 1 - .../hips/cartesio_0.8_hips_normal.inst.cfg | 1 - .../nylon/cartesio_0.25_nylon_high.inst.cfg | 1 - .../nylon/cartesio_0.25_nylon_normal.inst.cfg | 1 - .../nylon/cartesio_0.4_nylon_high.inst.cfg | 1 - .../nylon/cartesio_0.4_nylon_normal.inst.cfg | 1 - .../nylon/cartesio_0.8_nylon_coarse.inst.cfg | 1 - .../cartesio_0.8_nylon_extra_coarse.inst.cfg | 1 - .../nylon/cartesio_0.8_nylon_high.inst.cfg | 1 - .../nylon/cartesio_0.8_nylon_normal.inst.cfg | 1 - .../pc/cartesio_0.25_pc_high.inst.cfg | 1 - .../pc/cartesio_0.25_pc_normal.inst.cfg | 1 - .../cartesio/pc/cartesio_0.4_pc_high.inst.cfg | 1 - .../pc/cartesio_0.4_pc_normal.inst.cfg | 1 - .../pc/cartesio_0.8_pc_coarse.inst.cfg | 1 - .../pc/cartesio_0.8_pc_extra_coarse.inst.cfg | 1 - .../cartesio/pc/cartesio_0.8_pc_high.inst.cfg | 1 - .../pc/cartesio_0.8_pc_normal.inst.cfg | 1 - .../petg/cartesio_0.25_petg_high.inst.cfg | 1 - .../petg/cartesio_0.25_petg_normal.inst.cfg | 1 - .../petg/cartesio_0.4_petg_high.inst.cfg | 1 - .../petg/cartesio_0.4_petg_normal.inst.cfg | 1 - .../petg/cartesio_0.8_petg_coarse.inst.cfg | 1 - .../cartesio_0.8_petg_extra_coarse.inst.cfg | 1 - .../petg/cartesio_0.8_petg_high.inst.cfg | 1 - .../petg/cartesio_0.8_petg_normal.inst.cfg | 1 - .../pla/cartesio_0.25_pla_high.inst.cfg | 1 - .../pla/cartesio_0.25_pla_normal.inst.cfg | 1 - .../pla/cartesio_0.4_pla_high.inst.cfg | 1 - .../pla/cartesio_0.4_pla_normal.inst.cfg | 1 - .../pla/cartesio_0.8_pla_coarse.inst.cfg | 1 - .../cartesio_0.8_pla_extra_coarse.inst.cfg | 1 - .../pla/cartesio_0.8_pla_high.inst.cfg | 1 - .../pla/cartesio_0.8_pla_normal.inst.cfg | 1 - .../pva/cartesio_0.25_pva_high.inst.cfg | 1 - .../pva/cartesio_0.25_pva_normal.inst.cfg | 1 - .../pva/cartesio_0.4_pva_high.inst.cfg | 1 - .../pva/cartesio_0.4_pva_normal.inst.cfg | 1 - .../pva/cartesio_0.8_pva_coarse.inst.cfg | 1 - .../cartesio_0.8_pva_extra_coarse.inst.cfg | 1 - .../pva/cartesio_0.8_pva_high.inst.cfg | 1 - .../pva/cartesio_0.8_pva_normal.inst.cfg | 1 - .../imade3d_jellybox_coarse.inst.cfg | 2 -- .../imade3d_jellybox_fine.inst.cfg | 2 -- .../imade3d_jellybox_normal.inst.cfg | 2 -- .../imade3d_jellybox_ultrafine.inst.cfg | 2 -- .../jb2_global_coarse.inst.cfg | 2 -- .../jb2_global_fine.inst.cfg | 2 -- .../jb2_global_normal.inst.cfg | 2 -- .../jb2_global_ultrafine.inst.cfg | 2 -- .../quality/key3d/key3d_tyro_best.inst.cfg | 3 -- .../quality/key3d/key3d_tyro_fast.inst.cfg | 3 -- .../quality/key3d/key3d_tyro_normal.inst.cfg | 3 -- .../quality/nwa3d_a31/nwa3d_a31_best.inst.cfg | 3 -- .../quality/nwa3d_a31/nwa3d_a31_e.inst.cfg | 3 -- .../quality/nwa3d_a31/nwa3d_a31_fast.inst.cfg | 3 -- .../nwa3d_a31/nwa3d_a31_normal.inst.cfg | 3 -- .../quality/nwa3d_a5/nwa3d_a5_best.inst.cfg | 3 -- .../quality/nwa3d_a5/nwa3d_a5_fast.inst.cfg | 3 -- .../quality/nwa3d_a5/nwa3d_a5_normal.inst.cfg | 3 -- .../um3_aa0.8_PP_Draft_Print.inst.cfg | 1 - .../um3_aa0.8_PP_Superdraft_Print.inst.cfg | 1 - .../um3_aa0.8_PP_Verydraft_Print.inst.cfg | 1 - .../um3_aa0.8_TPU_Draft_Print.inst.cfg | 1 - .../um3_aa0.8_TPU_Superdraft_Print.inst.cfg | 1 - .../um3_aa0.8_TPU_Verydraft_Print.inst.cfg | 1 - .../um_s3_aa0.8_PP_Draft_Print.inst.cfg | 1 - .../um_s3_aa0.8_PP_Superdraft_Print.inst.cfg | 1 - .../um_s3_aa0.8_PP_Verydraft_Print.inst.cfg | 1 - .../um_s3_aa0.8_TPU_Draft_Print.inst.cfg | 1 - .../um_s3_aa0.8_TPU_Superdraft_Print.inst.cfg | 1 - .../um_s3_aa0.8_TPU_Verydraft_Print.inst.cfg | 1 - .../um_s5_aa0.8_PP_Draft_Print.inst.cfg | 1 - .../um_s5_aa0.8_PP_Verydraft_Print.inst.cfg | 1 - .../um_s5_aa0.8_TPU_Draft_Print.inst.cfg | 1 - .../um_s5_aa0.8_TPU_Superdraft_Print.inst.cfg | 1 - .../um_s5_aa0.8_TPU_Verydraft_Print.inst.cfg | 1 - resources/setting_visibility/expert.cfg | 3 -- 109 files changed, 1 insertion(+), 202 deletions(-) diff --git a/resources/definitions/anet3d.def.json b/resources/definitions/anet3d.def.json index 990be55463..9ffffcb509 100644 --- a/resources/definitions/anet3d.def.json +++ b/resources/definitions/anet3d.def.json @@ -74,7 +74,6 @@ "material_initial_print_temperature": { "value": "material_print_temperature" }, "material_final_print_temperature": { "value": "material_print_temperature" }, "material_flow": { "value": 100 }, - "travel_compensate_overlapping_walls_0_enabled": { "value": "False" }, "z_seam_type": { "value": "'back'" }, "z_seam_corner": { "value": "'z_seam_corner_weighted'" }, diff --git a/resources/definitions/creality_base.def.json b/resources/definitions/creality_base.def.json index 3ae84f8e6d..144b45b82d 100644 --- a/resources/definitions/creality_base.def.json +++ b/resources/definitions/creality_base.def.json @@ -183,7 +183,6 @@ "material_initial_print_temperature": { "value": "material_print_temperature" }, "material_final_print_temperature": { "value": "material_print_temperature" }, "material_flow": { "value": 100 }, - "travel_compensate_overlapping_walls_0_enabled": { "value": "False" }, "z_seam_type": { "value": "'back'" }, "z_seam_corner": { "value": "'z_seam_corner_weighted'" }, diff --git a/resources/definitions/cubicon_common.def.json b/resources/definitions/cubicon_common.def.json index 61e684a283..45491b943c 100644 --- a/resources/definitions/cubicon_common.def.json +++ b/resources/definitions/cubicon_common.def.json @@ -20,9 +20,6 @@ "machine_heated_bed": { "default_value": true }, - "travel_compensate_overlapping_walls_enabled": { - "default_value": false - }, "layer_height": { "default_value": 0.2 }, diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8e949a42b6..4609b3b80a 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1283,38 +1283,6 @@ "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, - "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, - "limit_to_extruder": "wall_x_extruder_nr", - "settable_per_mesh": true, - "children": - { - "travel_compensate_overlapping_walls_0_enabled": - { - "label": "Compensate Outer Wall Overlaps", - "description": "Compensate the flow for parts of an outer wall being printed where there is already a wall in place.", - "type": "bool", - "default_value": true, - "value": "travel_compensate_overlapping_walls_enabled", - "limit_to_extruder": "wall_0_extruder_nr", - "settable_per_mesh": true - }, - "travel_compensate_overlapping_walls_x_enabled": - { - "label": "Compensate Inner Wall Overlaps", - "description": "Compensate the flow for parts of an inner wall being printed where there is already a wall in place.", - "type": "bool", - "default_value": true, - "value": "travel_compensate_overlapping_walls_enabled", - "limit_to_extruder": "wall_x_extruder_nr", - "settable_per_mesh": true - } - } - }, "wall_min_flow": { "label": "Minimum Wall Flow", @@ -1324,7 +1292,6 @@ "maximum_value": "100", "default_value": 0, "type": "float", - "enabled": "travel_compensate_overlapping_walls_0_enabled or travel_compensate_overlapping_walls_x_enabled", "settable_per_mesh": true }, "wall_min_flow_retract": @@ -1333,7 +1300,7 @@ "description": "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold.", "type": "bool", "default_value": false, - "enabled": "(travel_compensate_overlapping_walls_0_enabled or travel_compensate_overlapping_walls_x_enabled) and wall_min_flow > 0", + "enabled": "wall_min_flow > 0", "settable_per_mesh": true }, "fill_perimeter_gaps": diff --git a/resources/definitions/flyingbear_base.def.json b/resources/definitions/flyingbear_base.def.json index 3a008fab5e..842af19217 100644 --- a/resources/definitions/flyingbear_base.def.json +++ b/resources/definitions/flyingbear_base.def.json @@ -48,7 +48,6 @@ "wall_0_wipe_dist": { "value": 0.0 }, "top_bottom_thickness": { "value": "layer_height_0 + layer_height * 3 if layer_height > 0.15 else 0.8" }, "optimize_wall_printing_order": { "value": true }, - "travel_compensate_overlapping_walls_0_enabled": { "value": false }, "fill_perimeter_gaps": { "value": "'everywhere'" }, "filter_out_tiny_gaps": { "value": false }, "fill_outline_gaps": { "value": false }, diff --git a/resources/definitions/hms434.def.json b/resources/definitions/hms434.def.json index 8d70b065c7..b85e9e6d0a 100644 --- a/resources/definitions/hms434.def.json +++ b/resources/definitions/hms434.def.json @@ -91,7 +91,6 @@ "wall_0_inset": {"value": "0" }, "outer_inset_first": {"value": true }, "alternate_extra_perimeter": {"value": false }, - "travel_compensate_overlapping_walls_enabled": {"value": false }, "filter_out_tiny_gaps": {"value": true }, "fill_outline_gaps": {"value": true }, "z_seam_type": {"value": "'shortest'"}, diff --git a/resources/definitions/peopoly_moai.def.json b/resources/definitions/peopoly_moai.def.json index e19fed8b4d..7ca7d67466 100644 --- a/resources/definitions/peopoly_moai.def.json +++ b/resources/definitions/peopoly_moai.def.json @@ -176,15 +176,6 @@ "skin_outline_count": { "value": 0 }, - "travel_compensate_overlapping_walls_enabled": { - "value": "False" - }, - "travel_compensate_overlapping_walls_0_enabled": { - "value": "False" - }, - "travel_compensate_overlapping_walls_x_enabled": { - "value": "False" - }, "wall_0_wipe_dist": { "value": "machine_nozzle_size / 3" }, diff --git a/resources/definitions/skriware_2.def.json b/resources/definitions/skriware_2.def.json index 2554689be4..88f4e3eecf 100644 --- a/resources/definitions/skriware_2.def.json +++ b/resources/definitions/skriware_2.def.json @@ -107,9 +107,6 @@ "switch_extruder_retraction_speed": { "value": "30" }, - "travel_compensate_overlapping_walls_enabled": { - "default_value": false - }, "raft_base_acceleration": { "value": "400" }, @@ -383,9 +380,6 @@ "acceleration_support_infill": { "value": "400" }, - "travel_compensate_overlapping_walls_0_enabled": { - "value": "False" - }, "support_bottom_material_flow": { "value": "99" }, @@ -638,9 +632,6 @@ "skirt_line_count": { "default_value": 2 }, - "travel_compensate_overlapping_walls_x_enabled": { - "value": "False" - }, "jerk_wall_0": { "value": "10" }, diff --git a/resources/definitions/tronxy_x.def.json b/resources/definitions/tronxy_x.def.json index f638148112..5cf8b02766 100644 --- a/resources/definitions/tronxy_x.def.json +++ b/resources/definitions/tronxy_x.def.json @@ -83,7 +83,6 @@ "material_initial_print_temperature": { "value": "material_print_temperature" }, "material_final_print_temperature": { "value": "material_print_temperature" }, "material_flow": { "value": 100 }, - "travel_compensate_overlapping_walls_0_enabled": { "value": "False" }, "z_seam_type": { "value": "'back'" }, "z_seam_corner": { "value": "'z_seam_corner_weighted'" }, diff --git a/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_brass0.4_abs_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_brass0.4_abs_natural_standard.inst.cfg index 78f78fbd1c..ee818af4f2 100644 --- a/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_brass0.4_abs_natural_standard.inst.cfg +++ b/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_brass0.4_abs_natural_standard.inst.cfg @@ -21,9 +21,6 @@ wall_0_wipe_dist = 0.2 top_bottom_thickness = 0.8 top_bottom_pattern = lines optimize_wall_printing_order = True -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True z_seam_type = sharpest_corner diff --git a/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_nozzlex0.4_abs_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_nozzlex0.4_abs_natural_standard.inst.cfg index 5e37abb931..dedc528dfd 100644 --- a/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_nozzlex0.4_abs_natural_standard.inst.cfg +++ b/resources/quality/Leapfrog_Bolt_Pro/abs/Leapfrog_Bolt_Pro_nozzlex0.4_abs_natural_standard.inst.cfg @@ -21,9 +21,6 @@ wall_0_wipe_dist = 0.2 top_bottom_thickness = 0.8 top_bottom_pattern = lines optimize_wall_printing_order = True -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True z_seam_type = sharpest_corner diff --git a/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_brass0.4_epla_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_brass0.4_epla_natural_standard.inst.cfg index 453fcaba7a..6924e3587c 100644 --- a/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_brass0.4_epla_natural_standard.inst.cfg +++ b/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_brass0.4_epla_natural_standard.inst.cfg @@ -21,9 +21,6 @@ wall_0_wipe_dist = 0.2 top_bottom_thickness = 0.8 top_bottom_pattern = lines optimize_wall_printing_order = True -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True z_seam_type = sharpest_corner diff --git a/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_nozzlex0.4_epla_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_nozzlex0.4_epla_natural_standard.inst.cfg index bf90450fff..f7292ba955 100644 --- a/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_nozzlex0.4_epla_natural_standard.inst.cfg +++ b/resources/quality/Leapfrog_Bolt_Pro/epla/Leapfrog_Bolt_Pro_nozzlex0.4_epla_natural_standard.inst.cfg @@ -21,9 +21,6 @@ wall_0_wipe_dist = 0.2 top_bottom_thickness = 0.8 top_bottom_pattern = lines optimize_wall_printing_order = True -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True z_seam_type = sharpest_corner diff --git a/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_brass0.4_pva_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_brass0.4_pva_natural_standard.inst.cfg index 3b5a94b1b0..e254ccebff 100644 --- a/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_brass0.4_pva_natural_standard.inst.cfg +++ b/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_brass0.4_pva_natural_standard.inst.cfg @@ -21,9 +21,6 @@ wall_0_wipe_dist = 0.2 top_bottom_thickness = 0.8 top_bottom_pattern = lines optimize_wall_printing_order = True -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True z_seam_type = sharpest_corner diff --git a/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_nozzlex0.4_pva_natural_standard.inst.cfg b/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_nozzlex0.4_pva_natural_standard.inst.cfg index 9502684f44..57687b1984 100644 --- a/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_nozzlex0.4_pva_natural_standard.inst.cfg +++ b/resources/quality/Leapfrog_Bolt_Pro/pva/Leapfrog_Bolt_Pro_nozzlex0.4_pva_natural_standard.inst.cfg @@ -21,9 +21,6 @@ wall_0_wipe_dist = 0.2 top_bottom_thickness = 0.8 top_bottom_pattern = lines optimize_wall_printing_order = True -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True z_seam_type = sharpest_corner diff --git a/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg index 6d1c8dbe20..dc4bc83883 100644 --- a/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg index ce0dae0971..2fb539284c 100644 --- a/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg index 0043dec676..eca311990b 100644 --- a/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg index 2aa4308a99..3a8ff0482c 100644 --- a/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg index 028c7a7036..703bc514d9 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg index b348ec6a9e..70658bad9f 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg index a7d745b9b5..3d83921ac3 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg index 479dfeb0cc..50db49e6bb 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg index 9eb8268cb2..1bbd2d6632 100644 --- a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg +++ b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg index 7a1402c3cd..3191c29469 100644 --- a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg +++ b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg index 4cac7b420e..2b37bf77ce 100644 --- a/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg index 89b6cad2d7..18a4ab1ec9 100644 --- a/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg index 48ed7e7ffe..e65cd8f1a1 100644 --- a/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg index 3c7d41c6f9..1dbf9a5b26 100644 --- a/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg index e358c85814..f48cdbff42 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg index 6b2c99b8ad..3a8076acde 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg index 33522d05af..63ce8d6901 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg index ee44c7237b..cb9334b3e6 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg index 450c8d3e2c..a8d3cb5501 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg index 1687bb4a09..fd4b81ee4e 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg index f6dc41665b..cbfca48757 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg index 8832b3a26c..b182043355 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg index 5cf983bc29..d250d092e4 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg index 784e1df185..4139abdb07 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg index c51c83526b..8e47b3f54c 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg index 2475e48b56..a62635edca 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg index 75f147283d..351447a503 100644 --- a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg index af2989c43e..d54e912019 100644 --- a/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg index cf9dfd5079..625ae11fa1 100644 --- a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg index aa03812d16..3c65ec0c41 100644 --- a/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg index 6dcd21c4f3..02a4568e01 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg index a2c7b823d1..228cc45591 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg index 1d00c54968..1f5b3523e8 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg index 4ded0ada0a..621f847f37 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg index 6b27ba11c5..0b375fade8 100644 --- a/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg index aa1e1a13d1..1f436caf05 100644 --- a/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg index cbf67082d7..03f2b2c577 100644 --- a/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg index 7d3e078dd2..a80ed9ebe2 100644 --- a/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg index 8dad25017b..74a3185bb0 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg index f82bbaed2a..c038ec9bde 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg index 361ae4253a..91dd16f010 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 50 infill_pattern = grid diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg index ad8d5f37cf..5683686c6e 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg index 7f91bc6596..74fc97caf2 100644 --- a/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg index 3b48dc775e..29245f2397 100644 --- a/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg index 81410a32ea..bbfe7c82a3 100644 --- a/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg index e32b3acf66..a44d13b96f 100644 --- a/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg index 9ebd20fc0b..a7794b3621 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg index 5f493eb2a0..524e82f5fd 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg index eb1c040901..bd3924c020 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg index a06a846d69..83e6a47349 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg index 819ad6b9d3..c4a3f1ea83 100644 --- a/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg index a081117433..42c569db88 100644 --- a/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg index 4947d9fe28..660567c7e0 100644 --- a/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg index c4abf0eda8..d1f1f9231b 100644 --- a/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 1.2 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg index 054acd964c..bd03160e4d 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg index 9a6c09173d..2e2be1c37c 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = =layer_height * 3 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg index 3ea322082e..895e4e9a8d 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg index c496980fe6..6e05158cae 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg @@ -18,7 +18,6 @@ wall_thickness = 2.4 top_bottom_thickness = 0.8 wall_0_inset = -0.05 fill_perimeter_gaps = nowhere -travel_compensate_overlapping_walls_enabled = infill_sparse_density = 40 infill_pattern = grid diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg index bc45b725b7..6b989ab34e 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg @@ -63,8 +63,6 @@ support_use_towers = False support_xy_distance = 0.8 support_xy_distance_overhang = =machine_nozzle_size / 2 support_z_distance = 0.2 -travel_compensate_overlapping_walls_0_enabled = =travel_compensate_overlapping_walls_enabled -travel_compensate_overlapping_walls_x_enabled = =travel_compensate_overlapping_walls_enabled travel_retract_before_outer_wall = True wall_0_wipe_dist = =round(line_width * 1.2,1) bridge_settings_enabled = True diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg index e5daa511b5..004993a759 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg @@ -63,8 +63,6 @@ support_use_towers = False support_xy_distance = 0.8 support_xy_distance_overhang = =machine_nozzle_size / 2 support_z_distance = 0.2 -travel_compensate_overlapping_walls_0_enabled = =travel_compensate_overlapping_walls_enabled -travel_compensate_overlapping_walls_x_enabled = =travel_compensate_overlapping_walls_enabled travel_retract_before_outer_wall = True wall_0_wipe_dist = =round(line_width * 1.2,1) bridge_settings_enabled = True diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg index be97c513a2..a7c23d7235 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg @@ -63,8 +63,6 @@ support_use_towers = False support_xy_distance = 0.8 support_xy_distance_overhang = =machine_nozzle_size / 2 support_z_distance = 0.2 -travel_compensate_overlapping_walls_0_enabled = =travel_compensate_overlapping_walls_enabled -travel_compensate_overlapping_walls_x_enabled = =travel_compensate_overlapping_walls_enabled travel_retract_before_outer_wall = True wall_0_wipe_dist = =round(line_width * 1.2,1) bridge_settings_enabled = True diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg index cd1774a460..7c28ec29d4 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg @@ -63,8 +63,6 @@ support_use_towers = False support_xy_distance = 0.8 support_xy_distance_overhang = =machine_nozzle_size / 2 support_z_distance = 0.2 -travel_compensate_overlapping_walls_0_enabled = =travel_compensate_overlapping_walls_enabled -travel_compensate_overlapping_walls_x_enabled = =travel_compensate_overlapping_walls_enabled travel_retract_before_outer_wall = True wall_0_wipe_dist = =round(line_width * 1.2,1) bridge_settings_enabled = True diff --git a/resources/quality/imade3d_jellybox_2/jb2_global_coarse.inst.cfg b/resources/quality/imade3d_jellybox_2/jb2_global_coarse.inst.cfg index 52297ec9f3..db7946d9aa 100644 --- a/resources/quality/imade3d_jellybox_2/jb2_global_coarse.inst.cfg +++ b/resources/quality/imade3d_jellybox_2/jb2_global_coarse.inst.cfg @@ -63,8 +63,6 @@ support_use_towers = False support_xy_distance = 0.8 support_xy_distance_overhang = =machine_nozzle_size / 2 support_z_distance = 0.2 -travel_compensate_overlapping_walls_0_enabled = =travel_compensate_overlapping_walls_enabled -travel_compensate_overlapping_walls_x_enabled = =travel_compensate_overlapping_walls_enabled travel_retract_before_outer_wall = True wall_0_wipe_dist = =round(line_width * 1.2,1) bridge_settings_enabled = True diff --git a/resources/quality/imade3d_jellybox_2/jb2_global_fine.inst.cfg b/resources/quality/imade3d_jellybox_2/jb2_global_fine.inst.cfg index d5628ccb59..b6a6de34ab 100644 --- a/resources/quality/imade3d_jellybox_2/jb2_global_fine.inst.cfg +++ b/resources/quality/imade3d_jellybox_2/jb2_global_fine.inst.cfg @@ -63,8 +63,6 @@ support_use_towers = False support_xy_distance = 0.8 support_xy_distance_overhang = =machine_nozzle_size / 2 support_z_distance = 0.2 -travel_compensate_overlapping_walls_0_enabled = =travel_compensate_overlapping_walls_enabled -travel_compensate_overlapping_walls_x_enabled = =travel_compensate_overlapping_walls_enabled travel_retract_before_outer_wall = True wall_0_wipe_dist = =round(line_width * 1.2,1) bridge_settings_enabled = True diff --git a/resources/quality/imade3d_jellybox_2/jb2_global_normal.inst.cfg b/resources/quality/imade3d_jellybox_2/jb2_global_normal.inst.cfg index aa1d8b1a13..380b314a6e 100644 --- a/resources/quality/imade3d_jellybox_2/jb2_global_normal.inst.cfg +++ b/resources/quality/imade3d_jellybox_2/jb2_global_normal.inst.cfg @@ -63,8 +63,6 @@ support_use_towers = False support_xy_distance = 0.8 support_xy_distance_overhang = =machine_nozzle_size / 2 support_z_distance = 0.2 -travel_compensate_overlapping_walls_0_enabled = =travel_compensate_overlapping_walls_enabled -travel_compensate_overlapping_walls_x_enabled = =travel_compensate_overlapping_walls_enabled travel_retract_before_outer_wall = True wall_0_wipe_dist = =round(line_width * 1.2,1) bridge_settings_enabled = True diff --git a/resources/quality/imade3d_jellybox_2/jb2_global_ultrafine.inst.cfg b/resources/quality/imade3d_jellybox_2/jb2_global_ultrafine.inst.cfg index e632572a32..bcb6359cc9 100644 --- a/resources/quality/imade3d_jellybox_2/jb2_global_ultrafine.inst.cfg +++ b/resources/quality/imade3d_jellybox_2/jb2_global_ultrafine.inst.cfg @@ -63,8 +63,6 @@ support_use_towers = False support_xy_distance = 0.8 support_xy_distance_overhang = =machine_nozzle_size / 2 support_z_distance = 0.2 -travel_compensate_overlapping_walls_0_enabled = =travel_compensate_overlapping_walls_enabled -travel_compensate_overlapping_walls_x_enabled = =travel_compensate_overlapping_walls_enabled travel_retract_before_outer_wall = True wall_0_wipe_dist = =round(line_width * 1.2,1) bridge_settings_enabled = True diff --git a/resources/quality/key3d/key3d_tyro_best.inst.cfg b/resources/quality/key3d/key3d_tyro_best.inst.cfg index 82d3e0c35e..d2e47b7759 100644 --- a/resources/quality/key3d/key3d_tyro_best.inst.cfg +++ b/resources/quality/key3d/key3d_tyro_best.inst.cfg @@ -30,9 +30,6 @@ wall_0_inset = 0 optimize_wall_printing_order = False outer_inset_first = False alternate_extra_perimeter = False -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True wall_min_flow = 0 fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True diff --git a/resources/quality/key3d/key3d_tyro_fast.inst.cfg b/resources/quality/key3d/key3d_tyro_fast.inst.cfg index 0d36b5a734..e62b98ed66 100644 --- a/resources/quality/key3d/key3d_tyro_fast.inst.cfg +++ b/resources/quality/key3d/key3d_tyro_fast.inst.cfg @@ -29,9 +29,6 @@ wall_0_inset = 0 optimize_wall_printing_order = False outer_inset_first = False alternate_extra_perimeter = False -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True wall_min_flow = 0 fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True diff --git a/resources/quality/key3d/key3d_tyro_normal.inst.cfg b/resources/quality/key3d/key3d_tyro_normal.inst.cfg index cf31d10c4c..29210204a5 100644 --- a/resources/quality/key3d/key3d_tyro_normal.inst.cfg +++ b/resources/quality/key3d/key3d_tyro_normal.inst.cfg @@ -29,9 +29,6 @@ wall_0_inset = 0 optimize_wall_printing_order = False outer_inset_first = False alternate_extra_perimeter = False -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True wall_min_flow = 0 fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True diff --git a/resources/quality/nwa3d_a31/nwa3d_a31_best.inst.cfg b/resources/quality/nwa3d_a31/nwa3d_a31_best.inst.cfg index 4eb37a08ea..8af201f53c 100644 --- a/resources/quality/nwa3d_a31/nwa3d_a31_best.inst.cfg +++ b/resources/quality/nwa3d_a31/nwa3d_a31_best.inst.cfg @@ -31,9 +31,6 @@ wall_0_inset = 0 optimize_wall_printing_order = False outer_inset_first = False alternate_extra_perimeter = False -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True wall_min_flow = 0 fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True diff --git a/resources/quality/nwa3d_a31/nwa3d_a31_e.inst.cfg b/resources/quality/nwa3d_a31/nwa3d_a31_e.inst.cfg index 787a05a58a..32bfcd404e 100644 --- a/resources/quality/nwa3d_a31/nwa3d_a31_e.inst.cfg +++ b/resources/quality/nwa3d_a31/nwa3d_a31_e.inst.cfg @@ -28,9 +28,6 @@ wall_0_inset = 0 optimize_wall_printing_order = False outer_inset_first = False alternate_extra_perimeter = False -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True wall_min_flow = 0 fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True diff --git a/resources/quality/nwa3d_a31/nwa3d_a31_fast.inst.cfg b/resources/quality/nwa3d_a31/nwa3d_a31_fast.inst.cfg index b1069c720b..5a32f1e93a 100644 --- a/resources/quality/nwa3d_a31/nwa3d_a31_fast.inst.cfg +++ b/resources/quality/nwa3d_a31/nwa3d_a31_fast.inst.cfg @@ -31,9 +31,6 @@ wall_0_inset = 0 optimize_wall_printing_order = False outer_inset_first = False alternate_extra_perimeter = False -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True wall_min_flow = 0 fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True diff --git a/resources/quality/nwa3d_a31/nwa3d_a31_normal.inst.cfg b/resources/quality/nwa3d_a31/nwa3d_a31_normal.inst.cfg index 1f6defeded..b3f52785fb 100644 --- a/resources/quality/nwa3d_a31/nwa3d_a31_normal.inst.cfg +++ b/resources/quality/nwa3d_a31/nwa3d_a31_normal.inst.cfg @@ -30,9 +30,6 @@ wall_0_inset = 0 optimize_wall_printing_order = False outer_inset_first = False alternate_extra_perimeter = False -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True wall_min_flow = 0 fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True diff --git a/resources/quality/nwa3d_a5/nwa3d_a5_best.inst.cfg b/resources/quality/nwa3d_a5/nwa3d_a5_best.inst.cfg index ac1ffa5756..68f503139e 100644 --- a/resources/quality/nwa3d_a5/nwa3d_a5_best.inst.cfg +++ b/resources/quality/nwa3d_a5/nwa3d_a5_best.inst.cfg @@ -29,9 +29,6 @@ wall_0_inset = 0 optimize_wall_printing_order = False outer_inset_first = False alternate_extra_perimeter = False -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True wall_min_flow = 0 fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True diff --git a/resources/quality/nwa3d_a5/nwa3d_a5_fast.inst.cfg b/resources/quality/nwa3d_a5/nwa3d_a5_fast.inst.cfg index 51d1cc8a7d..9f102a7089 100644 --- a/resources/quality/nwa3d_a5/nwa3d_a5_fast.inst.cfg +++ b/resources/quality/nwa3d_a5/nwa3d_a5_fast.inst.cfg @@ -29,9 +29,6 @@ wall_0_inset = 0 optimize_wall_printing_order = False outer_inset_first = False alternate_extra_perimeter = False -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True wall_min_flow = 0 fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True diff --git a/resources/quality/nwa3d_a5/nwa3d_a5_normal.inst.cfg b/resources/quality/nwa3d_a5/nwa3d_a5_normal.inst.cfg index 41d3da0b5c..83feba0781 100644 --- a/resources/quality/nwa3d_a5/nwa3d_a5_normal.inst.cfg +++ b/resources/quality/nwa3d_a5/nwa3d_a5_normal.inst.cfg @@ -29,9 +29,6 @@ wall_0_inset = 0 optimize_wall_printing_order = False outer_inset_first = False alternate_extra_perimeter = False -travel_compensate_overlapping_walls_enabled = True -travel_compensate_overlapping_walls_0_enabled = True -travel_compensate_overlapping_walls_x_enabled = True wall_min_flow = 0 fill_perimeter_gaps = everywhere filter_out_tiny_gaps = True diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg index 28964865ba..0c34fe7bdb 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg @@ -46,7 +46,6 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.6 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) wall_thickness = 1.6 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg index f93e61cad8..e184ffe541 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg @@ -46,7 +46,6 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.6 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) wall_thickness = 1.6 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg index 680ffa024f..a2db9d15d7 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg @@ -46,7 +46,6 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.6 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) wall_thickness = 1.6 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg index 7264f8b53c..8501c136b7 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg @@ -56,7 +56,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) wall_thickness = 1.3 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg index 5343f99df2..425622831f 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -57,7 +57,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) wall_thickness = 1.3 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg index 59b3536fc7..fce8bcdcff 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -56,7 +56,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) wall_thickness = 1.3 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Draft_Print.inst.cfg index 3fa86522b2..128b67140b 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Draft_Print.inst.cfg @@ -46,7 +46,6 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.6 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) wall_thickness = 1.6 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Superdraft_Print.inst.cfg index 37abbe7bb1..1378fc3f6c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Superdraft_Print.inst.cfg @@ -46,7 +46,6 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.6 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) wall_thickness = 1.6 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Verydraft_Print.inst.cfg index 7b6582a71a..610c1bf21f 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Verydraft_Print.inst.cfg @@ -45,7 +45,6 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.6 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) wall_thickness = 1.6 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Draft_Print.inst.cfg index 0455ed36b1..96b5270851 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Draft_Print.inst.cfg @@ -54,7 +54,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) wall_thickness = 1.3 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Superdraft_Print.inst.cfg index aa8f6ce5f9..bb0f8fa686 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -55,7 +55,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) wall_thickness = 1.3 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Verydraft_Print.inst.cfg index 4a602904cd..cc9ba73886 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -54,7 +54,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) wall_thickness = 1.3 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Draft_Print.inst.cfg index 6523c1be86..33c6c67f27 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Draft_Print.inst.cfg @@ -46,7 +46,6 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.6 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) wall_thickness = 1.6 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Verydraft_Print.inst.cfg index c441e5a34c..a106902bbe 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Verydraft_Print.inst.cfg @@ -45,7 +45,6 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.6 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) wall_thickness = 1.6 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Draft_Print.inst.cfg index db3ba02928..0460c2ed85 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Draft_Print.inst.cfg @@ -54,7 +54,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) wall_thickness = 1.3 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Superdraft_Print.inst.cfg index f4f7472d2c..57904e623d 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -55,7 +55,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) wall_thickness = 1.3 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Verydraft_Print.inst.cfg index d1fcbee4f6..0f81a22e95 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -54,7 +54,6 @@ switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.2 travel_avoid_distance = 1.5 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) wall_thickness = 1.3 diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index df35abaa55..6aafed570d 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -43,9 +43,6 @@ wall_0_inset optimize_wall_printing_order outer_inset_first alternate_extra_perimeter -travel_compensate_overlapping_walls_enabled -travel_compensate_overlapping_walls_0_enabled -travel_compensate_overlapping_walls_x_enabled fill_perimeter_gaps filter_out_tiny_gaps fill_outline_gaps From f86acdff80ac8fa48fd936780f1b1b546b0ab847 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 24 Jul 2020 12:09:40 +0200 Subject: [PATCH 02/47] Remove leftover reference to Compensate for Walls in S5 quality profile CURA-7559 --- .../ultimaker_s5/um_s5_aa0.8_PP_Superdraft_Print.inst.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Superdraft_Print.inst.cfg index c98f123b95..532b9b536c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_PP_Superdraft_Print.inst.cfg @@ -46,7 +46,6 @@ switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 top_bottom_thickness = 1.6 -travel_compensate_overlapping_walls_0_enabled = False wall_0_wipe_dist = =line_width * 2 wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) wall_thickness = 1.6 From d710d42c0aed53df753eff7dfa90a4da005a8a7a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Aug 2020 02:16:16 +0200 Subject: [PATCH 03/47] Keep tooltip visible when hovering over it Except when hovering over it while it's completely invisible. You just get this 100ms leeway time to transition from the setting to the tooltip. --- resources/qml/PrintSetupTooltip.qml | 47 ++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index 41d68aef37..cb9801f1bb 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Ultimaker B.V. +// Copyright (c) 2020 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.7 @@ -59,22 +59,39 @@ UM.PointingRectangle base.opacity = 0; } - Label + MouseArea { - id: label; - anchors + anchors.fill: parent + hoverEnabled: true + onHoveredChanged: { - top: parent.top; - topMargin: UM.Theme.getSize("tooltip_margins").height; - left: parent.left; - leftMargin: UM.Theme.getSize("tooltip_margins").width; - right: parent.right; - rightMargin: UM.Theme.getSize("tooltip_margins").width; + if(containsMouse && base.opacity > 0) + { + base.show(Qt.point(base.x + base.width, base.y + UM.Theme.getSize("tooltip_arrow_margins").height)); + } + else + { + base.hide(); + } + } + + Label + { + id: label + anchors + { + top: parent.top; + topMargin: UM.Theme.getSize("tooltip_margins").height; + left: parent.left; + leftMargin: UM.Theme.getSize("tooltip_margins").width; + right: parent.right; + rightMargin: UM.Theme.getSize("tooltip_margins").width; + } + wrapMode: Text.Wrap; + textFormat: Text.RichText + font: UM.Theme.getFont("default"); + color: UM.Theme.getColor("tooltip_text"); + renderType: Text.NativeRendering } - wrapMode: Text.Wrap; - textFormat: Text.RichText - font: UM.Theme.getFont("default"); - color: UM.Theme.getColor("tooltip_text"); - renderType: Text.NativeRendering } } From 3b8ae6439c61d9e63068ea91ef391c498608d2f6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Aug 2020 02:40:45 +0200 Subject: [PATCH 04/47] Put the setting tooltip in a scrollview You can now scroll through it if the description is too long for it to fit on the screen. --- resources/qml/PrintSetupTooltip.qml | 38 +++++++++++++++++------------ 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index cb9801f1bb..515427e655 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -11,7 +11,7 @@ UM.PointingRectangle id: base property real sourceWidth: 0 width: UM.Theme.getSize("tooltip").width - height: label.height + UM.Theme.getSize("tooltip_margins").height * 2 + height: textScroll.height + UM.Theme.getSize("tooltip_margins").height * 2 color: UM.Theme.getColor("tooltip") arrowSize: UM.Theme.getSize("default_arrow").width @@ -75,23 +75,29 @@ UM.PointingRectangle } } - Label + ScrollView { - id: label - anchors - { - top: parent.top; - topMargin: UM.Theme.getSize("tooltip_margins").height; - left: parent.left; - leftMargin: UM.Theme.getSize("tooltip_margins").width; - right: parent.right; - rightMargin: UM.Theme.getSize("tooltip_margins").width; + id: textScroll + width: parent.width + height: Math.min(label.height, base.parent.height) + + ScrollBar.horizontal: ScrollBar { + active: false //Only allow vertical scrolling. We should grow vertically only, but due to how the label is positioned it allocates space in the ScrollView horizontally. + } + + Label + { + id: label + x: UM.Theme.getSize("tooltip_margins").width + y: UM.Theme.getSize("tooltip_margins").height + width: base.width - UM.Theme.getSize("tooltip_margins").width * 2 + + wrapMode: Text.Wrap; + textFormat: Text.RichText + font: UM.Theme.getFont("default"); + color: UM.Theme.getColor("tooltip_text"); + renderType: Text.NativeRendering } - wrapMode: Text.Wrap; - textFormat: Text.RichText - font: UM.Theme.getFont("default"); - color: UM.Theme.getColor("tooltip_text"); - renderType: Text.NativeRendering } } } From 10857094070e79aabce25bd4fbcb394a0f5d3d68 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Aug 2020 02:44:19 +0200 Subject: [PATCH 05/47] Fix arrow position if tooltip is too big to fit on the screen --- resources/qml/PrintSetupTooltip.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index 515427e655..6b39842ec0 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -67,7 +67,7 @@ UM.PointingRectangle { if(containsMouse && base.opacity > 0) { - base.show(Qt.point(base.x + base.width, base.y + UM.Theme.getSize("tooltip_arrow_margins").height)); + base.show(Qt.point(target.x - 1, target.y - UM.Theme.getSize("tooltip_arrow_margins").height / 2)); //Same arrow position as before. } else { From 116f3adf5f4db24f5a484c51b081db5ce3655e6f Mon Sep 17 00:00:00 2001 From: Thushan Fernando Date: Thu, 6 Aug 2020 16:10:44 +1000 Subject: [PATCH 06/47] Initial Cocoon Create sources. --- .../definitions/cocoon_create_touch.def.json | 79 ++++++++++++++++++ .../cocoon_create_touch_extruder_0.def.json | 15 ++++ resources/images/Cocoon-backplate.png | Bin 0 -> 1061 bytes 3 files changed, 94 insertions(+) create mode 100644 resources/definitions/cocoon_create_touch.def.json create mode 100644 resources/extruders/cocoon_create_touch_extruder_0.def.json create mode 100644 resources/images/Cocoon-backplate.png diff --git a/resources/definitions/cocoon_create_touch.def.json b/resources/definitions/cocoon_create_touch.def.json new file mode 100644 index 0000000000..da5905c047 --- /dev/null +++ b/resources/definitions/cocoon_create_touch.def.json @@ -0,0 +1,79 @@ +{ + "name": "Cocoon Create Touch", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Thushan Fernando", + "manufacturer": "Cocoon Create", + "file_formats": "text/x-gcode", + "preferred_quality_type": "fine", + "has_materials": true, + "platform": "wanhao_200_200_platform.obj", + "platform_texture": "Cocoon-backplate.png", + "machine_extruder_trains": { + "0": "cocoon_create_touch_extruder_0" + }, + "platform_offset": [ + 0, + -28, + 0 + ] + }, + "overrides": { + "machine_name": { + "default_value": "Cocoon Create Touch" + }, + "machine_width": { + "default_value": 200 + }, + "machine_height": { + "default_value": 180 + }, + "machine_depth": { + "default_value": 200 + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\n G90 ;absolute positioning\n M82 ;set extruder to absolute mode\n M107 ;start with the fan off\n G28 X0 Y0 ;move X/Y to min endstops\n G28 Z0 ;move Z to min endstops\n G1 Z15.0 F{speed_travel} ;move the platform down 15mm\n G92 E0 ;zero the extruded length\n G1 F200 E3 ;extrude 3mm of feed stock\n G92 E0 ;zero the extruded length again\n G1 F{speed_travel} \n ;Put printing message on LCD screen\n M117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off \n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning" + }, + "material_diameter": { + "default_value": 1.75 + }, + "layer_height": { + "default_value": 0.10 + }, + "layer_height_0": { + "default_value": 0.2 + }, + "wall_thickness": { + "value": "0.8" + }, + "top_bottom_thickness": { + "default_value": 0.6 + }, + "speed_print": { + "default_value": 50 + }, + "support_enable": { + "default_value": true + }, + "retraction_enable": { + "default_value": true + }, + "retraction_amount": { + "default_value": 4.5 + }, + "retraction_speed": { + "default_value": 25 + } + } +} \ No newline at end of file diff --git a/resources/extruders/cocoon_create_touch_extruder_0.def.json b/resources/extruders/cocoon_create_touch_extruder_0.def.json new file mode 100644 index 0000000000..ca7c3e38af --- /dev/null +++ b/resources/extruders/cocoon_create_touch_extruder_0.def.json @@ -0,0 +1,15 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "cocoon_create_touch", + "position": "0" + }, + + "overrides": { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} diff --git a/resources/images/Cocoon-backplate.png b/resources/images/Cocoon-backplate.png new file mode 100644 index 0000000000000000000000000000000000000000..577edfcf0d182027d303ebedb820b92b687c8c79 GIT binary patch literal 1061 zcmeAS@N?(olHy`uVBq!ia0y~yV9Wrry*ZeHWLC-B(?H5Nz$e7@z`=u!&CSlPuJ7N! z7ZDdvN=aF`XwiiW7alx#psc1gandAXGqVjFHx`wY1c!#Qu(SXF|G##j&qknj!IB`q zU?3L-FsQDbnZ&@rJi*h&F{I+w+gT?ky;k6Hoynej{LlaE`&j#U=S{eCcir|K<9QLP7d~bi1p~XIIMvRt zdwBYNHDC6>bI&PXD0FrVU$Cw(w%B+3P2VdHF>`~a2mK6?GR%tNVta9{h4YuEo&M!d zS7bHACQp2svFOc$(g!g=RhIOvOHyy*o01}UecGdoZi{Br#x+)@)!2Jw*q^`EsjjB zs1?{daZWt@+8H0Yv%c$=*P481u?iH{%Uy6{xn{WO(R%)fBSEo8NPKFN`BuDICXeiouEng zmM2M@+fSXVF}~7ycIKP{ujl5D#q$no%QHXRcyWvUro|7Nm;IGgdYAP>qVnJ#W~=n+ zKNf7BHaFwZL(`SnMZef*C0KJ$=~LIUEwP#T%w9de@mwVL!HPMt#Sin|R4x|C=qvL+ zBI*6<$@xR-ds5~&JZNmI^JU<@z`)CB;=pVoz+mFw4CA6P_AaPTD2|=E`7479Fyk_K My85}Sb4q9e0BcI}egFUf literal 0 HcmV?d00001 From 3c70d55ae708d03f6672cbf37b7855c7ef9411f0 Mon Sep 17 00:00:00 2001 From: Thushan Fernando Date: Thu, 6 Aug 2020 16:11:13 +1000 Subject: [PATCH 07/47] Initial Cocoon Create attempt. --- resources/definitions/cocoon_create.def.json | 79 +++++++++++++++++++ .../cocoon_create_extruder_0.def.json | 15 ++++ 2 files changed, 94 insertions(+) create mode 100644 resources/definitions/cocoon_create.def.json create mode 100644 resources/extruders/cocoon_create_extruder_0.def.json diff --git a/resources/definitions/cocoon_create.def.json b/resources/definitions/cocoon_create.def.json new file mode 100644 index 0000000000..a3b47361c7 --- /dev/null +++ b/resources/definitions/cocoon_create.def.json @@ -0,0 +1,79 @@ +{ + "name": "Cocoon Create", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Thushan Fernando", + "manufacturer": "Cocoon Create", + "file_formats": "text/x-gcode", + "preferred_quality_type": "fine", + "has_materials": true, + "platform": "wanhao_200_200_platform.obj", + "platform_texture": "Cocoon-backplate.png", + "machine_extruder_trains": { + "0": "cocoon_create_extruder_0" + }, + "platform_offset": [ + 0, + -28, + 0 + ] + }, + "overrides": { + "machine_name": { + "default_value": "Cocoon Create" + }, + "machine_width": { + "default_value": 200 + }, + "machine_height": { + "default_value": 180 + }, + "machine_depth": { + "default_value": 200 + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\n G90 ;absolute positioning\n M82 ;set extruder to absolute mode\n M107 ;start with the fan off\n G28 X0 Y0 ;move X/Y to min endstops\n G28 Z0 ;move Z to min endstops\n G1 Z15.0 F{speed_travel} ;move the platform down 15mm\n G92 E0 ;zero the extruded length\n G1 F200 E3 ;extrude 3mm of feed stock\n G92 E0 ;zero the extruded length again\n G1 F{speed_travel} \n ;Put printing message on LCD screen\n M117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off \n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning" + }, + "material_diameter": { + "default_value": 1.75 + }, + "layer_height": { + "default_value": 0.10 + }, + "layer_height_0": { + "default_value": 0.2 + }, + "wall_thickness": { + "value": "0.8" + }, + "top_bottom_thickness": { + "default_value": 0.6 + }, + "speed_print": { + "default_value": 50 + }, + "support_enable": { + "default_value": true + }, + "retraction_enable": { + "default_value": true + }, + "retraction_amount": { + "default_value": 4.5 + }, + "retraction_speed": { + "default_value": 25 + } + } +} \ No newline at end of file diff --git a/resources/extruders/cocoon_create_extruder_0.def.json b/resources/extruders/cocoon_create_extruder_0.def.json new file mode 100644 index 0000000000..edca4b33bb --- /dev/null +++ b/resources/extruders/cocoon_create_extruder_0.def.json @@ -0,0 +1,15 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "cocoon_create", + "position": "0" + }, + + "overrides": { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} From 724498cba79ac8ce5fdb3a48371b18313d0c0656 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 6 Aug 2020 17:12:14 +0200 Subject: [PATCH 08/47] Reset quality if none was found CURA-7589 --- cura/Settings/MachineManager.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 1934befd66..da1d13aa4e 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1212,9 +1212,8 @@ class MachineManager(QObject): return if not available_quality_types: - if global_stack.qualityChanges == empty_quality_changes_container: - Logger.log("i", "No available quality types found, setting all qualities to empty (Not Supported).") - self._setEmptyQuality() + Logger.log("i", "No available quality types found, setting all qualities to empty (Not Supported).") + self._setEmptyQuality() return if current_quality_type in available_quality_types: From 2828f45e8993fb1d03ac9350aa8edc2530139b9f Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Mon, 10 Aug 2020 14:49:41 +0200 Subject: [PATCH 09/47] Add optional machine_extruder_count when creating a machine If the machine_extruder_count is not taken into consideration on machine creation, calling the extruderList of that machine will return an incomplete list of extruders (since it considers the default machine_extruder_count). This causes problems in machines with settable number of extruders where the default machine_extruder_count is 1 while the machine may have more than 1 extruders. The problem becomes especially visible when opening a project file with e.g. a CFFF with multiple extruders, because when the machine is created we do not know yet how many extruders the printer actually has. CURA-7646 --- cura/Settings/CuraStackBuilder.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index aadfd15f1a..77d723cc72 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -16,13 +16,13 @@ from .ExtruderStack import ExtruderStack class CuraStackBuilder: """Contains helper functions to create new machines.""" - @classmethod - def createMachine(cls, name: str, definition_id: str) -> Optional[GlobalStack]: + def createMachine(cls, name: str, definition_id: str, machine_extruder_count: Optional[int] = None) -> Optional[GlobalStack]: """Create a new instance of a machine. :param name: The name of the new machine. :param definition_id: The ID of the machine definition to use. + :param machine_extruder_count: The number of extruders in the machine. :return: The new global stack or None if an error occurred. """ @@ -66,7 +66,14 @@ class CuraStackBuilder: Logger.logException("e", "Failed to create an extruder stack for position {pos}: {err}".format(pos = position, err = str(e))) return None - for new_extruder in new_global_stack.extruderList: # Only register the extruders if we're sure that all of them are correct. + # If given, set the machine_extruder_count when creating the machine, or else the extruderList used bellow will + # not return the correct extruder list (since by default, the machine_extruder_count is 1) in machines with + # settable number of extruders. See CURA-7646. + if machine_extruder_count and 0 <= machine_extruder_count <= len(extruder_dict): + new_global_stack.setProperty("machine_extruder_count", "value", machine_extruder_count) + + # Only register the extruders if we're sure that all of them are correct. + for new_extruder in new_global_stack.extruderList: registry.addContainer(new_extruder) # Register the global stack after the extruder stacks are created. This prevents the registry from adding another From b9d5f0dc152cdf2e6548e72c0c4dd46d250b008b Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Mon, 10 Aug 2020 14:56:37 +0200 Subject: [PATCH 10/47] Take the machine_extruder_count into consideration when opening project CURA-7646 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 25 ++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 9abab88e6a..54a0b17bda 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -663,7 +663,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # We need to create a new machine machine_name = self._container_registry.uniqueName(self._machine_info.name) - global_stack = CuraStackBuilder.createMachine(machine_name, self._machine_info.definition_id) + # Printers with modifiable number of extruders (such as CFFF) will specify a machine_extruder_count in their + # quality_changes file. If that's the case, take the extruder count into account when creating the machine + # or else the extruderList will return only the first extruder, leading to missing non-global settings in + # the other extruders. See CURA-7646 + machine_extruder_count = self._getMachineExtruderCount() # type: Optional[int] + global_stack = CuraStackBuilder.createMachine(machine_name, self._machine_info.definition_id, machine_extruder_count) if global_stack: # Only switch if creating the machine was successful. extruder_stack_dict = {str(position): extruder for position, extruder in enumerate(global_stack.extruderList)} @@ -918,6 +923,24 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._machine_info.quality_changes_info.name = quality_changes_name + def _getMachineExtruderCount(self) -> Optional[int]: + """ + Extracts the machine extruder count from the definition_changes file of the printer. If it is not specified in + the file, None is returned instead. + + :return: The count of the machine's extruders + """ + machine_extruder_count = None + if self._machine_info.definition_changes_info \ + and "values" in self._machine_info.definition_changes_info.parser \ + and "machine_extruder_count" in self._machine_info.definition_changes_info.parser["values"]: + try: + machine_extruder_count = int(self._machine_info.definition_changes_info.parser["values"]["machine_extruder_count"]) + except ValueError: + Logger.log("w", "'machine_extruder_count' in file '{file_name}' is not a number." + .format(file_name = self._machine_info.definition_changes_info.file_name)) + return machine_extruder_count + def _createNewQualityChanges(self, quality_type: str, intent_category: Optional[str], name: str, global_stack: GlobalStack, extruder_stack: Optional[ExtruderStack]) -> InstanceContainer: """Helper class to create a new quality changes profile. From 61cc8c9a95ba78e660b045035dcf18fbfb945dd5 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Mon, 10 Aug 2020 14:58:59 +0200 Subject: [PATCH 11/47] Remove reference to JIRA ticket in comments CURA-7646 --- cura/Settings/CuraStackBuilder.py | 2 +- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 77d723cc72..efc447b2cf 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -68,7 +68,7 @@ class CuraStackBuilder: # If given, set the machine_extruder_count when creating the machine, or else the extruderList used bellow will # not return the correct extruder list (since by default, the machine_extruder_count is 1) in machines with - # settable number of extruders. See CURA-7646. + # settable number of extruders. if machine_extruder_count and 0 <= machine_extruder_count <= len(extruder_dict): new_global_stack.setProperty("machine_extruder_count", "value", machine_extruder_count) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 54a0b17bda..49173d4864 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -666,7 +666,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Printers with modifiable number of extruders (such as CFFF) will specify a machine_extruder_count in their # quality_changes file. If that's the case, take the extruder count into account when creating the machine # or else the extruderList will return only the first extruder, leading to missing non-global settings in - # the other extruders. See CURA-7646 + # the other extruders. machine_extruder_count = self._getMachineExtruderCount() # type: Optional[int] global_stack = CuraStackBuilder.createMachine(machine_name, self._machine_info.definition_id, machine_extruder_count) if global_stack: # Only switch if creating the machine was successful. From f8a15ea29e9cc0cbff23805b33a5d0f3de0fb775 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Mon, 10 Aug 2020 15:00:08 +0200 Subject: [PATCH 12/47] Display only the relevant materials when opening a project Ignore the materials of the extruders that are not visible when opening a project file with a CFFF. CURA-7646 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 49173d4864..b775d0055c 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -502,6 +502,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Now we know which material is in which extruder. Let's use that to sort the material_labels according to # their extruder position material_labels = [material_name for pos, material_name in sorted(materials_in_extruders_dict.items())] + machine_extruder_count = self._getMachineExtruderCount() + if machine_extruder_count: + material_labels = material_labels[:machine_extruder_count] num_visible_settings = 0 try: From 0feeccff85c586f5983054e48490404d966db7b5 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Mon, 10 Aug 2020 15:30:55 +0200 Subject: [PATCH 13/47] Appease mypy complaints for AttributeErrors CURA-7646 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index b775d0055c..0c1bd0a9a2 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -934,7 +934,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): :return: The count of the machine's extruders """ machine_extruder_count = None - if self._machine_info.definition_changes_info \ + if self._machine_info \ + and self._machine_info.definition_changes_info \ and "values" in self._machine_info.definition_changes_info.parser \ and "machine_extruder_count" in self._machine_info.definition_changes_info.parser["values"]: try: From 45461e702d4493ee7e4e8a7203763c0fcd577a11 Mon Sep 17 00:00:00 2001 From: n7484443 Date: Tue, 11 Aug 2020 08:53:21 +0900 Subject: [PATCH 14/47] Retranslate ko_kr "ironing_flow" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit en:i changed ironing_flow translation to "다림질 압출량". "과정" means process. so i changed it "압출량"-every flow word has been translated to this. kr:기존의 다림질 과정에서 flow를 "과정"이 아닌 "압출량"으로 바꾸었습니다. --- resources/i18n/ko_KR/fdmprinter.def.json.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 52770fac4c..830239fb46 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -1488,12 +1488,12 @@ msgstr "다림질 라인 사이의 거리." #: fdmprinter.def.json msgctxt "ironing_flow label" msgid "Ironing Flow" -msgstr "다림질 과정" +msgstr "다림질 압출량" #: fdmprinter.def.json msgctxt "ironing_flow description" msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "다림질하는 동안 기본 스킨 라인을 기준으로 한 재료의 양. 노즐을 가득 채우면 윗면의 틈새가 채워서포트만 표면의 과도한 압출과 틈이 너무 많이 생깁니다." +msgstr "다림질하는 동안 기본 스킨 라인을 기준으로 한 재료의 압출량. 노즐을 가득 채우면 윗면의 틈새가 채워서포트만 표면의 과도한 압출과 틈이 너무 많이 생깁니다." #: fdmprinter.def.json msgctxt "ironing_inset label" From 01d5e846aa62c12a709f91d66df54f029f4bf323 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 11 Aug 2020 12:37:34 +0200 Subject: [PATCH 15/47] Document possible theoretical issue when loading a project file The issue will happen only if the machine_extruder_count is a formula. In this case, the project loading will not work properly if "Create new" printer is selected, as the settings of all extruders but the first one will not be applied. Workaround in this case will be to load the project again and select to update the existing printer, in which case all settings will load properly. CURA-7646 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 0c1bd0a9a2..6ed35fe72c 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -939,6 +939,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): and "values" in self._machine_info.definition_changes_info.parser \ and "machine_extruder_count" in self._machine_info.definition_changes_info.parser["values"]: try: + # Theoretically, if the machine_extruder_count is a setting formula (e.g. "=3"), this will produce a + # value error and the project file loading will load the settings in the first extruder only. + # This is not expected to happen though, since all machine definitions define the machine_extruder_count + # as an integer. machine_extruder_count = int(self._machine_info.definition_changes_info.parser["values"]["machine_extruder_count"]) except ValueError: Logger.log("w", "'machine_extruder_count' in file '{file_name}' is not a number." From 55dbb1ea0c6a0c8281c4053d766e42e346d230bd Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 11 Aug 2020 13:29:53 +0200 Subject: [PATCH 16/47] Temporarily remove warning message for cloud cameras It's incorrect; the camera is possible with development firmware, but not implemented yet in Cura. Removed this in lieu of the actual fix in CURA-7637, which takes too much time to fix for the 4.7 release. --- .../UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml index da2acc8cf7..6416558fe7 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml @@ -282,12 +282,13 @@ Item enabled: !cameraButton.enabled } + /* //Warning message is commented out because it's factually incorrect. Fix CURA-7637 to allow camera connections via cloud. MonitorInfoBlurb { id: cameraDisabledInfo text: catalog.i18nc("@info", "The webcam is not available because you are monitoring a cloud printer.") target: cameraButton - } + }*/ } // Divider From 5ec57d42d0f474453c64e05d24f79bfb658bdd86 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 09:45:51 +0200 Subject: [PATCH 17/47] Improve translatability of cloud printer syncing texts Here are a number of improvements to the translated texts that make it easier for the translators to translate them: * Never include layout elements such as
    or
  • in the translated text. The translators don't know what to do with them. Instead, leave the tags out of the translated parts and then wrap them around it in Python. * If there are replacement keys in the source text, explain all of them in the context. * Use a name within the brackets, to make it clear from context what the brackets mean and to disambiguate multiple keys if there are multiple. * No invisible whitespace (such as space at the end of a line). * Use plural forms with i18ncp if applicable (or i18np if no context is necessary). I also changed the catalogue variable to lowercase with underscores, as per our code style. --- .../src/Cloud/CloudOutputDeviceManager.py | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index ec8dfd9ae7..7730adec1e 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -1,5 +1,6 @@ -# Copyright (c) 2019 Ultimaker B.V. +# Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. + import os from typing import Dict, List, Optional, Set @@ -37,7 +38,7 @@ class CloudOutputDeviceManager: SYNC_SERVICE_NAME = "CloudOutputDeviceManager" # The translation catalog for this device. - I18N_CATALOG = i18nCatalog("cura") + i18n_catalog = i18nCatalog("cura") # Signal emitted when the list of discovered devices changed. discoveredDevicesChanged = Signal() @@ -221,7 +222,7 @@ class CloudOutputDeviceManager: ) message = Message( - title = self.I18N_CATALOG.i18ncp( + title = self.i18n_catalog.i18ncp( "info:status", "New printer detected from your Ultimaker account", "New printers detected from your Ultimaker account", @@ -234,11 +235,7 @@ class CloudOutputDeviceManager: message.show() for idx, device in enumerate(new_devices): - message_text = self.I18N_CATALOG.i18nc( - "info:status", "Adding printer {} ({}) from your account", - device.name, - device.printerTypeName - ) + message_text = self.i18n_catalog.i18nc("info:status %1 is printer name, %2 is printer type", "Adding printer {name} ({type}) from your account").format(name = device.name, type = device.printerTypeName) message.setText(message_text) if len(new_devices) > 1: message.setProgress((idx / len(new_devices)) * 100) @@ -255,16 +252,12 @@ class CloudOutputDeviceManager: if len(new_devices) > max_disp_devices: num_hidden = len(new_devices) - max_disp_devices device_name_list = ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices[0:max_disp_devices]] - device_name_list.append(self.I18N_CATALOG.i18nc("info:hidden list items", "
  • ... and {} others
  • ", num_hidden)) + device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{num_hidden} gets replaced by a number of printers", "... and {num_hidden} other", "... and {num_hidden} others", num_hidden).format(num_hidden = num_hidden) + "
  • ") device_names = "".join(device_name_list) else: device_names = "".join(["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices]) - message_text = self.I18N_CATALOG.i18nc( - "info:status", - "Printers added from Digital Factory:
      {}
    ", - device_names - ) + message_text = self.i18n_catalog.i18nc("info:status", "Printers added from Digital Factory:") + "
      " + device_names + "
    " message.setText(message_text) def _updateOutdatedMachine(self, outdated_machine: GlobalStack, new_cloud_output_device: CloudOutputDevice) -> None: @@ -318,7 +311,7 @@ class CloudOutputDeviceManager: # Generate message self._removed_printers_message = Message( - title = self.I18N_CATALOG.i18ncp( + title = self.i18n_catalog.i18ncp( "info:status", "A cloud connection is not available for a printer", "A cloud connection is not available for some printers", @@ -326,27 +319,27 @@ class CloudOutputDeviceManager: ) ) device_names = "".join(["
  • {} ({})
  • ".format(self._um_cloud_printers[device].name, self._um_cloud_printers[device].definition.name) for device in self.reported_device_ids]) - message_text = self.I18N_CATALOG.i18ncp( + message_text = self.i18n_catalog.i18ncp( "info:status", "This printer is not linked to the Digital Factory:", "These printers are not linked to the Digital Factory:", len(self.reported_device_ids) ) message_text += "
      {}

    ".format(device_names) - digital_factory_string = self.I18N_CATALOG.i18nc("info:name", "Ultimaker Digital Factory") + digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") - message_text += self.I18N_CATALOG.i18nc( + message_text += self.i18n_catalog.i18nc( "info:status", "To establish a connection, please visit the {website_link}".format(website_link = "{}.".format(digital_factory_string)) ) self._removed_printers_message.setText(message_text) self._removed_printers_message.addAction("keep_printer_configurations_action", - name = self.I18N_CATALOG.i18nc("@action:button", "Keep printer configurations"), + name = self.i18n_catalog.i18nc("@action:button", "Keep printer configurations"), icon = "", description = "Keep cloud printers in Ultimaker Cura when not connected to your account.", button_align = Message.ActionButtonAlignment.ALIGN_RIGHT) self._removed_printers_message.addAction("remove_printers_action", - name = self.I18N_CATALOG.i18nc("@action:button", "Remove printers"), + name = self.i18n_catalog.i18nc("@action:button", "Remove printers"), icon = "", description = "Remove cloud printer(s) which aren't linked to your account.", button_style = Message.ActionButtonStyle.SECONDARY, @@ -423,9 +416,9 @@ class CloudOutputDeviceManager: machine.setMetaDataEntry(self.META_HOST_GUID, device.clusterData.host_guid) machine.setMetaDataEntry("group_name", device.name) machine.setMetaDataEntry("group_size", device.clusterSize) - digital_factory_string = self.I18N_CATALOG.i18nc("info:name", "Ultimaker Digital Factory") + digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") digital_factory_link = "{}".format(digital_factory_string) - removal_warning_string = self.I18N_CATALOG.i18nc( + removal_warning_string = self.i18n_catalog.i18nc( "@label ({printer_name} is replaced with the name of the printer", "{printer_name} will be removed until the next account sync.
    To remove {printer_name} permanently, " "visit {digital_factory_link}" @@ -469,10 +462,15 @@ class CloudOutputDeviceManager: remove_printers_ids = {self._um_cloud_printers[i].getId() for i in self.reported_device_ids} all_ids = {m.getId() for m in CuraApplication.getInstance().getContainerRegistry().findContainerStacks(type = "machine")} - question_title = self.I18N_CATALOG.i18nc("@title:window", "Remove printers?") - question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove {} printer(s) from Cura. This action cannot be undone. \nAre you sure you want to continue?".format(len(remove_printers_ids))) + question_title = self.i18n_catalog.i18nc("@title:window", "Remove printers?") + question_content = self.i18n_catalog.i18ncp( + "@label", + "You are about to remove {num_printers} printer from Cura. This action cannot be undone.\nAre you sure you want to continue?", + "You are about to remove {num_printers} printers from Cura. This action cannot be undone.\nAre you sure you want to continue?", + len(remove_printers_ids) + ).format(num_printers = len(remove_printers_ids)) if remove_printers_ids == all_ids: - question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone. \nAre you sure you want to continue?") + question_content = self.i18n_catalog.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone.\nAre you sure you want to continue?") result = QMessageBox.question(None, question_title, question_content) if result == QMessageBox.No: return From 4ecab892e54ae068c212ea867bb2c32abe65e9b9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 10:53:37 +0200 Subject: [PATCH 18/47] Further improve translated strings Remove this formatting from the translated part. --- .../src/Cloud/CloudOutputDeviceManager.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 7730adec1e..c5883e59ca 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -235,7 +235,7 @@ class CloudOutputDeviceManager: message.show() for idx, device in enumerate(new_devices): - message_text = self.i18n_catalog.i18nc("info:status %1 is printer name, %2 is printer type", "Adding printer {name} ({type}) from your account").format(name = device.name, type = device.printerTypeName) + message_text = self.i18n_catalog.i18nc("info:status Filled in with printer name and printer model.", "Adding printer {name} ({model}) from your account").format(name = device.name, model = device.printerTypeName) message.setText(message_text) if len(new_devices) > 1: message.setProgress((idx / len(new_devices)) * 100) @@ -417,15 +417,10 @@ class CloudOutputDeviceManager: machine.setMetaDataEntry("group_name", device.name) machine.setMetaDataEntry("group_size", device.clusterSize) digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") - digital_factory_link = "{}".format(digital_factory_string) - removal_warning_string = self.i18n_catalog.i18nc( - "@label ({printer_name} is replaced with the name of the printer", - "{printer_name} will be removed until the next account sync.
    To remove {printer_name} permanently, " - "visit {digital_factory_link}" - "

    Are you sure you want to remove {printer_name} temporarily?".format(printer_name = device.name, - digital_factory_link = digital_factory_link) - ) - + digital_factory_link = "{digital_factory_string}".format(digital_factory_string = digital_factory_string) + removal_warning_string = self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "{printer_name} will be removed until the next account sync.").format(printer_name = device.name) \ + + "
    " + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "To remove {printer_name} permanently, visit {digital_factory_link}").format(printer_name = device.name, digital_factory_link = digital_factory_link) \ + + "

    " + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "Are you sure you want to remove {printer_name} temporarily?").format(printer_name = device.name) machine.setMetaDataEntry("removal_warning", removal_warning_string) machine.addConfiguredConnectionType(device.connectionType.value) From 3de3d438a547ed70694684038241c38cfb4a8890 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 11:02:04 +0200 Subject: [PATCH 19/47] Prevent MouseArea from stealing mouse clicks Possibly this is a problem if the tooltip is invisible. We're not sure yet how to reproduce that bug though. In any case, it's neater to not catch mouse events you don't need. --- resources/qml/PrintSetupTooltip.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index 6b39842ec0..82210b5399 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -62,6 +62,7 @@ UM.PointingRectangle MouseArea { anchors.fill: parent + acceptedButtons: Qt.NoButton hoverEnabled: true onHoveredChanged: { From 615c124960840e81ed119f4b9d9b858fda1b44e7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 11:07:09 +0200 Subject: [PATCH 20/47] Remove MouseArea if tooltip is not visible It should unnecessarily catch any mouse events then. And neither should the ScrollView inside. --- resources/qml/PrintSetupTooltip.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index 82210b5399..91f044ceed 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -61,6 +61,8 @@ UM.PointingRectangle MouseArea { + enabled: parent.opacity > 0 + visible: enabled anchors.fill: parent acceptedButtons: Qt.NoButton hoverEnabled: true From 33ea62bb3d863bd234b415c3a54691d7d6b85110 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 11:40:40 +0200 Subject: [PATCH 21/47] Update translation of ironing flow description MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is an improvement suggested by Kwang jun Ko from Brulé via e-mail. --- resources/i18n/ko_KR/fdmprinter.def.json.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 52770fac4c..8cbbaf3071 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -1493,7 +1493,7 @@ msgstr "다림질 과정" #: fdmprinter.def.json msgctxt "ironing_flow description" msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "다림질하는 동안 기본 스킨 라인을 기준으로 한 재료의 양. 노즐을 가득 채우면 윗면의 틈새가 채워서포트만 표면의 과도한 압출과 틈이 너무 많이 생깁니다." +msgstr "다림질하는 동안 기본 스킨 라인을 기준으로 한 재료의 압출량. 노즐을 가득 채우면 윗면의 틈새를 채울 수 있지만 표면에 과도한 압출과 필라멘트 덩어리가 생길 수 있습니다." #: fdmprinter.def.json msgctxt "ironing_inset label" From 67ef6405240a8ef6b4abde24eb85e281b0dbb98a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 11:43:46 +0200 Subject: [PATCH 22/47] Improve ironing flow setting name Another suggestion for an improvement, this time by William Lee from Ultimaker. --- resources/i18n/ko_KR/fdmprinter.def.json.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 8cbbaf3071..a423723d2a 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -1488,7 +1488,7 @@ msgstr "다림질 라인 사이의 거리." #: fdmprinter.def.json msgctxt "ironing_flow label" msgid "Ironing Flow" -msgstr "다림질 과정" +msgstr "다림질 압출량" #: fdmprinter.def.json msgctxt "ironing_flow description" From 8b59fe83d8afa87a8111b5bb9a4784a7be9b8e05 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 14:15:38 +0200 Subject: [PATCH 23/47] Clarify description of infill mesh rank Translators found it confusing, and I think users would find so too. Hopefully this is a bit better. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 2623dff181..e1b550621e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6152,7 +6152,7 @@ "infill_mesh_order": { "label": "Mesh Processing Rank", - "description": "Determines the priority of this mesh when considering overlapping volumes. Areas where multiple meshes reside will be won by the lower rank mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes.", + "description": "Determines the priority of this mesh when considering multiple overlapping infill meshes. Areas where multiple infill meshes overlap will take on the settings of the mesh with the lowest rank. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes.", "default_value": 0, "value": "1 if infill_mesh else 0", "minimum_value_warning": "1", From 99cd8ab1b0cd7a506d97d7b47b1f628fdb894d10 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 12 Aug 2020 17:42:10 +0200 Subject: [PATCH 24/47] Show models outside of BP clearly in layerview. CURA-7586 --- plugins/SimulationView/SimulationPass.py | 15 +++++++++++++++ resources/shaders/striped.shader | 7 +++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index b720fc5758..f594fefbe5 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -32,6 +32,7 @@ class SimulationPass(RenderPass): self._current_shader = None # This shader will be the shadow or the normal depending if the user wants to see the paths or the layers self._tool_handle_shader = None self._nozzle_shader = None + self._disabled_shader = None self._old_current_layer = 0 self._old_current_path = 0 self._switching_layers = True # It tracks when the user is moving the layers' slider @@ -90,9 +91,17 @@ class SimulationPass(RenderPass): self._nozzle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) self._nozzle_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_nozzle").getRgb())) + if not self._disabled_shader: + self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "striped.shader")) + self._disabled_shader.setUniformValue("u_diffuseColor1", Color(*Application.getInstance().getTheme().getColor("model_unslicable").getRgb())) + self._disabled_shader.setUniformValue("u_diffuseColor2", Color(*Application.getInstance().getTheme().getColor("model_unslicable_alt").getRgb())) + self._disabled_shader.setUniformValue("u_width", 50.0) + self._disabled_shader.setUniformValue("u_opacity", 0.6) + self.bind() tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay, backface_cull = True) + disabled_batch = RenderBatch(self._disabled_shader) head_position = None # Indicates the current position of the print head nozzle_node = None @@ -105,6 +114,9 @@ class SimulationPass(RenderPass): nozzle_node = node nozzle_node.setVisible(False) + elif getattr(node, "_outside_buildarea", False) and isinstance(node, SceneNode) and node.getMeshData() and node.isVisible(): + disabled_batch.addItem(node.getWorldTransformation(copy=False), node.getMeshData()) + elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: @@ -183,6 +195,9 @@ class SimulationPass(RenderPass): nozzle_batch.addItem(nozzle_node.getWorldTransformation(), mesh = nozzle_node.getMeshData()) nozzle_batch.render(self._scene.getActiveCamera()) + if len(disabled_batch.items) > 0: + disabled_batch.render(self._scene.getActiveCamera()) + # Render toolhandles on top of the layerview if len(tool_handle_batch.items) > 0: tool_handle_batch.render(self._scene.getActiveCamera()) diff --git a/resources/shaders/striped.shader b/resources/shaders/striped.shader index 71b1f7b0fa..07ce2bebe6 100644 --- a/resources/shaders/striped.shader +++ b/resources/shaders/striped.shader @@ -29,6 +29,7 @@ fragment = uniform mediump vec4 u_diffuseColor1; uniform mediump vec4 u_diffuseColor2; uniform mediump vec4 u_specularColor; + uniform mediump float u_opacity; uniform highp vec3 u_lightPosition; uniform mediump float u_shininess; uniform highp vec3 u_viewPosition; @@ -65,7 +66,7 @@ fragment = finalColor += pow(NdotR, u_shininess) * u_specularColor; gl_FragColor = finalColor; - gl_FragColor.a = 1.0; + gl_FragColor.a = u_opacity; } vertex41core = @@ -100,6 +101,7 @@ fragment41core = uniform mediump vec4 u_diffuseColor1; uniform mediump vec4 u_diffuseColor2; uniform mediump vec4 u_specularColor; + uniform mediump float u_opacity; uniform highp vec3 u_lightPosition; uniform mediump float u_shininess; uniform highp vec3 u_viewPosition; @@ -138,7 +140,7 @@ fragment41core = finalColor += pow(NdotR, u_shininess) * u_specularColor; frag_color = finalColor; - frag_color.a = 1.0; + frag_color.a = u_opacity; } [defaults] @@ -146,6 +148,7 @@ u_ambientColor = [0.3, 0.3, 0.3, 1.0] u_diffuseColor1 = [1.0, 0.5, 0.5, 1.0] u_diffuseColor2 = [0.5, 0.5, 0.5, 1.0] u_specularColor = [0.4, 0.4, 0.4, 1.0] +u_opacity = 1.0 u_shininess = 20.0 u_width = 5.0 u_vertical_stripes = 0 From 6ad696e69ade661ced9d2be10273b45ed5622d42 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 12 Aug 2020 17:45:31 +0200 Subject: [PATCH 25/47] Fix non-printing objects in preview. --- cura/PreviewPass.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PreviewPass.py b/cura/PreviewPass.py index ba139bb2b3..47e8c367dc 100644 --- a/cura/PreviewPass.py +++ b/cura/PreviewPass.py @@ -76,8 +76,8 @@ class PreviewPass(RenderPass): Logger.error("Unable to compile shader program: overhang.shader") if not self._non_printing_shader: + self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader")) if self._non_printing_shader: - self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader")) self._non_printing_shader.setUniformValue("u_diffuseColor", [0.5, 0.5, 0.5, 0.5]) self._non_printing_shader.setUniformValue("u_opacity", 0.6) From 5c8132a94452afb137ed1744df0b719246b8a125 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 13 Aug 2020 14:54:34 +0200 Subject: [PATCH 26/47] Fix translation crash --- .../UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index c5883e59ca..767739d935 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -252,7 +252,7 @@ class CloudOutputDeviceManager: if len(new_devices) > max_disp_devices: num_hidden = len(new_devices) - max_disp_devices device_name_list = ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices[0:max_disp_devices]] - device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{num_hidden} gets replaced by a number of printers", "... and {num_hidden} other", "... and {num_hidden} others", num_hidden).format(num_hidden = num_hidden) + "
  • ") + device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{num_hidden} gets replaced by a number of printers", "... and {num_hidden} other", "... and {num_hidden} others").format(num_hidden = num_hidden) + "
  • ") device_names = "".join(device_name_list) else: device_names = "".join(["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices]) From 1374c2faa93d83b9add7e414272facd993f7e572 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 13 Aug 2020 15:13:11 +0200 Subject: [PATCH 27/47] Properly fix the translation crash --- .../UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 767739d935..508476095d 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -252,7 +252,7 @@ class CloudOutputDeviceManager: if len(new_devices) > max_disp_devices: num_hidden = len(new_devices) - max_disp_devices device_name_list = ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices[0:max_disp_devices]] - device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{num_hidden} gets replaced by a number of printers", "... and {num_hidden} other", "... and {num_hidden} others").format(num_hidden = num_hidden) + "
  • ") + device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{0} gets replaced by a number of printers", "... and {0} other", "... and {0} others", num_hidden) + "
  • ") device_names = "".join(device_name_list) else: device_names = "".join(["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices]) From ec48496790dce89a8f3ed5eb0cefa319352f9d4d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Aug 2020 10:00:33 +0200 Subject: [PATCH 28/47] Remove unneeded binding This binding wasn't needed to prevent a binding loop, but it did cause the length to not be updated correctly sometimes CURA-7589 --- .../Custom/QualitiesWithIntentMenu.qml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index 3ae180f133..652fbf71b9 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -104,16 +104,6 @@ Popup anchors.left: parent.left anchors.right: parent.right - // We set it by means of a binding, since then we can use the when condition, which we need to - // prevent a binding loop. - Binding - { - target: parent - property: "height" - value: parent.childrenRect.height - when: parent.visibleChildren.length > 0 - } - // Add the qualities that belong to the intent Repeater { From 9a0264644b870b96720e98318f0702ffcc5b31d4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Aug 2020 13:41:20 +0200 Subject: [PATCH 29/47] Simplify the _shouldResolve function This increases the speed of the setting resolvement. --- cura/Settings/GlobalStack.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index a9164d0fb9..a254104c5b 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -256,8 +256,6 @@ class GlobalStack(CuraContainerStack): raise Exceptions.InvalidOperationError("Global stack cannot have a next stack!") - # protected: - # Determine whether or not we should try to get the "resolve" property instead of the # requested property. def _shouldResolve(self, key: str, property_name: str, context: Optional[PropertyEvaluationContext] = None) -> bool: @@ -273,10 +271,8 @@ class GlobalStack(CuraContainerStack): # track all settings that are being resolved. return False - setting_state = super().getProperty(key, "state", context = context) - if setting_state is not None and setting_state != InstanceState.Default: - # When the user has explicitly set a value, we should ignore any resolve and - # just return that value. + if self.hasUserValue(key): + # When the user has explicitly set a value, we should ignore any resolve and just return that value. return False return True From 4c00a8ff2cb8ea2bae15bd9246ac96870c8478a8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Aug 2020 13:57:09 +0200 Subject: [PATCH 30/47] Add extra short-circuit for resolve --- cura/Settings/GlobalStack.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index a254104c5b..4528fd2302 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -263,6 +263,10 @@ class GlobalStack(CuraContainerStack): # Do not try to resolve anything but the "value" property return False + if not self.definition.getProperty(key, "resolve"): + # If there isn't a resolve set for this setting, there isn't anything to do here. + return False + current_thread = threading.current_thread() if key in self._resolving_settings[current_thread.name]: # To prevent infinite recursion, if getProperty is called with the same key as From 51737dccd60ba7b9c21aa3f2f8e0b3af6a490c23 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Aug 2020 14:02:59 +0200 Subject: [PATCH 31/47] Don't create a context when it's not provided The rest of the functions already assume that None is an empty context --- cura/Settings/ExtruderStack.py | 14 ++++++++------ cura/Settings/GlobalStack.py | 13 +++++++------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index bb35b336c7..2a9838c671 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -131,13 +131,13 @@ class ExtruderStack(CuraContainerStack): if not self._next_stack: raise Exceptions.NoGlobalStackError("Extruder {id} is missing the next stack!".format(id = self.id)) - if context is None: - context = PropertyEvaluationContext() - context.pushContainer(self) + if context: + context.pushContainer(self) if not super().getProperty(key, "settable_per_extruder", context): result = self.getNextStack().getProperty(key, property_name, context) - context.popContainer() + if context: + context.popContainer() return result limit_to_extruder = super().getProperty(key, "limit_to_extruder", context) @@ -150,13 +150,15 @@ class ExtruderStack(CuraContainerStack): try: result = self.getNextStack().extruderList[int(limit_to_extruder)].getProperty(key, property_name, context) if result is not None: - context.popContainer() + if context: + context.popContainer() return result except IndexError: pass result = super().getProperty(key, property_name, context) - context.popContainer() + if context: + context.popContainer() return result @override(CuraContainerStack) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 4528fd2302..da5a8546d3 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -192,7 +192,7 @@ class GlobalStack(CuraContainerStack): self._extruders[position] = extruder self.extrudersChanged.emit() Logger.log("i", "Extruder[%s] added to [%s] at position [%s]", extruder.id, self.id, position) - + @override(ContainerStack) def getProperty(self, key: str, property_name: str, context: Optional[PropertyEvaluationContext] = None) -> Any: """Overridden from ContainerStack @@ -211,9 +211,8 @@ class GlobalStack(CuraContainerStack): if not self.definition.findDefinitions(key = key): return None - if context is None: - context = PropertyEvaluationContext() - context.pushContainer(self) + if context: + context.pushContainer(self) # Handle the "resolve" property. #TODO: Why the hell does this involve threading? @@ -238,13 +237,15 @@ class GlobalStack(CuraContainerStack): if super().getProperty(key, "settable_per_extruder", context): result = self._extruders[str(limit_to_extruder)].getProperty(key, property_name, context) if result is not None: - context.popContainer() + if context: + context.popContainer() return result else: Logger.log("e", "Setting {setting} has limit_to_extruder but is not settable per extruder!", setting = key) result = super().getProperty(key, property_name, context) - context.popContainer() + if context: + context.popContainer() return result @override(ContainerStack) From 9c904f95cea9cf6f15e20111972a959326c12f03 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Aug 2020 14:51:46 +0200 Subject: [PATCH 32/47] Add a cache for settable_per_extruder property --- cura/Settings/CuraContainerStack.py | 12 ++++++++++++ cura/Settings/GlobalStack.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 4595bf3996..68371568fb 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -60,6 +60,8 @@ class CuraContainerStack(ContainerStack): import cura.CuraApplication #Here to prevent circular imports. self.setMetaDataEntry("setting_version", cura.CuraApplication.CuraApplication.SettingVersion) + self._settable_per_extruder_cache = {} + self.setDirty(False) # This is emitted whenever the containersChanged signal from the ContainerStack base class is emitted. @@ -387,6 +389,16 @@ class CuraContainerStack(ContainerStack): value = int(Application.getInstance().getMachineManager().defaultExtruderPosition) return value + def getProperty(self, key: str, property_name: str, context = None) -> Any: + if property_name == "settable_per_extruder": + # Setable per extruder isn't a value that can ever change. So once we requested it once, we can just keep + # that in memory. + if key not in self._settable_per_extruder_cache: + self._settable_per_extruder_cache[key] = super().getProperty(key, property_name, context) + return self._settable_per_extruder_cache[key] + + return super().getProperty(key, property_name, context) + class _ContainerIndexes: """Private helper class to keep track of container positions and their types.""" diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index da5a8546d3..2c7cbf5e25 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -192,7 +192,7 @@ class GlobalStack(CuraContainerStack): self._extruders[position] = extruder self.extrudersChanged.emit() Logger.log("i", "Extruder[%s] added to [%s] at position [%s]", extruder.id, self.id, position) - + @override(ContainerStack) def getProperty(self, key: str, property_name: str, context: Optional[PropertyEvaluationContext] = None) -> Any: """Overridden from ContainerStack From eee84a82bfb28babddf043602813d29a0b08ac0f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Aug 2020 15:15:33 +0200 Subject: [PATCH 33/47] Use exception instead of check if key is in dict Since the amount of times that the key is in there is orders of magnitude larger, it's better to catch the exception when it doesn't (as that is slightly faster) --- cura/Settings/CuraContainerStack.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 68371568fb..8ee190b213 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -393,9 +393,11 @@ class CuraContainerStack(ContainerStack): if property_name == "settable_per_extruder": # Setable per extruder isn't a value that can ever change. So once we requested it once, we can just keep # that in memory. - if key not in self._settable_per_extruder_cache: + try: + return self._settable_per_extruder_cache[key] + except KeyError: self._settable_per_extruder_cache[key] = super().getProperty(key, property_name, context) - return self._settable_per_extruder_cache[key] + return self._settable_per_extruder_cache[key] return super().getProperty(key, property_name, context) From bc67b057eafdc844f3a38d8ace189ff8236dfe22 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Aug 2020 15:19:59 +0200 Subject: [PATCH 34/47] Add missing required typing --- cura/Settings/CuraContainerStack.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 8ee190b213..f594ad3d0c 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Any, cast, List, Optional +from typing import Any, cast, List, Optional, Dict from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject from UM.Application import Application @@ -60,7 +60,7 @@ class CuraContainerStack(ContainerStack): import cura.CuraApplication #Here to prevent circular imports. self.setMetaDataEntry("setting_version", cura.CuraApplication.CuraApplication.SettingVersion) - self._settable_per_extruder_cache = {} + self._settable_per_extruder_cache = {} # type: Dict[str, Any] self.setDirty(False) From 43efac491da3d5c246c75be8509c607b9f93a0d2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Aug 2020 15:41:40 +0200 Subject: [PATCH 35/47] Fix the unit test Previously we would only look at the state, but that isn't the only thing it should look at. It should override the value of a resolve if it's defined in user changes or QualityChanges. --- tests/Settings/TestGlobalStack.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Settings/TestGlobalStack.py b/tests/Settings/TestGlobalStack.py index ab9c034e24..79d326ddae 100755 --- a/tests/Settings/TestGlobalStack.py +++ b/tests/Settings/TestGlobalStack.py @@ -410,13 +410,13 @@ def test_getPropertyInstancesBeforeResolve(global_stack): value = unittest.mock.MagicMock() #Sets just the value. value.getProperty = unittest.mock.MagicMock(side_effect = getValueProperty) - value.getMetaDataEntry = unittest.mock.MagicMock(return_value = "quality") + value.getMetaDataEntry = unittest.mock.MagicMock(return_value = "quality_changes") resolve = unittest.mock.MagicMock() #Sets just the resolve. resolve.getProperty = unittest.mock.MagicMock(side_effect = getResolveProperty) with unittest.mock.patch("cura.Settings.CuraContainerStack.DefinitionContainer", unittest.mock.MagicMock): #To guard against the type checking. global_stack.definition = resolve - global_stack.quality = value + global_stack.qualityChanges = value assert global_stack.getProperty("material_bed_temperature", "value") == 10 From 04c216462ab3ad1d54eb23bbe0a76e3571ac45ba Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Aug 2020 15:41:40 +0200 Subject: [PATCH 36/47] Fix the unit test Previously we would only look at the state, but that isn't the only thing it should look at. It should override the value of a resolve if it's defined in user changes or QualityChanges. --- tests/Settings/TestGlobalStack.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Settings/TestGlobalStack.py b/tests/Settings/TestGlobalStack.py index ab9c034e24..79d326ddae 100755 --- a/tests/Settings/TestGlobalStack.py +++ b/tests/Settings/TestGlobalStack.py @@ -410,13 +410,13 @@ def test_getPropertyInstancesBeforeResolve(global_stack): value = unittest.mock.MagicMock() #Sets just the value. value.getProperty = unittest.mock.MagicMock(side_effect = getValueProperty) - value.getMetaDataEntry = unittest.mock.MagicMock(return_value = "quality") + value.getMetaDataEntry = unittest.mock.MagicMock(return_value = "quality_changes") resolve = unittest.mock.MagicMock() #Sets just the resolve. resolve.getProperty = unittest.mock.MagicMock(side_effect = getResolveProperty) with unittest.mock.patch("cura.Settings.CuraContainerStack.DefinitionContainer", unittest.mock.MagicMock): #To guard against the type checking. global_stack.definition = resolve - global_stack.quality = value + global_stack.qualityChanges = value assert global_stack.getProperty("material_bed_temperature", "value") == 10 From ea7dc0ff018be56099fd39c1c80e10952e8c6cb5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 17 Aug 2020 14:09:27 +0200 Subject: [PATCH 37/47] Fix custom profiles not always being visible in menu CURA-7589 --- .../PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index 652fbf71b9..c879ff53fd 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -138,11 +138,7 @@ Popup Item { height: childrenRect.height - anchors - { - left: parent.left - right: parent.right - } + width: popup.contentWidth Label { From 6d90c85fb2ad14ae0a90c66bdb7ec0ae884364d0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 17 Aug 2020 15:07:26 +0200 Subject: [PATCH 38/47] Also show Connect Support Lines for lines pattern Previously this was disabled because you should probably use the ZigZag pattern then. But I'm enabling it now because of two inconsistencies: * The setting still works. So you can change the setting by switching to grid, triangles, cross or gyroid, then switch back to lines and still get connected support lines. * The same happens with the infill patterns, where this setting is visible for the lines pattern. Rather than changing the other two things (which involves changes to CuraEngine too to make it ignore the setting value for the lines pattern), I've opted to change it here and fix both inconsistencies at once. If I were to make the setting dysfunctional, it would also lead to user confusion, because they then need to discover that they need to change the infill pattern, which may look unlogical to them. Fixes #8192. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e1b550621e..c2e3571a62 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4332,7 +4332,7 @@ "type": "bool", "default_value": false, "value": "support_pattern == 'cross' or support_pattern == 'gyroid'", - "enabled": "(support_enable or support_meshes_present) and (support_pattern == 'grid' or support_pattern == 'triangles' or support_pattern == 'cross' or support_pattern == 'gyroid')", + "enabled": "(support_enable or support_meshes_present) and (support_pattern == 'lines' or support_pattern == 'grid' or support_pattern == 'triangles' or support_pattern == 'cross' or support_pattern == 'gyroid')", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true From dea53b9c02c4e7fb9bf560e8cea3144f63a7badb Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 18 Aug 2020 10:38:50 +0200 Subject: [PATCH 39/47] Revert "Use extruderList rather than deprecated extruders property" This reverts commit 458acb356f11f50c3327b5af0be8531fb761548f. The change was wrong. The code refers to PrinterOutputModel.extruders which is not deprecated, not to GlobalStack.extruders (which is deprecated). Fixes #8204. --- resources/qml/PrintMonitor.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 9274bf80ad..19c2562874 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -77,7 +77,7 @@ Item Repeater { id: extrudersRepeater - model: activePrinter != null ? activePrinter.extruderList : null + model: activePrinter != null ? activePrinter.extruders : null ExtruderBox { From 907caa53f0aa92f56e63517fa0ab44d60131e3c7 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 18 Aug 2020 13:54:21 +0200 Subject: [PATCH 40/47] Ensure that changing material type results in profile re-evaluation CURA-7657 --- cura/Settings/ContainerManager.py | 2 ++ cura/Settings/MachineManager.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 09a6bb5bb6..80a0d64474 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -122,6 +122,8 @@ class ContainerManager(QObject): root_material.setMetaDataEntry(entry_name, entry_value) if sub_item_changed: #If it was only a sub-item that has changed then the setMetaDataEntry won't correctly notice that something changed, and we must manually signal that the metadata changed. root_material.metaDataChanged.emit(root_material) + + cura.CuraApplication.CuraApplication.getInstance().getMachineManager().updateUponMaterialMetadataChange() return True @pyqtSlot(str, result = str) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index da1d13aa4e..c7c3fcee18 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1703,7 +1703,7 @@ class MachineManager(QObject): return False return global_stack.qualityChanges != empty_quality_changes_container - def _updateUponMaterialMetadataChange(self) -> None: + def updateUponMaterialMetadataChange(self) -> None: if self._global_container_stack is None: return with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): From 9145a7e9e69a48a428a4ef335d8d3a9e7df56ca7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 19 Aug 2020 15:35:57 +0200 Subject: [PATCH 41/47] Remove unused import Done during investigation of #8075. --- plugins/PostProcessingPlugin/scripts/ChangeAtZ.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py index 7865e7b6ae..b2a021a961 100644 --- a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py +++ b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py @@ -51,7 +51,7 @@ # M207 S F - set the retract length or feed rate # M117 - output the current changes -from typing import List, Optional, Dict +from typing import List, Dict from ..Script import Script import re From 74b9771c7de4ec557550f0ca57be11298ed53848 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 19 Aug 2020 15:46:08 +0200 Subject: [PATCH 42/47] Code style: Fields have lower camel casing As specified in the Ultimaker/Meta repository. --- .../PostProcessingPlugin/scripts/ChangeAtZ.py | 292 +++++++++--------- 1 file changed, 146 insertions(+), 146 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py index b2a021a961..78e0e71626 100644 --- a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py +++ b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py @@ -336,7 +336,7 @@ class ChangeAtZ(Script): caz_instance = ChangeAtZProcessor() - caz_instance.TargetValues = {} + caz_instance.targetValues = {} # copy over our settings to our change z class self.setIntSettingIfEnabled(caz_instance, "e1_Change_speed", "speed", "e2_speed") @@ -352,23 +352,23 @@ class ChangeAtZ(Script): self.setFloatSettingIfEnabled(caz_instance, "caz_change_retractlength", "retractlength", "caz_retractlength") # is this mod enabled? - caz_instance.IsEnabled = self.getSettingValueByKey("caz_enabled") + caz_instance.enabled = self.getSettingValueByKey("caz_enabled") # are we emitting data to the LCD? - caz_instance.IsDisplayingChangesToLcd = self.getSettingValueByKey("caz_output_to_display") + caz_instance.displayChangesToLcd = self.getSettingValueByKey("caz_output_to_display") # are we doing linear move retractions? - caz_instance.IsLinearRetraction = self.getSettingValueByKey("caz_retractstyle") == "linear" + caz_instance.linearRetraction = self.getSettingValueByKey("caz_retractstyle") == "linear" # see if we're applying to a single layer or to all layers hence forth - caz_instance.IsApplyToSingleLayer = self.getSettingValueByKey("c_behavior") == "single_layer" + caz_instance.applyToSingleLayer = self.getSettingValueByKey("c_behavior") == "single_layer" # used for easy reference of layer or height targeting - caz_instance.IsTargetByLayer = self.getSettingValueByKey("a_trigger") == "layer_no" + caz_instance.targetByLayer = self.getSettingValueByKey("a_trigger") == "layer_no" # change our target based on what we're targeting - caz_instance.TargetLayer = self.getIntSettingByKey("b_targetL", None) - caz_instance.TargetZ = self.getFloatSettingByKey("b_targetZ", None) + caz_instance.targetLayer = self.getIntSettingByKey("b_targetL", None) + caz_instance.targetZ = self.getFloatSettingByKey("b_targetZ", None) # run our script return caz_instance.execute(data) @@ -388,7 +388,7 @@ class ChangeAtZ(Script): return # set our value in the target settings - caz_instance.TargetValues[target] = value + caz_instance.targetValues[target] = value # Sets the given TargetValue in the ChangeAtZ instance if the trigger is specified def setFloatSettingIfEnabled(self, caz_instance, trigger, target, setting): @@ -405,7 +405,7 @@ class ChangeAtZ(Script): return # set our value in the target settings - caz_instance.TargetValues[target] = value + caz_instance.targetValues[target] = value # Returns the given settings value as an integer or the default if it cannot parse it def getIntSettingByKey(self, key, default): @@ -430,13 +430,13 @@ class ChangeAtZ(Script): class GCodeCommand: # The GCode command itself (ex: G10) - Command = None, + command = None, # Contains any arguments passed to the command. The key is the argument name, the value is the value of the argument. - Arguments = {} + arguments = {} # Contains the components of the command broken into pieces - Components = [] + components = [] # Constructor. Sets up defaults def __init__(self): @@ -468,10 +468,10 @@ class GCodeCommand: return None # stores all the components of the command within the class for later - command.Components = command_pieces + command.components = command_pieces # set the actual command - command.Command = command_pieces[0] + command.command = command_pieces[0] # stop here if we don't have any parameters if len(command_pieces) == 1: @@ -488,15 +488,15 @@ class GCodeCommand: linear_command = GCodeCommand.getFromLine(line) # if it's not a linear move, we don't care - if linear_command is None or (linear_command.Command != "G0" and linear_command.Command != "G1"): + if linear_command is None or (linear_command.command != "G0" and linear_command.command != "G1"): return None # convert our values to floats (or defaults) - linear_command.Arguments["F"] = linear_command.getArgumentAsFloat("F", None) - linear_command.Arguments["X"] = linear_command.getArgumentAsFloat("X", None) - linear_command.Arguments["Y"] = linear_command.getArgumentAsFloat("Y", None) - linear_command.Arguments["Z"] = linear_command.getArgumentAsFloat("Z", None) - linear_command.Arguments["E"] = linear_command.getArgumentAsFloat("E", None) + linear_command.arguments["F"] = linear_command.getArgumentAsFloat("F", None) + linear_command.arguments["X"] = linear_command.getArgumentAsFloat("X", None) + linear_command.arguments["Y"] = linear_command.getArgumentAsFloat("Y", None) + linear_command.arguments["Z"] = linear_command.getArgumentAsFloat("Z", None) + linear_command.arguments["E"] = linear_command.getArgumentAsFloat("E", None) # return our new command return linear_command @@ -508,11 +508,11 @@ class GCodeCommand: self.parseArguments() # if we don't have the parameter, return the default - if name not in self.Arguments: + if name not in self.arguments: return default # otherwise return the value - return self.Arguments[name] + return self.arguments[name] # Gets the value of a parameter as a float or returns the default def getArgumentAsFloat(self, name: str, default: float = None) -> float: @@ -593,14 +593,14 @@ class GCodeCommand: def parseArguments(self): # stop here if we don't have any remaining components - if len(self.Components) <= 1: + if len(self.components) <= 1: return None # iterate and index all of our parameters, skip the first component as it's the command - for i in range(1, len(self.Components)): + for i in range(1, len(self.components)): # get our component - component = self.Components[i] + component = self.components[i] # get the first character of the parameter, which is the name component_name = component[0] @@ -613,10 +613,10 @@ class GCodeCommand: component_value = component[1:] # index the argument - self.Arguments[component_name] = component_value + self.arguments[component_name] = component_value # clear the components to we don't process again - self.Components = [] + self.components = [] # Easy function for replacing any GCODE parameter variable in a given GCODE command @staticmethod @@ -625,8 +625,8 @@ class GCodeCommand: # Resets the model back to defaults def reset(self): - self.Command = None - self.Arguments = {} + self.command = None + self.arguments = {} # The primary ChangeAtZ class that does all the gcode editing. This was broken out into an @@ -634,55 +634,55 @@ class GCodeCommand: class ChangeAtZProcessor: # Holds our current height - CurrentZ = None + currentZ = None # Holds our current layer number - CurrentLayer = None + currentLayer = None # Indicates if we're only supposed to apply our settings to a single layer or multiple layers - IsApplyToSingleLayer = False + applyToSingleLayer = False # Indicates if this should emit the changes as they happen to the LCD - IsDisplayingChangesToLcd = False + displayChangesToLcd = False # Indicates that this mod is still enabled (or not) - IsEnabled = True + enabled = True # Indicates if we're processing inside the target layer or not - IsInsideTargetLayer = False + insideTargetLayer = False # Indicates if we have restored the previous values from before we started our pass - IsLastValuesRestored = False + lastValuesRestored = False # Indicates if the user has opted for linear move retractions or firmware retractions - IsLinearRetraction = True + linearRetraction = True # Indicates if we're targetting by layer or height value - IsTargetByLayer = True + targetByLayer = True # Indicates if we have injected our changed values for the given layer yet - IsTargetValuesInjected = False + targetValuesInjected = False # Holds the last extrusion value, used with detecting when a retraction is made - LastE = None + lastE = None # An index of our gcodes which we're monitoring - LastValues = {} + lastValues = {} # The detected layer height from the gcode - LayerHeight = None + layerHeight = None # The target layer - TargetLayer = None + targetLayer = None # Holds the values the user has requested to change - TargetValues = {} + targetValues = {} # The target height in mm - TargetZ = None + targetZ = None # Used to track if we've been inside our target layer yet - WasInsideTargetLayer = False + wasInsideTargetLayer = False # boots up the class with defaults def __init__(self): @@ -692,7 +692,7 @@ class ChangeAtZProcessor: def execute(self, data): # short cut the whole thing if we're not enabled - if not self.IsEnabled: + if not self.enabled: return data # our layer cursor @@ -750,14 +750,14 @@ class ChangeAtZProcessor: # for each of our target values, get the value to restore # no point in restoring values we haven't changed - for key in self.TargetValues: + for key in self.targetValues: # skip target values we can't restore - if key not in self.LastValues: + if key not in self.lastValues: continue # save into our changed - changed[key] = self.LastValues[key] + changed[key] = self.lastValues[key] # return our collection of changed values return changed @@ -766,7 +766,7 @@ class ChangeAtZProcessor: def getDisplayChangesFromValues(self, values: Dict[str, any]) -> str: # stop here if we're not outputting data - if not self.IsDisplayingChangesToLcd: + if not self.displayChangesToLcd: return "" # will hold all the default settings for the target layer @@ -833,7 +833,7 @@ class ChangeAtZProcessor: def getTargetDisplayValues(self) -> str: # convert our target values to something we can output - return self.getDisplayChangesFromValues(self.TargetValues) + return self.getDisplayChangesFromValues(self.targetValues) # Builds the the relevant GCODE lines from the given collection of values def getCodeFromValues(self, values: Dict[str, any]) -> str: @@ -898,7 +898,7 @@ class ChangeAtZProcessor: # set retract rate if "retractfeedrate" in values: - if self.IsLinearRetraction: + if self.linearRetraction: codes.append(";RETRACTFEEDRATE " + str(values["retractfeedrate"] * 60) + "") else: codes.append("M207 F" + str(values["retractfeedrate"] * 60) + "") @@ -906,7 +906,7 @@ class ChangeAtZProcessor: # set retract length if "retractlength" in values: - if self.IsLinearRetraction: + if self.linearRetraction: codes.append(";RETRACTLENGTH " + str(values["retractlength"]) + "") else: codes.append("M207 S" + str(values["retractlength"]) + "") @@ -923,19 +923,19 @@ class ChangeAtZProcessor: def getInjectCode(self) -> str: # if we're now outside of our target layer and haven't restored our last values, do so now - if not self.IsInsideTargetLayer and self.WasInsideTargetLayer and not self.IsLastValuesRestored: + if not self.insideTargetLayer and self.wasInsideTargetLayer and not self.lastValuesRestored: # mark that we've injected the last values - self.IsLastValuesRestored = True + self.lastValuesRestored = True # inject the defaults return self.getLastValues() + "\n" + self.getLastDisplayValues() # if we're inside our target layer but haven't added our values yet, do so now - if self.IsInsideTargetLayer and not self.IsTargetValuesInjected: + if self.insideTargetLayer and not self.targetValuesInjected: # mark that we've injected the target values - self.IsTargetValuesInjected = True + self.targetValuesInjected = True # inject the defaults return self.getTargetValues() + "\n" + self.getTargetDisplayValues() @@ -960,35 +960,35 @@ class ChangeAtZProcessor: def getTargetValues(self) -> str: # build the gcode to change our current values - return self.getCodeFromValues(self.TargetValues) + return self.getCodeFromValues(self.targetValues) # Determines if the current line is at or below the target required to start modifying def isTargetLayerOrHeight(self) -> bool: # target selected by layer no. - if self.IsTargetByLayer: + if self.targetByLayer: # if we don't have a current layer, we're not there yet - if self.CurrentLayer is None: + if self.currentLayer is None: return False # if we're applying to a single layer, stop if our layer is not identical - if self.IsApplyToSingleLayer: - return self.CurrentLayer == self.TargetLayer + if self.applyToSingleLayer: + return self.currentLayer == self.targetLayer else: - return self.CurrentLayer >= self.TargetLayer + return self.currentLayer >= self.targetLayer else: # if we don't have a current Z, we're not there yet - if self.CurrentZ is None: + if self.currentZ is None: return False # if we're applying to a single layer, stop if our Z is not identical - if self.IsApplyToSingleLayer: - return self.CurrentZ == self.TargetZ + if self.applyToSingleLayer: + return self.currentZ == self.targetZ else: - return self.CurrentZ >= self.TargetZ + return self.currentZ >= self.targetZ # Marks any current ChangeZ layer defaults in the layer for deletion @staticmethod @@ -999,7 +999,7 @@ class ChangeAtZProcessor: def processLayerHeight(self, line: str): # stop here if we haven't entered a layer yet - if self.CurrentLayer is None: + if self.currentLayer is None: return # get our gcode command @@ -1010,7 +1010,7 @@ class ChangeAtZProcessor: return # stop here if this isn't a linear move command - if command.Command != "G0" and command.Command != "G1": + if command.command != "G0" and command.command != "G1": return # get our value from the command @@ -1021,15 +1021,15 @@ class ChangeAtZProcessor: return # stop if there's no change - if current_z == self.CurrentZ: + if current_z == self.currentZ: return # set our current Z value - self.CurrentZ = current_z + self.currentZ = current_z # if we don't have a layer height yet, set it based on the current Z value - if self.LayerHeight is None: - self.LayerHeight = self.CurrentZ + if self.layerHeight is None: + self.layerHeight = self.currentZ # Grabs the current layer number def processLayerNumber(self, line: str): @@ -1042,11 +1042,11 @@ class ChangeAtZProcessor: current_layer = GCodeCommand.getDirectArgumentAsInt(line, ";LAYER:", None) # this should never happen, but if our layer number hasn't changed, stop here - if current_layer == self.CurrentLayer: + if current_layer == self.currentLayer: return # update our current layer - self.CurrentLayer = current_layer + self.currentLayer = current_layer # Makes any linear move changes and also injects either target or restored values depending on the plugin state def processLine(self, line: str) -> str: @@ -1059,10 +1059,10 @@ class ChangeAtZProcessor: # if we're not inside the target layer, simply read the any # settings we can and revert any ChangeAtZ deletions - if not self.IsInsideTargetLayer: + if not self.insideTargetLayer: # read any settings if we haven't hit our target layer yet - if not self.WasInsideTargetLayer: + if not self.wasInsideTargetLayer: self.processSetting(line) # if we haven't hit our target yet, leave the defaults as is (unmark them for deletion) @@ -1074,7 +1074,7 @@ class ChangeAtZProcessor: modified_gcode += self.getInjectCode() # modify our command if we're still inside our target layer, otherwise pass unmodified - if self.IsInsideTargetLayer: + if self.insideTargetLayer: modified_gcode += self.processLinearMove(line) + "\n" else: modified_gcode += line + "\n" @@ -1104,11 +1104,11 @@ class ChangeAtZProcessor: return line # get our linear move parameters - feed_rate = linear_command.Arguments["F"] - x_coord = linear_command.Arguments["X"] - y_coord = linear_command.Arguments["Y"] - z_coord = linear_command.Arguments["Z"] - extrude_length = linear_command.Arguments["E"] + feed_rate = linear_command.arguments["F"] + x_coord = linear_command.arguments["X"] + y_coord = linear_command.arguments["Y"] + z_coord = linear_command.arguments["Z"] + extrude_length = linear_command.arguments["E"] # set our new line to our old line new_line = line @@ -1124,7 +1124,7 @@ class ChangeAtZProcessor: new_line = self.processPrintSpeed(feed_rate, new_line) # set our current extrude position - self.LastE = extrude_length if extrude_length is not None else self.LastE + self.lastE = extrude_length if extrude_length is not None else self.lastE # if no changes have been made, stop here if new_line == line: @@ -1137,11 +1137,11 @@ class ChangeAtZProcessor: def processPrintSpeed(self, feed_rate: float, new_line: str) -> str: # if we're not setting print speed or we don't have a feed rate, stop here - if "printspeed" not in self.TargetValues or feed_rate is None: + if "printspeed" not in self.targetValues or feed_rate is None: return new_line # get our requested print speed - print_speed = int(self.TargetValues["printspeed"]) + print_speed = int(self.targetValues["printspeed"]) # if they requested no change to print speed (ie: 100%), stop here if print_speed == 100: @@ -1157,11 +1157,11 @@ class ChangeAtZProcessor: def processRetractLength(self, extrude_length: float, feed_rate: float, new_line: str, x_coord: float, y_coord: float, z_coord: float) -> str: # if we don't have a retract length in the file we can't add one - if "retractlength" not in self.LastValues or self.LastValues["retractlength"] == 0: + if "retractlength" not in self.lastValues or self.lastValues["retractlength"] == 0: return new_line # if we're not changing retraction length, stop here - if "retractlength" not in self.TargetValues: + if "retractlength" not in self.targetValues: return new_line # retractions are only F (feed rate) and E (extrude), at least in cura @@ -1173,22 +1173,22 @@ class ChangeAtZProcessor: return new_line # stop here if we don't know our last extrude value - if self.LastE is None: + if self.lastE is None: return new_line # if there's no change in extrude we have nothing to change - if self.LastE == extrude_length: + if self.lastE == extrude_length: return new_line # if our last extrude was lower than our current, we're restoring, so skip - if self.LastE < extrude_length: + if self.lastE < extrude_length: return new_line # get our desired retract length - retract_length = float(self.TargetValues["retractlength"]) + retract_length = float(self.targetValues["retractlength"]) # subtract the difference between the default and the desired - extrude_length -= (retract_length - self.LastValues["retractlength"]) + extrude_length -= (retract_length - self.lastValues["retractlength"]) # replace our extrude amount return GCodeCommand.replaceDirectArgument(new_line, "E", extrude_length) @@ -1197,7 +1197,7 @@ class ChangeAtZProcessor: def processRetractLengthSetting(self, line: str): # skip if we're not doing linear retractions - if not self.IsLinearRetraction: + if not self.linearRetraction: return # get our command from the line @@ -1208,11 +1208,11 @@ class ChangeAtZProcessor: return # get our linear move parameters - feed_rate = linear_command.Arguments["F"] - x_coord = linear_command.Arguments["X"] - y_coord = linear_command.Arguments["Y"] - z_coord = linear_command.Arguments["Z"] - extrude_length = linear_command.Arguments["E"] + feed_rate = linear_command.arguments["F"] + x_coord = linear_command.arguments["X"] + y_coord = linear_command.arguments["Y"] + z_coord = linear_command.arguments["Z"] + extrude_length = linear_command.arguments["E"] # the command we're looking for only has extrude and feed rate if x_coord is not None or y_coord is not None or z_coord is not None: @@ -1230,17 +1230,17 @@ class ChangeAtZProcessor: return # what ever the last negative retract length is it wins - self.LastValues["retractlength"] = extrude_length + self.lastValues["retractlength"] = extrude_length # Handles any changes to retraction feed rate for the given linear motion command def processRetractFeedRate(self, extrude_length: float, feed_rate: float, new_line: str, x_coord: float, y_coord: float, z_coord: float) -> str: # skip if we're not doing linear retractions - if not self.IsLinearRetraction: + if not self.linearRetraction: return new_line # if we're not changing retraction length, stop here - if "retractfeedrate" not in self.TargetValues: + if "retractfeedrate" not in self.targetValues: return new_line # retractions are only F (feed rate) and E (extrude), at least in cura @@ -1252,7 +1252,7 @@ class ChangeAtZProcessor: return new_line # get our desired retract feed rate - retract_feed_rate = float(self.TargetValues["retractfeedrate"]) + retract_feed_rate = float(self.targetValues["retractfeedrate"]) # convert to units/min retract_feed_rate *= 60 @@ -1264,7 +1264,7 @@ class ChangeAtZProcessor: def processSetting(self, line: str): # if we're in layers already we're out of settings - if self.CurrentLayer is not None: + if self.currentLayer is not None: return # check our retract length @@ -1277,16 +1277,16 @@ class ChangeAtZProcessor: if not self.isTargetLayerOrHeight(): # flag that we're outside our target layer - self.IsInsideTargetLayer = False + self.insideTargetLayer = False # skip to the next line return # flip if we hit our target layer - self.WasInsideTargetLayer = True + self.wasInsideTargetLayer = True # flag that we're inside our target layer - self.IsInsideTargetLayer = True + self.insideTargetLayer = True # Removes all the ChangeZ layer defaults from the given layer @staticmethod @@ -1296,22 +1296,22 @@ class ChangeAtZProcessor: # Resets the class contents to defaults def reset(self): - self.TargetValues = {} - self.IsApplyToSingleLayer = False - self.LastE = None - self.CurrentZ = None - self.CurrentLayer = None - self.IsTargetByLayer = True - self.TargetLayer = None - self.TargetZ = None - self.LayerHeight = None - self.LastValues = {} - self.IsLinearRetraction = True - self.IsInsideTargetLayer = False - self.IsTargetValuesInjected = False - self.IsLastValuesRestored = False - self.WasInsideTargetLayer = False - self.IsEnabled = True + self.targetValues = {} + self.applyToSingleLayer = False + self.lastE = None + self.currentZ = None + self.currentLayer = None + self.targetByLayer = True + self.targetLayer = None + self.targetZ = None + self.layerHeight = None + self.lastValues = {} + self.linearRetraction = True + self.insideTargetLayer = False + self.targetValuesInjected = False + self.lastValuesRestored = False + self.wasInsideTargetLayer = False + self.enabled = True # Sets the original GCODE line in a given GCODE command @staticmethod @@ -1341,31 +1341,31 @@ class ChangeAtZProcessor: return # handle retract length changes - if command.Command == "M207": + if command.command == "M207": # get our retract length if provided - if "S" in command.Arguments: - self.LastValues["retractlength"] = command.getArgumentAsFloat("S") + if "S" in command.arguments: + self.lastValues["retractlength"] = command.getArgumentAsFloat("S") # get our retract feedrate if provided, convert from mm/m to mm/s - if "F" in command.Arguments: - self.LastValues["retractfeedrate"] = command.getArgumentAsFloat("F") / 60.0 + if "F" in command.arguments: + self.lastValues["retractfeedrate"] = command.getArgumentAsFloat("F") / 60.0 # move to the next command return # handle bed temp changes - if command.Command == "M140" or command.Command == "M190": + if command.command == "M140" or command.command == "M190": # get our bed temp if provided - if "S" in command.Arguments: - self.LastValues["bedTemp"] = command.getArgumentAsFloat("S") + if "S" in command.arguments: + self.lastValues["bedTemp"] = command.getArgumentAsFloat("S") # move to the next command return # handle extruder temp changes - if command.Command == "M104" or command.Command == "M109": + if command.command == "M104" or command.command == "M109": # get our tempurature tempurature = command.getArgumentAsFloat("S") @@ -1379,26 +1379,26 @@ class ChangeAtZProcessor: # set our extruder temp based on the extruder if extruder is None or extruder == 0: - self.LastValues["extruderOne"] = tempurature + self.lastValues["extruderOne"] = tempurature if extruder is None or extruder == 1: - self.LastValues["extruderTwo"] = tempurature + self.lastValues["extruderTwo"] = tempurature # move to the next command return # handle fan speed changes - if command.Command == "M106": + if command.command == "M106": # get our bed temp if provided - if "S" in command.Arguments: - self.LastValues["fanSpeed"] = (command.getArgumentAsInt("S") / 255.0) * 100 + if "S" in command.arguments: + self.lastValues["fanSpeed"] = (command.getArgumentAsInt("S") / 255.0) * 100 # move to the next command return # handle flow rate changes - if command.Command == "M221": + if command.command == "M221": # get our flow rate tempurature = command.getArgumentAsFloat("S") @@ -1412,21 +1412,21 @@ class ChangeAtZProcessor: # set our extruder temp based on the extruder if extruder is None: - self.LastValues["flowrate"] = tempurature + self.lastValues["flowrate"] = tempurature elif extruder == 1: - self.LastValues["flowrateOne"] = tempurature + self.lastValues["flowrateOne"] = tempurature elif extruder == 1: - self.LastValues["flowrateTwo"] = tempurature + self.lastValues["flowrateTwo"] = tempurature # move to the next command return # handle print speed changes - if command.Command == "M220": + if command.command == "M220": # get our speed if provided - if "S" in command.Arguments: - self.LastValues["speed"] = command.getArgumentAsInt("S") + if "S" in command.arguments: + self.lastValues["speed"] = command.getArgumentAsInt("S") # move to the next command return From 808a0bf4aa7106eb90aabe1f0fe4848c4b765d7e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 20 Aug 2020 14:30:28 +0200 Subject: [PATCH 43/47] Don't use the new FindPython3 script from CMake I don't know what it is with this one, but it's finding the wrong one. We specify through the prefix that it should search in the cura-build-environment first, but apparently it's not listening to that. As a result it's getting Python 3.6, and then stops because it can't find the headers for that version. It wouldn't need the headers in this case, but if it didn't crash here it would crash during the run time because libArcus and libSavitar have been linked to Python 3.5. --- CMakeLists.txt | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 035191ebf7..39628b8fa8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,24 +30,16 @@ configure_file(${CMAKE_SOURCE_DIR}/cura.desktop.in ${CMAKE_BINARY_DIR}/cura.desk configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY) -# FIXME: Remove the code for CMake <3.12 once we have switched over completely. -# FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. The FindPython3 -# module is copied from the CMake repository here so in CMake <3.12 we can still use it. -if(${CMAKE_VERSION} VERSION_LESS 3.12) - # Use FindPythonInterp and FindPythonLibs for CMake <3.12 - find_package(PythonInterp 3 REQUIRED) +# FIXME: The new FindPython3 finds the system's Python3.6 reather than the Python3.5 that we built for Cura's environment. +# So we're using the old method here, with FindPythonInterp for now. +find_package(PythonInterp 3 REQUIRED) - set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE}) - - set(Python3_VERSION ${PYTHON_VERSION_STRING}) - set(Python3_VERSION_MAJOR ${PYTHON_VERSION_MAJOR}) - set(Python3_VERSION_MINOR ${PYTHON_VERSION_MINOR}) - set(Python3_VERSION_PATCH ${PYTHON_VERSION_PATCH}) -else() - # Use FindPython3 for CMake >=3.12 - find_package(Python3 REQUIRED COMPONENTS Interpreter Development) -endif() +set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE}) +set(Python3_VERSION ${PYTHON_VERSION_STRING}) +set(Python3_VERSION_MAJOR ${PYTHON_VERSION_MAJOR}) +set(Python3_VERSION_MINOR ${PYTHON_VERSION_MINOR}) +set(Python3_VERSION_PATCH ${PYTHON_VERSION_PATCH}) if(NOT ${URANIUM_DIR} STREQUAL "") set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${URANIUM_DIR}/cmake") From 7f70acbaf1f6a5c6b1f77d9eed47ceb592256983 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 20 Aug 2020 14:34:36 +0200 Subject: [PATCH 44/47] Also use FindPythonInterp when gathering the tests --- cmake/CuraTests.cmake | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/cmake/CuraTests.cmake b/cmake/CuraTests.cmake index 251bec5781..0e62b84efa 100644 --- a/cmake/CuraTests.cmake +++ b/cmake/CuraTests.cmake @@ -4,18 +4,11 @@ include(CTest) include(CMakeParseArguments) -# FIXME: Remove the code for CMake <3.12 once we have switched over completely. -# FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. The FindPython3 -# module is copied from the CMake repository here so in CMake <3.12 we can still use it. -if(${CMAKE_VERSION} VERSION_LESS 3.12) - # Use FindPythonInterp and FindPythonLibs for CMake <3.12 - find_package(PythonInterp 3 REQUIRED) +# FIXME: The new FindPython3 finds the system's Python3.6 reather than the Python3.5 that we built for Cura's environment. +# So we're using the old method here, with FindPythonInterp for now. +find_package(PythonInterp 3 REQUIRED) - set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE}) -else() - # Use FindPython3 for CMake >=3.12 - find_package(Python3 REQUIRED COMPONENTS Interpreter Development) -endif() +set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE}) add_custom_target(test-verbose COMMAND ${CMAKE_CTEST_COMMAND} --verbose) From 28f4d8513db7efce17bfd8b80fa7c8b237fd1c18 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 20 Aug 2020 16:01:46 +0200 Subject: [PATCH 45/47] Revert "Merge branch '4.7' of github.com:Ultimaker/Cura into 4.7" This reverts commit 7f47f12bf0a9cf305542b6c21600ce9b804c1dfd, reversing changes made to dd42c87da762d2030ee2220bc6f0a3e44cf85c28. --- cura/Machines/Models/GlobalStacksModel.py | 4 +- cura/PreviewPass.py | 2 +- plugins/3MFReader/ThreeMFWorkspaceReader.py | 30 ++--- plugins/3MFReader/UpdatableMachinesModel.py | 43 ------- plugins/3MFReader/WorkspaceDialog.py | 120 +++++++----------- plugins/3MFReader/WorkspaceDialog.qml | 65 ++++------ .../PostProcessingPlugin/scripts/ChangeAtZ.py | 5 +- plugins/SimulationView/SimulationPass.py | 15 --- .../src/Cloud/CloudOutputDeviceManager.py | 62 ++++----- resources/definitions/fdmprinter.def.json | 2 +- .../Custom/QualitiesWithIntentMenu.qml | 10 ++ resources/qml/PrintSetupTooltip.qml | 58 +++------ resources/shaders/striped.shader | 7 +- 13 files changed, 149 insertions(+), 274 deletions(-) delete mode 100644 plugins/3MFReader/UpdatableMachinesModel.py diff --git a/cura/Machines/Models/GlobalStacksModel.py b/cura/Machines/Models/GlobalStacksModel.py index 712597c2e7..6d091659a8 100644 --- a/cura/Machines/Models/GlobalStacksModel.py +++ b/cura/Machines/Models/GlobalStacksModel.py @@ -72,8 +72,8 @@ class GlobalStacksModel(ListModel): section_name = self._catalog.i18nc("@info:title", section_name) default_removal_warning = self._catalog.i18nc( - "@label {0} is the name of a printer that's about to be deleted.", - "Are you sure you wish to remove {0}? This cannot be undone!", device_name + "@label ({} is object name)", + "Are you sure you wish to remove {}? This cannot be undone!", device_name ) removal_warning = container_stack.getMetaDataEntry("removal_warning", default_removal_warning) diff --git a/cura/PreviewPass.py b/cura/PreviewPass.py index 47e8c367dc..ba139bb2b3 100644 --- a/cura/PreviewPass.py +++ b/cura/PreviewPass.py @@ -76,8 +76,8 @@ class PreviewPass(RenderPass): Logger.error("Unable to compile shader program: overhang.shader") if not self._non_printing_shader: - self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader")) if self._non_printing_shader: + self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader")) self._non_printing_shader.setUniformValue("u_diffuseColor", [0.5, 0.5, 0.5, 0.5]) self._non_printing_shader.setUniformValue("u_opacity", 0.6) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 3ed005f131..6ed35fe72c 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -133,10 +133,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # In Cura 2.5 and 2.6, the empty profiles used to have those long names self._old_empty_profile_id_dict = {"empty_%s" % k: "empty" for k in ["material", "variant"]} + self._is_same_machine_type = False self._old_new_materials = {} # type: Dict[str, str] self._machine_info = None def _clearState(self): + self._is_same_machine_type = False self._id_mapping = {} self._old_new_materials = {} self._machine_info = None @@ -227,7 +229,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Read definition containers # machine_definition_id = None - updatable_machines = [] machine_definition_container_count = 0 extruder_definition_container_count = 0 definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)] @@ -244,9 +245,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): definition_container_type = definition_container.get("type") if definition_container_type == "machine": machine_definition_id = container_id - machine_definition_containers = self._container_registry.findDefinitionContainers(id = machine_definition_id) - if machine_definition_containers: - updatable_machines = [machine for machine in self._container_registry.findContainerStacks(type = "machine") if machine.definition == machine_definition_containers[0]] machine_type = definition_container["name"] variant_type_name = definition_container.get("variants_name", variant_type_name) @@ -388,8 +386,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): machine_definition_id = id_list[7] stacks = self._container_registry.findContainerStacks(name = machine_name, type = "machine") + self._is_same_machine_type = True existing_global_stack = None - global_stack = None if stacks: global_stack = stacks[0] @@ -402,9 +400,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if global_stack.getContainer(index).getId() != container_id: machine_conflict = True break - - if updatable_machines and not containers_found_dict["machine"]: - containers_found_dict["machine"] = True + self._is_same_machine_type = global_stack.definition.getId() == machine_definition_id # Get quality type parser = ConfigParser(interpolation = None) @@ -489,7 +485,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if intent_id not in ("empty", "empty_intent"): extruder_info.intent_info = instance_container_info_dict[intent_id] - if not machine_conflict and containers_found_dict["machine"] and global_stack: + if not machine_conflict and containers_found_dict["machine"]: if int(position) >= len(global_stack.extruderList): continue @@ -562,6 +558,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._machine_info.custom_quality_name = quality_name self._machine_info.intent_category = intent_category + if machine_conflict and not self._is_same_machine_type: + machine_conflict = False + is_printer_group = False if machine_conflict: group_name = existing_global_stack.getMetaDataEntry("group_name") @@ -582,7 +581,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._dialog.setNumSettingsOverriddenByQualityChanges(num_settings_overridden_by_quality_changes) self._dialog.setNumUserSettings(num_user_settings) self._dialog.setActiveMode(active_mode) - self._dialog.setUpdatableMachines(updatable_machines) self._dialog.setMachineName(machine_name) self._dialog.setMaterialLabels(material_labels) self._dialog.setMachineType(machine_type) @@ -663,8 +661,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): application.expandedCategoriesChanged.emit() # Notify the GUI of the change - # If there are no machines of the same type, create a new machine. - if self._resolve_strategies["machine"] != "override" or self._dialog.updatableMachinesModel.count <= 1: + # If a machine with the same name is of a different type, always create a new one. + if not self._is_same_machine_type or self._resolve_strategies["machine"] != "override": # We need to create a new machine machine_name = self._container_registry.uniqueName(self._machine_info.name) @@ -679,12 +677,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._container_registry.addContainer(global_stack) else: - # Find the machine which will be overridden - global_stacks = self._container_registry.findContainerStacks(id = self._dialog.getMachineToOverride(), type = "machine") + # Find the machine + global_stacks = self._container_registry.findContainerStacks(name = self._machine_info.name, type = "machine") if not global_stacks: - message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag !", - "Project file {0} is made using profiles that" - " are unknown to this version of Ultimaker Cura.", file_name)) + message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag !", "Project file {0} is made using profiles that are unknown to this version of Ultimaker Cura.", file_name)) message.show() self.setWorkspaceName("") return [], {} diff --git a/plugins/3MFReader/UpdatableMachinesModel.py b/plugins/3MFReader/UpdatableMachinesModel.py deleted file mode 100644 index a332c669e6..0000000000 --- a/plugins/3MFReader/UpdatableMachinesModel.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (c) 2020 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from typing import Dict, List - -from PyQt5.QtCore import Qt - -from UM.Qt.ListModel import ListModel -from cura.Settings.GlobalStack import GlobalStack - -create_new_list_item = { - "id": "new", - "name": "Create new", - "displayName": "Create new", - "type": "default_option" # to make sure we are not mixing the "Create new" option with a printer with id "new" -} # type: Dict[str, str] - - -class UpdatableMachinesModel(ListModel): - """Model that holds cura packages. - - By setting the filter property the instances held by this model can be changed. - """ - - def __init__(self, parent = None) -> None: - super().__init__(parent) - - self.addRoleName(Qt.UserRole + 1, "id") - self.addRoleName(Qt.UserRole + 2, "name") - self.addRoleName(Qt.UserRole + 3, "displayName") - self.addRoleName(Qt.UserRole + 4, "type") # Either "default_option" or "machine" - - def update(self, machines: List[GlobalStack]) -> None: - items = [create_new_list_item] # type: List[Dict[str, str]] - - for machine in sorted(machines, key = lambda printer: printer.name): - items.append({ - "id": machine.id, - "name": machine.name, - "displayName": "Update " + machine.name, - "type": "machine" - }) - self.setItems(items) diff --git a/plugins/3MFReader/WorkspaceDialog.py b/plugins/3MFReader/WorkspaceDialog.py index 8d59ec1339..3c97146583 100644 --- a/plugins/3MFReader/WorkspaceDialog.py +++ b/plugins/3MFReader/WorkspaceDialog.py @@ -1,6 +1,5 @@ -# Copyright (c) 2020 Ultimaker B.V. +# Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import List, Optional, Dict, cast from PyQt5.QtCore import pyqtSignal, QObject, pyqtProperty, QCoreApplication from UM.FlameProfiler import pyqtSlot @@ -8,15 +7,10 @@ from UM.PluginRegistry import PluginRegistry from UM.Application import Application from UM.i18n import i18nCatalog from UM.Settings.ContainerRegistry import ContainerRegistry -from cura.Settings.GlobalStack import GlobalStack -from .UpdatableMachinesModel import UpdatableMachinesModel import os import threading import time - -from cura.CuraApplication import CuraApplication - i18n_catalog = i18nCatalog("cura") @@ -35,7 +29,6 @@ class WorkspaceDialog(QObject): "quality_changes": self._default_strategy, "definition_changes": self._default_strategy, "material": self._default_strategy} - self._override_machine = None self._visible = False self.showDialogSignal.connect(self.__show) @@ -58,7 +51,6 @@ class WorkspaceDialog(QObject): self._extruders = [] self._objects_on_plate = False self._is_printer_group = False - self._updatable_machines_model = UpdatableMachinesModel(self) machineConflictChanged = pyqtSignal() qualityChangesConflictChanged = pyqtSignal() @@ -71,7 +63,6 @@ class WorkspaceDialog(QObject): qualityTypeChanged = pyqtSignal() intentNameChanged = pyqtSignal() machineNameChanged = pyqtSignal() - updatableMachinesChanged = pyqtSignal() materialLabelsChanged = pyqtSignal() objectsOnPlateChanged = pyqtSignal() numUserSettingsChanged = pyqtSignal() @@ -90,33 +81,33 @@ class WorkspaceDialog(QObject): self.isPrinterGroupChanged.emit() @pyqtProperty(str, notify=variantTypeChanged) - def variantType(self) -> str: + def variantType(self): return self._variant_type - def setVariantType(self, variant_type: str) -> None: + def setVariantType(self, variant_type): if self._variant_type != variant_type: self._variant_type = variant_type self.variantTypeChanged.emit() @pyqtProperty(str, notify=machineTypeChanged) - def machineType(self) -> str: + def machineType(self): return self._machine_type - def setMachineType(self, machine_type: str) -> None: + def setMachineType(self, machine_type): self._machine_type = machine_type self.machineTypeChanged.emit() - def setNumUserSettings(self, num_user_settings: int) -> None: + def setNumUserSettings(self, num_user_settings): if self._num_user_settings != num_user_settings: self._num_user_settings = num_user_settings self.numVisibleSettingsChanged.emit() @pyqtProperty(int, notify=numUserSettingsChanged) - def numUserSettings(self) -> int: + def numUserSettings(self): return self._num_user_settings @pyqtProperty(bool, notify=objectsOnPlateChanged) - def hasObjectsOnPlate(self) -> bool: + def hasObjectsOnPlate(self): return self._objects_on_plate def setHasObjectsOnPlate(self, objects_on_plate): @@ -125,10 +116,10 @@ class WorkspaceDialog(QObject): self.objectsOnPlateChanged.emit() @pyqtProperty("QVariantList", notify = materialLabelsChanged) - def materialLabels(self) -> List[str]: + def materialLabels(self): return self._material_labels - def setMaterialLabels(self, material_labels: List[str]) -> None: + def setMaterialLabels(self, material_labels): if self._material_labels != material_labels: self._material_labels = material_labels self.materialLabelsChanged.emit() @@ -143,44 +134,36 @@ class WorkspaceDialog(QObject): self.extrudersChanged.emit() @pyqtProperty(str, notify = machineNameChanged) - def machineName(self) -> str: + def machineName(self): return self._machine_name - def setMachineName(self, machine_name: str) -> None: + def setMachineName(self, machine_name): if self._machine_name != machine_name: self._machine_name = machine_name self.machineNameChanged.emit() - @pyqtProperty(QObject, notify = updatableMachinesChanged) - def updatableMachinesModel(self) -> UpdatableMachinesModel: - return cast(UpdatableMachinesModel, self._updatable_machines_model) - - def setUpdatableMachines(self, updatable_machines: List[GlobalStack]) -> None: - self._updatable_machines_model.update(updatable_machines) - self.updatableMachinesChanged.emit() - @pyqtProperty(str, notify=qualityTypeChanged) - def qualityType(self) -> str: + def qualityType(self): return self._quality_type - def setQualityType(self, quality_type: str) -> None: + def setQualityType(self, quality_type): if self._quality_type != quality_type: self._quality_type = quality_type self.qualityTypeChanged.emit() @pyqtProperty(int, notify=numSettingsOverridenByQualityChangesChanged) - def numSettingsOverridenByQualityChanges(self) -> int: + def numSettingsOverridenByQualityChanges(self): return self._num_settings_overridden_by_quality_changes - def setNumSettingsOverriddenByQualityChanges(self, num_settings_overridden_by_quality_changes: int) -> None: + def setNumSettingsOverriddenByQualityChanges(self, num_settings_overridden_by_quality_changes): self._num_settings_overridden_by_quality_changes = num_settings_overridden_by_quality_changes self.numSettingsOverridenByQualityChangesChanged.emit() @pyqtProperty(str, notify=qualityNameChanged) - def qualityName(self) -> str: + def qualityName(self): return self._quality_name - def setQualityName(self, quality_name: str) -> None: + def setQualityName(self, quality_name): if self._quality_name != quality_name: self._quality_name = quality_name self.qualityNameChanged.emit() @@ -195,87 +178,80 @@ class WorkspaceDialog(QObject): self.intentNameChanged.emit() @pyqtProperty(str, notify=activeModeChanged) - def activeMode(self) -> str: + def activeMode(self): return self._active_mode - def setActiveMode(self, active_mode: int) -> None: + def setActiveMode(self, active_mode): if active_mode == 0: self._active_mode = i18n_catalog.i18nc("@title:tab", "Recommended") else: self._active_mode = i18n_catalog.i18nc("@title:tab", "Custom") self.activeModeChanged.emit() - @pyqtProperty(bool, notify = hasVisibleSettingsFieldChanged) - def hasVisibleSettingsField(self) -> bool: + @pyqtProperty(int, notify = hasVisibleSettingsFieldChanged) + def hasVisibleSettingsField(self): return self._has_visible_settings_field - def setHasVisibleSettingsField(self, has_visible_settings_field: bool) -> None: + def setHasVisibleSettingsField(self, has_visible_settings_field): self._has_visible_settings_field = has_visible_settings_field self.hasVisibleSettingsFieldChanged.emit() @pyqtProperty(int, constant = True) - def totalNumberOfSettings(self) -> int: + def totalNumberOfSettings(self): general_definition_containers = ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter") if not general_definition_containers: return 0 return len(general_definition_containers[0].getAllKeys()) @pyqtProperty(int, notify = numVisibleSettingsChanged) - def numVisibleSettings(self) -> int: + def numVisibleSettings(self): return self._num_visible_settings - def setNumVisibleSettings(self, num_visible_settings: int) -> None: + def setNumVisibleSettings(self, num_visible_settings): if self._num_visible_settings != num_visible_settings: self._num_visible_settings = num_visible_settings self.numVisibleSettingsChanged.emit() @pyqtProperty(bool, notify = machineConflictChanged) - def machineConflict(self) -> bool: + def machineConflict(self): return self._has_machine_conflict @pyqtProperty(bool, notify=qualityChangesConflictChanged) - def qualityChangesConflict(self) -> bool: + def qualityChangesConflict(self): return self._has_quality_changes_conflict @pyqtProperty(bool, notify=materialConflictChanged) - def materialConflict(self) -> bool: + def materialConflict(self): return self._has_material_conflict @pyqtSlot(str, str) - def setResolveStrategy(self, key: str, strategy: Optional[str]) -> None: + def setResolveStrategy(self, key, strategy): if key in self._result: self._result[key] = strategy - def getMachineToOverride(self) -> str: - return self._override_machine - - @pyqtSlot(str) - def setMachineToOverride(self, machine_name: str) -> None: - self._override_machine = machine_name - @pyqtSlot() - def closeBackend(self) -> None: + def closeBackend(self): """Close the backend: otherwise one could end up with "Slicing...""" Application.getInstance().getBackend().close() - def setMaterialConflict(self, material_conflict: bool) -> None: + def setMaterialConflict(self, material_conflict): if self._has_material_conflict != material_conflict: self._has_material_conflict = material_conflict self.materialConflictChanged.emit() - def setMachineConflict(self, machine_conflict: bool) -> None: + def setMachineConflict(self, machine_conflict): if self._has_machine_conflict != machine_conflict: self._has_machine_conflict = machine_conflict self.machineConflictChanged.emit() - def setQualityChangesConflict(self, quality_changes_conflict: bool) -> None: + def setQualityChangesConflict(self, quality_changes_conflict): if self._has_quality_changes_conflict != quality_changes_conflict: self._has_quality_changes_conflict = quality_changes_conflict self.qualityChangesConflictChanged.emit() - def getResult(self) -> Dict[str, Optional[str]]: - if "machine" in self._result and self.updatableMachinesModel.count <= 1: + def getResult(self): + if "machine" in self._result and not self._has_machine_conflict: self._result["machine"] = None if "quality_changes" in self._result and not self._has_quality_changes_conflict: self._result["quality_changes"] = None @@ -291,13 +267,11 @@ class WorkspaceDialog(QObject): return self._result - def _createViewFromQML(self) -> None: - three_mf_reader_path = PluginRegistry.getInstance().getPluginPath("3MFReader") - if three_mf_reader_path: - path = os.path.join(three_mf_reader_path, self._qml_url) - self._view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) + def _createViewFromQML(self): + path = os.path.join(PluginRegistry.getInstance().getPluginPath("3MFReader"), self._qml_url) + self._view = Application.getInstance().createQmlComponent(path, {"manager": self}) - def show(self) -> None: + def show(self): # Emit signal so the right thread actually shows the view. if threading.current_thread() != threading.main_thread(): self._lock.acquire() @@ -310,7 +284,7 @@ class WorkspaceDialog(QObject): self.showDialogSignal.emit() @pyqtSlot() - def notifyClosed(self) -> None: + def notifyClosed(self): """Used to notify the dialog so the lock can be released.""" self._result = {} # The result should be cleared before hide, because after it is released the main thread lock @@ -320,7 +294,7 @@ class WorkspaceDialog(QObject): except: pass - def hide(self) -> None: + def hide(self): self._visible = False self._view.hide() try: @@ -329,7 +303,7 @@ class WorkspaceDialog(QObject): pass @pyqtSlot(bool) - def _onVisibilityChanged(self, visible: bool) -> None: + def _onVisibilityChanged(self, visible): if not visible: try: self._lock.release() @@ -337,17 +311,17 @@ class WorkspaceDialog(QObject): pass @pyqtSlot() - def onOkButtonClicked(self) -> None: + def onOkButtonClicked(self): self._view.hide() self.hide() @pyqtSlot() - def onCancelButtonClicked(self) -> None: + def onCancelButtonClicked(self): self._result = {} self._view.hide() self.hide() - def waitForClose(self) -> None: + def waitForClose(self): """Block thread until the dialog is closed.""" if self._visible: @@ -360,7 +334,7 @@ class WorkspaceDialog(QObject): time.sleep(1 / 50) QCoreApplication.processEvents() # Ensure that the GUI does not freeze. - def __show(self) -> None: + def __show(self): if self._view is None: self._createViewFromQML() if self._view: diff --git a/plugins/3MFReader/WorkspaceDialog.qml b/plugins/3MFReader/WorkspaceDialog.qml index 5f67f54c39..d0fd3d0846 100644 --- a/plugins/3MFReader/WorkspaceDialog.qml +++ b/plugins/3MFReader/WorkspaceDialog.qml @@ -2,7 +2,7 @@ // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.10 -import QtQuick.Controls 2.3 +import QtQuick.Controls 1.4 import QtQuick.Layouts 1.3 import QtQuick.Window 2.2 @@ -20,7 +20,6 @@ UM.Dialog property int comboboxHeight: 15 * screenScaleFactor property int spacerHeight: 10 * screenScaleFactor - property int doubleSpacerHeight: 20 * screenScaleFactor onClosing: manager.notifyClosed() onVisibleChanged: @@ -36,7 +35,7 @@ UM.Dialog Item { anchors.fill: parent - anchors.margins: 10 * screenScaleFactor + anchors.margins: 20 * screenScaleFactor UM.I18nCatalog { @@ -80,7 +79,7 @@ UM.Dialog } Item // Spacer { - height: doubleSpacerHeight + height: spacerHeight width: height } @@ -102,54 +101,36 @@ UM.Dialog } UM.TooltipArea { - id: machineResolveStrategyTooltip + id: machineResolveTooltip width: (parent.width / 3) | 0 height: visible ? comboboxHeight : 0 - visible: base.visible && machineResolveComboBox.model.count > 1 + visible: manager.machineConflict text: catalog.i18nc("@info:tooltip", "How should the conflict in the machine be resolved?") ComboBox { - id: machineResolveComboBox - model: manager.updatableMachinesModel - visible: machineResolveStrategyTooltip.visible - textRole: "displayName" - width: parent.width - onCurrentIndexChanged: + model: ListModel { - if (model.getItem(currentIndex).id == "new" - && model.getItem(currentIndex).type == "default_option") + Component.onCompleted: { - manager.setResolveStrategy("machine", "new") - } - else - { - manager.setResolveStrategy("machine", "override") - manager.setMachineToOverride(model.getItem(currentIndex).id) + append({"key": "override", "label": catalog.i18nc("@action:ComboBox option", "Update") + " " + manager.machineName}); + append({"key": "new", "label": catalog.i18nc("@action:ComboBox option", "Create new")}); } } - - onVisibleChanged: + Connections { - if (!visible) {return} - - currentIndex = 0 - // If the project printer exists in Cura, set it as the default dropdown menu option. - // No need to check object 0, which is the "Create new" option - for (var i = 1; i < model.count; i++) + target: manager + onMachineNameChanged: { - if (model.getItem(i).name == manager.machineName) - { - currentIndex = i - break - } - } - // The project printer does not exist in Cura. If there is at least one printer of the same - // type, select the first one, else set the index to "Create new" - if (currentIndex == 0 && model.count > 1) - { - currentIndex = 1 + machineResolveComboBox.model.get(0).label = catalog.i18nc("@action:ComboBox option", "Update") + " " + manager.machineName; } } + textRole: "label" + id: machineResolveComboBox + width: parent.width + onActivated: + { + manager.setResolveStrategy("machine", resolveStrategiesModel.get(index).key) + } } } } @@ -187,7 +168,7 @@ UM.Dialog Item // Spacer { - height: doubleSpacerHeight + height: spacerHeight width: height } Row @@ -290,7 +271,7 @@ UM.Dialog } Item // Spacer { - height: doubleSpacerHeight + height: spacerHeight width: height } Row @@ -352,7 +333,7 @@ UM.Dialog Item // Spacer { - height: doubleSpacerHeight + height: spacerHeight width: height } diff --git a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py index 7865e7b6ae..f4041b8650 100644 --- a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py +++ b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py @@ -1101,7 +1101,7 @@ class ChangeAtZProcessor: # if it's not a linear move, we don't care if linear_command is None: - return line + return # get our linear move parameters feed_rate = linear_command.Arguments["F"] @@ -1120,8 +1120,7 @@ class ChangeAtZProcessor: new_line = self.processRetractFeedRate(extrude_length, feed_rate, new_line, x_coord, y_coord, z_coord) # handle print speed adjustments - if extrude_length is not None: # Only for extrusion moves. - new_line = self.processPrintSpeed(feed_rate, new_line) + new_line = self.processPrintSpeed(feed_rate, new_line) # set our current extrude position self.LastE = extrude_length if extrude_length is not None else self.LastE diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index f594fefbe5..b720fc5758 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -32,7 +32,6 @@ class SimulationPass(RenderPass): self._current_shader = None # This shader will be the shadow or the normal depending if the user wants to see the paths or the layers self._tool_handle_shader = None self._nozzle_shader = None - self._disabled_shader = None self._old_current_layer = 0 self._old_current_path = 0 self._switching_layers = True # It tracks when the user is moving the layers' slider @@ -91,17 +90,9 @@ class SimulationPass(RenderPass): self._nozzle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) self._nozzle_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_nozzle").getRgb())) - if not self._disabled_shader: - self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "striped.shader")) - self._disabled_shader.setUniformValue("u_diffuseColor1", Color(*Application.getInstance().getTheme().getColor("model_unslicable").getRgb())) - self._disabled_shader.setUniformValue("u_diffuseColor2", Color(*Application.getInstance().getTheme().getColor("model_unslicable_alt").getRgb())) - self._disabled_shader.setUniformValue("u_width", 50.0) - self._disabled_shader.setUniformValue("u_opacity", 0.6) - self.bind() tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay, backface_cull = True) - disabled_batch = RenderBatch(self._disabled_shader) head_position = None # Indicates the current position of the print head nozzle_node = None @@ -114,9 +105,6 @@ class SimulationPass(RenderPass): nozzle_node = node nozzle_node.setVisible(False) - elif getattr(node, "_outside_buildarea", False) and isinstance(node, SceneNode) and node.getMeshData() and node.isVisible(): - disabled_batch.addItem(node.getWorldTransformation(copy=False), node.getMeshData()) - elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: @@ -195,9 +183,6 @@ class SimulationPass(RenderPass): nozzle_batch.addItem(nozzle_node.getWorldTransformation(), mesh = nozzle_node.getMeshData()) nozzle_batch.render(self._scene.getActiveCamera()) - if len(disabled_batch.items) > 0: - disabled_batch.render(self._scene.getActiveCamera()) - # Render toolhandles on top of the layerview if len(tool_handle_batch.items) > 0: tool_handle_batch.render(self._scene.getActiveCamera()) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 508476095d..d18cf4739e 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -1,6 +1,5 @@ -# Copyright (c) 2020 Ultimaker B.V. +# Copyright (c) 2019 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. - import os from typing import Dict, List, Optional, Set @@ -38,7 +37,7 @@ class CloudOutputDeviceManager: SYNC_SERVICE_NAME = "CloudOutputDeviceManager" # The translation catalog for this device. - i18n_catalog = i18nCatalog("cura") + I18N_CATALOG = i18nCatalog("cura") # Signal emitted when the list of discovered devices changed. discoveredDevicesChanged = Signal() @@ -222,7 +221,7 @@ class CloudOutputDeviceManager: ) message = Message( - title = self.i18n_catalog.i18ncp( + title = self.I18N_CATALOG.i18ncp( "info:status", "New printer detected from your Ultimaker account", "New printers detected from your Ultimaker account", @@ -235,7 +234,11 @@ class CloudOutputDeviceManager: message.show() for idx, device in enumerate(new_devices): - message_text = self.i18n_catalog.i18nc("info:status Filled in with printer name and printer model.", "Adding printer {name} ({model}) from your account").format(name = device.name, model = device.printerTypeName) + message_text = self.I18N_CATALOG.i18nc( + "info:status", "Adding printer {} ({}) from your account", + device.name, + device.printerTypeName + ) message.setText(message_text) if len(new_devices) > 1: message.setProgress((idx / len(new_devices)) * 100) @@ -252,12 +255,16 @@ class CloudOutputDeviceManager: if len(new_devices) > max_disp_devices: num_hidden = len(new_devices) - max_disp_devices device_name_list = ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices[0:max_disp_devices]] - device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{0} gets replaced by a number of printers", "... and {0} other", "... and {0} others", num_hidden) + "
  • ") + device_name_list.append(self.I18N_CATALOG.i18nc("info:hidden list items", "
  • ... and {} others
  • ", num_hidden)) device_names = "".join(device_name_list) else: device_names = "".join(["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices]) - message_text = self.i18n_catalog.i18nc("info:status", "Printers added from Digital Factory:") + "
      " + device_names + "
    " + message_text = self.I18N_CATALOG.i18nc( + "info:status", + "Printers added from Digital Factory:
      {}
    ", + device_names + ) message.setText(message_text) def _updateOutdatedMachine(self, outdated_machine: GlobalStack, new_cloud_output_device: CloudOutputDevice) -> None: @@ -311,7 +318,7 @@ class CloudOutputDeviceManager: # Generate message self._removed_printers_message = Message( - title = self.i18n_catalog.i18ncp( + title = self.I18N_CATALOG.i18ncp( "info:status", "A cloud connection is not available for a printer", "A cloud connection is not available for some printers", @@ -319,27 +326,26 @@ class CloudOutputDeviceManager: ) ) device_names = "".join(["
  • {} ({})
  • ".format(self._um_cloud_printers[device].name, self._um_cloud_printers[device].definition.name) for device in self.reported_device_ids]) - message_text = self.i18n_catalog.i18ncp( + message_text = self.I18N_CATALOG.i18ncp( "info:status", "This printer is not linked to the Digital Factory:", "These printers are not linked to the Digital Factory:", len(self.reported_device_ids) ) - message_text += "
      {}

    ".format(device_names) - digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") - - message_text += self.i18n_catalog.i18nc( + message_text += self.I18N_CATALOG.i18nc( "info:status", - "To establish a connection, please visit the {website_link}".format(website_link = "{}.".format(digital_factory_string)) + "
      {}
    To establish a connection, please visit the " + "Ultimaker Digital Factory.", + device_names ) self._removed_printers_message.setText(message_text) self._removed_printers_message.addAction("keep_printer_configurations_action", - name = self.i18n_catalog.i18nc("@action:button", "Keep printer configurations"), + name = self.I18N_CATALOG.i18nc("@action:button", "Keep printer configurations"), icon = "", description = "Keep cloud printers in Ultimaker Cura when not connected to your account.", button_align = Message.ActionButtonAlignment.ALIGN_RIGHT) self._removed_printers_message.addAction("remove_printers_action", - name = self.i18n_catalog.i18nc("@action:button", "Remove printers"), + name = self.I18N_CATALOG.i18nc("@action:button", "Remove printers"), icon = "", description = "Remove cloud printer(s) which aren't linked to your account.", button_style = Message.ActionButtonStyle.SECONDARY, @@ -416,12 +422,13 @@ class CloudOutputDeviceManager: machine.setMetaDataEntry(self.META_HOST_GUID, device.clusterData.host_guid) machine.setMetaDataEntry("group_name", device.name) machine.setMetaDataEntry("group_size", device.clusterSize) - digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") - digital_factory_link = "{digital_factory_string}".format(digital_factory_string = digital_factory_string) - removal_warning_string = self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "{printer_name} will be removed until the next account sync.").format(printer_name = device.name) \ - + "
    " + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "To remove {printer_name} permanently, visit {digital_factory_link}").format(printer_name = device.name, digital_factory_link = digital_factory_link) \ - + "

    " + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "Are you sure you want to remove {printer_name} temporarily?").format(printer_name = device.name) - machine.setMetaDataEntry("removal_warning", removal_warning_string) + machine.setMetaDataEntry("removal_warning", self.I18N_CATALOG.i18nc( + "@label ({} is printer name)", + "{} will be removed until the next account sync.
    To remove {} permanently, " + "visit Ultimaker Digital Factory. " + "

    Are you sure you want to remove {} temporarily?", + device.name, device.name, device.name + )) machine.addConfiguredConnectionType(device.connectionType.value) def _connectToOutputDevice(self, device: CloudOutputDevice, machine: GlobalStack) -> None: @@ -457,15 +464,10 @@ class CloudOutputDeviceManager: remove_printers_ids = {self._um_cloud_printers[i].getId() for i in self.reported_device_ids} all_ids = {m.getId() for m in CuraApplication.getInstance().getContainerRegistry().findContainerStacks(type = "machine")} - question_title = self.i18n_catalog.i18nc("@title:window", "Remove printers?") - question_content = self.i18n_catalog.i18ncp( - "@label", - "You are about to remove {num_printers} printer from Cura. This action cannot be undone.\nAre you sure you want to continue?", - "You are about to remove {num_printers} printers from Cura. This action cannot be undone.\nAre you sure you want to continue?", - len(remove_printers_ids) - ).format(num_printers = len(remove_printers_ids)) + question_title = self.I18N_CATALOG.i18nc("@title:window", "Remove printers?") + question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove {} printer(s) from Cura. This action cannot be undone. \nAre you sure you want to continue?".format(len(remove_printers_ids))) if remove_printers_ids == all_ids: - question_content = self.i18n_catalog.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone.\nAre you sure you want to continue?") + question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone. \nAre you sure you want to continue?") result = QMessageBox.question(None, question_title, question_content) if result == QMessageBox.No: return diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index c2e3571a62..65a450b16f 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6152,7 +6152,7 @@ "infill_mesh_order": { "label": "Mesh Processing Rank", - "description": "Determines the priority of this mesh when considering multiple overlapping infill meshes. Areas where multiple infill meshes overlap will take on the settings of the mesh with the lowest rank. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes.", + "description": "Determines the priority of this mesh when considering overlapping volumes. Areas where multiple meshes reside will be won by the lower rank mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes.", "default_value": 0, "value": "1 if infill_mesh else 0", "minimum_value_warning": "1", diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index c879ff53fd..4befa1b22a 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -104,6 +104,16 @@ Popup anchors.left: parent.left anchors.right: parent.right + // We set it by means of a binding, since then we can use the when condition, which we need to + // prevent a binding loop. + Binding + { + target: parent + property: "height" + value: parent.childrenRect.height + when: parent.visibleChildren.length > 0 + } + // Add the qualities that belong to the intent Repeater { diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index 91f044ceed..41d68aef37 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2020 Ultimaker B.V. +// Copyright (c) 2019 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.7 @@ -11,7 +11,7 @@ UM.PointingRectangle id: base property real sourceWidth: 0 width: UM.Theme.getSize("tooltip").width - height: textScroll.height + UM.Theme.getSize("tooltip_margins").height * 2 + height: label.height + UM.Theme.getSize("tooltip_margins").height * 2 color: UM.Theme.getColor("tooltip") arrowSize: UM.Theme.getSize("default_arrow").width @@ -59,48 +59,22 @@ UM.PointingRectangle base.opacity = 0; } - MouseArea + Label { - enabled: parent.opacity > 0 - visible: enabled - anchors.fill: parent - acceptedButtons: Qt.NoButton - hoverEnabled: true - onHoveredChanged: + id: label; + anchors { - if(containsMouse && base.opacity > 0) - { - base.show(Qt.point(target.x - 1, target.y - UM.Theme.getSize("tooltip_arrow_margins").height / 2)); //Same arrow position as before. - } - else - { - base.hide(); - } - } - - ScrollView - { - id: textScroll - width: parent.width - height: Math.min(label.height, base.parent.height) - - ScrollBar.horizontal: ScrollBar { - active: false //Only allow vertical scrolling. We should grow vertically only, but due to how the label is positioned it allocates space in the ScrollView horizontally. - } - - Label - { - id: label - x: UM.Theme.getSize("tooltip_margins").width - y: UM.Theme.getSize("tooltip_margins").height - width: base.width - UM.Theme.getSize("tooltip_margins").width * 2 - - wrapMode: Text.Wrap; - textFormat: Text.RichText - font: UM.Theme.getFont("default"); - color: UM.Theme.getColor("tooltip_text"); - renderType: Text.NativeRendering - } + top: parent.top; + topMargin: UM.Theme.getSize("tooltip_margins").height; + left: parent.left; + leftMargin: UM.Theme.getSize("tooltip_margins").width; + right: parent.right; + rightMargin: UM.Theme.getSize("tooltip_margins").width; } + wrapMode: Text.Wrap; + textFormat: Text.RichText + font: UM.Theme.getFont("default"); + color: UM.Theme.getColor("tooltip_text"); + renderType: Text.NativeRendering } } diff --git a/resources/shaders/striped.shader b/resources/shaders/striped.shader index 07ce2bebe6..71b1f7b0fa 100644 --- a/resources/shaders/striped.shader +++ b/resources/shaders/striped.shader @@ -29,7 +29,6 @@ fragment = uniform mediump vec4 u_diffuseColor1; uniform mediump vec4 u_diffuseColor2; uniform mediump vec4 u_specularColor; - uniform mediump float u_opacity; uniform highp vec3 u_lightPosition; uniform mediump float u_shininess; uniform highp vec3 u_viewPosition; @@ -66,7 +65,7 @@ fragment = finalColor += pow(NdotR, u_shininess) * u_specularColor; gl_FragColor = finalColor; - gl_FragColor.a = u_opacity; + gl_FragColor.a = 1.0; } vertex41core = @@ -101,7 +100,6 @@ fragment41core = uniform mediump vec4 u_diffuseColor1; uniform mediump vec4 u_diffuseColor2; uniform mediump vec4 u_specularColor; - uniform mediump float u_opacity; uniform highp vec3 u_lightPosition; uniform mediump float u_shininess; uniform highp vec3 u_viewPosition; @@ -140,7 +138,7 @@ fragment41core = finalColor += pow(NdotR, u_shininess) * u_specularColor; frag_color = finalColor; - frag_color.a = u_opacity; + frag_color.a = 1.0; } [defaults] @@ -148,7 +146,6 @@ u_ambientColor = [0.3, 0.3, 0.3, 1.0] u_diffuseColor1 = [1.0, 0.5, 0.5, 1.0] u_diffuseColor2 = [0.5, 0.5, 0.5, 1.0] u_specularColor = [0.4, 0.4, 0.4, 1.0] -u_opacity = 1.0 u_shininess = 20.0 u_width = 5.0 u_vertical_stripes = 0 From af05aa61b79071e1a0ba77bd5340bb19cf0e16f4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 14 Aug 2020 10:00:33 +0200 Subject: [PATCH 46/47] Remove unneeded binding This binding wasn't needed to prevent a binding loop, but it did cause the length to not be updated correctly sometimes CURA-7589 --- .../Custom/QualitiesWithIntentMenu.qml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index 4befa1b22a..c879ff53fd 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -104,16 +104,6 @@ Popup anchors.left: parent.left anchors.right: parent.right - // We set it by means of a binding, since then we can use the when condition, which we need to - // prevent a binding loop. - Binding - { - target: parent - property: "height" - value: parent.childrenRect.height - when: parent.visibleChildren.length > 0 - } - // Add the qualities that belong to the intent Repeater { From 9ea418c0a1bcb5645a61b9534c61381e8c618e3a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 20 Aug 2020 16:35:52 +0200 Subject: [PATCH 47/47] Revert "Revert "Merge branch '4.7' of github.com:Ultimaker/Cura into 4.7"" This reverts commit 28f4d8513db7efce17bfd8b80fa7c8b237fd1c18. The original revert was to revert an accidental merge from master to 4.7. This now reverts the revert on Master, so that we still have those changes on Master. --- cura/Machines/Models/GlobalStacksModel.py | 4 +- cura/PreviewPass.py | 2 +- plugins/3MFReader/ThreeMFWorkspaceReader.py | 30 +++-- plugins/3MFReader/UpdatableMachinesModel.py | 43 +++++++ plugins/3MFReader/WorkspaceDialog.py | 120 +++++++++++------- plugins/3MFReader/WorkspaceDialog.qml | 73 +++++++---- .../PostProcessingPlugin/scripts/ChangeAtZ.py | 5 +- plugins/SimulationView/SimulationPass.py | 15 +++ .../src/Cloud/CloudOutputDeviceManager.py | 62 +++++---- resources/definitions/fdmprinter.def.json | 2 +- resources/qml/PrintSetupTooltip.qml | 58 ++++++--- resources/shaders/striped.shader | 7 +- 12 files changed, 278 insertions(+), 143 deletions(-) create mode 100644 plugins/3MFReader/UpdatableMachinesModel.py diff --git a/cura/Machines/Models/GlobalStacksModel.py b/cura/Machines/Models/GlobalStacksModel.py index 6d091659a8..712597c2e7 100644 --- a/cura/Machines/Models/GlobalStacksModel.py +++ b/cura/Machines/Models/GlobalStacksModel.py @@ -72,8 +72,8 @@ class GlobalStacksModel(ListModel): section_name = self._catalog.i18nc("@info:title", section_name) default_removal_warning = self._catalog.i18nc( - "@label ({} is object name)", - "Are you sure you wish to remove {}? This cannot be undone!", device_name + "@label {0} is the name of a printer that's about to be deleted.", + "Are you sure you wish to remove {0}? This cannot be undone!", device_name ) removal_warning = container_stack.getMetaDataEntry("removal_warning", default_removal_warning) diff --git a/cura/PreviewPass.py b/cura/PreviewPass.py index ba139bb2b3..47e8c367dc 100644 --- a/cura/PreviewPass.py +++ b/cura/PreviewPass.py @@ -76,8 +76,8 @@ class PreviewPass(RenderPass): Logger.error("Unable to compile shader program: overhang.shader") if not self._non_printing_shader: + self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader")) if self._non_printing_shader: - self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader")) self._non_printing_shader.setUniformValue("u_diffuseColor", [0.5, 0.5, 0.5, 0.5]) self._non_printing_shader.setUniformValue("u_opacity", 0.6) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 6ed35fe72c..3ed005f131 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -133,12 +133,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # In Cura 2.5 and 2.6, the empty profiles used to have those long names self._old_empty_profile_id_dict = {"empty_%s" % k: "empty" for k in ["material", "variant"]} - self._is_same_machine_type = False self._old_new_materials = {} # type: Dict[str, str] self._machine_info = None def _clearState(self): - self._is_same_machine_type = False self._id_mapping = {} self._old_new_materials = {} self._machine_info = None @@ -229,6 +227,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Read definition containers # machine_definition_id = None + updatable_machines = [] machine_definition_container_count = 0 extruder_definition_container_count = 0 definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)] @@ -245,6 +244,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): definition_container_type = definition_container.get("type") if definition_container_type == "machine": machine_definition_id = container_id + machine_definition_containers = self._container_registry.findDefinitionContainers(id = machine_definition_id) + if machine_definition_containers: + updatable_machines = [machine for machine in self._container_registry.findContainerStacks(type = "machine") if machine.definition == machine_definition_containers[0]] machine_type = definition_container["name"] variant_type_name = definition_container.get("variants_name", variant_type_name) @@ -386,8 +388,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): machine_definition_id = id_list[7] stacks = self._container_registry.findContainerStacks(name = machine_name, type = "machine") - self._is_same_machine_type = True existing_global_stack = None + global_stack = None if stacks: global_stack = stacks[0] @@ -400,7 +402,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if global_stack.getContainer(index).getId() != container_id: machine_conflict = True break - self._is_same_machine_type = global_stack.definition.getId() == machine_definition_id + + if updatable_machines and not containers_found_dict["machine"]: + containers_found_dict["machine"] = True # Get quality type parser = ConfigParser(interpolation = None) @@ -485,7 +489,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if intent_id not in ("empty", "empty_intent"): extruder_info.intent_info = instance_container_info_dict[intent_id] - if not machine_conflict and containers_found_dict["machine"]: + if not machine_conflict and containers_found_dict["machine"] and global_stack: if int(position) >= len(global_stack.extruderList): continue @@ -558,9 +562,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._machine_info.custom_quality_name = quality_name self._machine_info.intent_category = intent_category - if machine_conflict and not self._is_same_machine_type: - machine_conflict = False - is_printer_group = False if machine_conflict: group_name = existing_global_stack.getMetaDataEntry("group_name") @@ -581,6 +582,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._dialog.setNumSettingsOverriddenByQualityChanges(num_settings_overridden_by_quality_changes) self._dialog.setNumUserSettings(num_user_settings) self._dialog.setActiveMode(active_mode) + self._dialog.setUpdatableMachines(updatable_machines) self._dialog.setMachineName(machine_name) self._dialog.setMaterialLabels(material_labels) self._dialog.setMachineType(machine_type) @@ -661,8 +663,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): application.expandedCategoriesChanged.emit() # Notify the GUI of the change - # If a machine with the same name is of a different type, always create a new one. - if not self._is_same_machine_type or self._resolve_strategies["machine"] != "override": + # If there are no machines of the same type, create a new machine. + if self._resolve_strategies["machine"] != "override" or self._dialog.updatableMachinesModel.count <= 1: # We need to create a new machine machine_name = self._container_registry.uniqueName(self._machine_info.name) @@ -677,10 +679,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._container_registry.addContainer(global_stack) else: - # Find the machine - global_stacks = self._container_registry.findContainerStacks(name = self._machine_info.name, type = "machine") + # Find the machine which will be overridden + global_stacks = self._container_registry.findContainerStacks(id = self._dialog.getMachineToOverride(), type = "machine") if not global_stacks: - message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag !", "Project file {0} is made using profiles that are unknown to this version of Ultimaker Cura.", file_name)) + message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag !", + "Project file {0} is made using profiles that" + " are unknown to this version of Ultimaker Cura.", file_name)) message.show() self.setWorkspaceName("") return [], {} diff --git a/plugins/3MFReader/UpdatableMachinesModel.py b/plugins/3MFReader/UpdatableMachinesModel.py new file mode 100644 index 0000000000..a332c669e6 --- /dev/null +++ b/plugins/3MFReader/UpdatableMachinesModel.py @@ -0,0 +1,43 @@ +# Copyright (c) 2020 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from typing import Dict, List + +from PyQt5.QtCore import Qt + +from UM.Qt.ListModel import ListModel +from cura.Settings.GlobalStack import GlobalStack + +create_new_list_item = { + "id": "new", + "name": "Create new", + "displayName": "Create new", + "type": "default_option" # to make sure we are not mixing the "Create new" option with a printer with id "new" +} # type: Dict[str, str] + + +class UpdatableMachinesModel(ListModel): + """Model that holds cura packages. + + By setting the filter property the instances held by this model can be changed. + """ + + def __init__(self, parent = None) -> None: + super().__init__(parent) + + self.addRoleName(Qt.UserRole + 1, "id") + self.addRoleName(Qt.UserRole + 2, "name") + self.addRoleName(Qt.UserRole + 3, "displayName") + self.addRoleName(Qt.UserRole + 4, "type") # Either "default_option" or "machine" + + def update(self, machines: List[GlobalStack]) -> None: + items = [create_new_list_item] # type: List[Dict[str, str]] + + for machine in sorted(machines, key = lambda printer: printer.name): + items.append({ + "id": machine.id, + "name": machine.name, + "displayName": "Update " + machine.name, + "type": "machine" + }) + self.setItems(items) diff --git a/plugins/3MFReader/WorkspaceDialog.py b/plugins/3MFReader/WorkspaceDialog.py index 3c97146583..8d59ec1339 100644 --- a/plugins/3MFReader/WorkspaceDialog.py +++ b/plugins/3MFReader/WorkspaceDialog.py @@ -1,5 +1,6 @@ -# Copyright (c) 2016 Ultimaker B.V. +# Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from typing import List, Optional, Dict, cast from PyQt5.QtCore import pyqtSignal, QObject, pyqtProperty, QCoreApplication from UM.FlameProfiler import pyqtSlot @@ -7,10 +8,15 @@ from UM.PluginRegistry import PluginRegistry from UM.Application import Application from UM.i18n import i18nCatalog from UM.Settings.ContainerRegistry import ContainerRegistry +from cura.Settings.GlobalStack import GlobalStack +from .UpdatableMachinesModel import UpdatableMachinesModel import os import threading import time + +from cura.CuraApplication import CuraApplication + i18n_catalog = i18nCatalog("cura") @@ -29,6 +35,7 @@ class WorkspaceDialog(QObject): "quality_changes": self._default_strategy, "definition_changes": self._default_strategy, "material": self._default_strategy} + self._override_machine = None self._visible = False self.showDialogSignal.connect(self.__show) @@ -51,6 +58,7 @@ class WorkspaceDialog(QObject): self._extruders = [] self._objects_on_plate = False self._is_printer_group = False + self._updatable_machines_model = UpdatableMachinesModel(self) machineConflictChanged = pyqtSignal() qualityChangesConflictChanged = pyqtSignal() @@ -63,6 +71,7 @@ class WorkspaceDialog(QObject): qualityTypeChanged = pyqtSignal() intentNameChanged = pyqtSignal() machineNameChanged = pyqtSignal() + updatableMachinesChanged = pyqtSignal() materialLabelsChanged = pyqtSignal() objectsOnPlateChanged = pyqtSignal() numUserSettingsChanged = pyqtSignal() @@ -81,33 +90,33 @@ class WorkspaceDialog(QObject): self.isPrinterGroupChanged.emit() @pyqtProperty(str, notify=variantTypeChanged) - def variantType(self): + def variantType(self) -> str: return self._variant_type - def setVariantType(self, variant_type): + def setVariantType(self, variant_type: str) -> None: if self._variant_type != variant_type: self._variant_type = variant_type self.variantTypeChanged.emit() @pyqtProperty(str, notify=machineTypeChanged) - def machineType(self): + def machineType(self) -> str: return self._machine_type - def setMachineType(self, machine_type): + def setMachineType(self, machine_type: str) -> None: self._machine_type = machine_type self.machineTypeChanged.emit() - def setNumUserSettings(self, num_user_settings): + def setNumUserSettings(self, num_user_settings: int) -> None: if self._num_user_settings != num_user_settings: self._num_user_settings = num_user_settings self.numVisibleSettingsChanged.emit() @pyqtProperty(int, notify=numUserSettingsChanged) - def numUserSettings(self): + def numUserSettings(self) -> int: return self._num_user_settings @pyqtProperty(bool, notify=objectsOnPlateChanged) - def hasObjectsOnPlate(self): + def hasObjectsOnPlate(self) -> bool: return self._objects_on_plate def setHasObjectsOnPlate(self, objects_on_plate): @@ -116,10 +125,10 @@ class WorkspaceDialog(QObject): self.objectsOnPlateChanged.emit() @pyqtProperty("QVariantList", notify = materialLabelsChanged) - def materialLabels(self): + def materialLabels(self) -> List[str]: return self._material_labels - def setMaterialLabels(self, material_labels): + def setMaterialLabels(self, material_labels: List[str]) -> None: if self._material_labels != material_labels: self._material_labels = material_labels self.materialLabelsChanged.emit() @@ -134,36 +143,44 @@ class WorkspaceDialog(QObject): self.extrudersChanged.emit() @pyqtProperty(str, notify = machineNameChanged) - def machineName(self): + def machineName(self) -> str: return self._machine_name - def setMachineName(self, machine_name): + def setMachineName(self, machine_name: str) -> None: if self._machine_name != machine_name: self._machine_name = machine_name self.machineNameChanged.emit() + @pyqtProperty(QObject, notify = updatableMachinesChanged) + def updatableMachinesModel(self) -> UpdatableMachinesModel: + return cast(UpdatableMachinesModel, self._updatable_machines_model) + + def setUpdatableMachines(self, updatable_machines: List[GlobalStack]) -> None: + self._updatable_machines_model.update(updatable_machines) + self.updatableMachinesChanged.emit() + @pyqtProperty(str, notify=qualityTypeChanged) - def qualityType(self): + def qualityType(self) -> str: return self._quality_type - def setQualityType(self, quality_type): + def setQualityType(self, quality_type: str) -> None: if self._quality_type != quality_type: self._quality_type = quality_type self.qualityTypeChanged.emit() @pyqtProperty(int, notify=numSettingsOverridenByQualityChangesChanged) - def numSettingsOverridenByQualityChanges(self): + def numSettingsOverridenByQualityChanges(self) -> int: return self._num_settings_overridden_by_quality_changes - def setNumSettingsOverriddenByQualityChanges(self, num_settings_overridden_by_quality_changes): + def setNumSettingsOverriddenByQualityChanges(self, num_settings_overridden_by_quality_changes: int) -> None: self._num_settings_overridden_by_quality_changes = num_settings_overridden_by_quality_changes self.numSettingsOverridenByQualityChangesChanged.emit() @pyqtProperty(str, notify=qualityNameChanged) - def qualityName(self): + def qualityName(self) -> str: return self._quality_name - def setQualityName(self, quality_name): + def setQualityName(self, quality_name: str) -> None: if self._quality_name != quality_name: self._quality_name = quality_name self.qualityNameChanged.emit() @@ -178,80 +195,87 @@ class WorkspaceDialog(QObject): self.intentNameChanged.emit() @pyqtProperty(str, notify=activeModeChanged) - def activeMode(self): + def activeMode(self) -> str: return self._active_mode - def setActiveMode(self, active_mode): + def setActiveMode(self, active_mode: int) -> None: if active_mode == 0: self._active_mode = i18n_catalog.i18nc("@title:tab", "Recommended") else: self._active_mode = i18n_catalog.i18nc("@title:tab", "Custom") self.activeModeChanged.emit() - @pyqtProperty(int, notify = hasVisibleSettingsFieldChanged) - def hasVisibleSettingsField(self): + @pyqtProperty(bool, notify = hasVisibleSettingsFieldChanged) + def hasVisibleSettingsField(self) -> bool: return self._has_visible_settings_field - def setHasVisibleSettingsField(self, has_visible_settings_field): + def setHasVisibleSettingsField(self, has_visible_settings_field: bool) -> None: self._has_visible_settings_field = has_visible_settings_field self.hasVisibleSettingsFieldChanged.emit() @pyqtProperty(int, constant = True) - def totalNumberOfSettings(self): + def totalNumberOfSettings(self) -> int: general_definition_containers = ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter") if not general_definition_containers: return 0 return len(general_definition_containers[0].getAllKeys()) @pyqtProperty(int, notify = numVisibleSettingsChanged) - def numVisibleSettings(self): + def numVisibleSettings(self) -> int: return self._num_visible_settings - def setNumVisibleSettings(self, num_visible_settings): + def setNumVisibleSettings(self, num_visible_settings: int) -> None: if self._num_visible_settings != num_visible_settings: self._num_visible_settings = num_visible_settings self.numVisibleSettingsChanged.emit() @pyqtProperty(bool, notify = machineConflictChanged) - def machineConflict(self): + def machineConflict(self) -> bool: return self._has_machine_conflict @pyqtProperty(bool, notify=qualityChangesConflictChanged) - def qualityChangesConflict(self): + def qualityChangesConflict(self) -> bool: return self._has_quality_changes_conflict @pyqtProperty(bool, notify=materialConflictChanged) - def materialConflict(self): + def materialConflict(self) -> bool: return self._has_material_conflict @pyqtSlot(str, str) - def setResolveStrategy(self, key, strategy): + def setResolveStrategy(self, key: str, strategy: Optional[str]) -> None: if key in self._result: self._result[key] = strategy + def getMachineToOverride(self) -> str: + return self._override_machine + + @pyqtSlot(str) + def setMachineToOverride(self, machine_name: str) -> None: + self._override_machine = machine_name + @pyqtSlot() - def closeBackend(self): + def closeBackend(self) -> None: """Close the backend: otherwise one could end up with "Slicing...""" Application.getInstance().getBackend().close() - def setMaterialConflict(self, material_conflict): + def setMaterialConflict(self, material_conflict: bool) -> None: if self._has_material_conflict != material_conflict: self._has_material_conflict = material_conflict self.materialConflictChanged.emit() - def setMachineConflict(self, machine_conflict): + def setMachineConflict(self, machine_conflict: bool) -> None: if self._has_machine_conflict != machine_conflict: self._has_machine_conflict = machine_conflict self.machineConflictChanged.emit() - def setQualityChangesConflict(self, quality_changes_conflict): + def setQualityChangesConflict(self, quality_changes_conflict: bool) -> None: if self._has_quality_changes_conflict != quality_changes_conflict: self._has_quality_changes_conflict = quality_changes_conflict self.qualityChangesConflictChanged.emit() - def getResult(self): - if "machine" in self._result and not self._has_machine_conflict: + def getResult(self) -> Dict[str, Optional[str]]: + if "machine" in self._result and self.updatableMachinesModel.count <= 1: self._result["machine"] = None if "quality_changes" in self._result and not self._has_quality_changes_conflict: self._result["quality_changes"] = None @@ -267,11 +291,13 @@ class WorkspaceDialog(QObject): return self._result - def _createViewFromQML(self): - path = os.path.join(PluginRegistry.getInstance().getPluginPath("3MFReader"), self._qml_url) - self._view = Application.getInstance().createQmlComponent(path, {"manager": self}) + def _createViewFromQML(self) -> None: + three_mf_reader_path = PluginRegistry.getInstance().getPluginPath("3MFReader") + if three_mf_reader_path: + path = os.path.join(three_mf_reader_path, self._qml_url) + self._view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) - def show(self): + def show(self) -> None: # Emit signal so the right thread actually shows the view. if threading.current_thread() != threading.main_thread(): self._lock.acquire() @@ -284,7 +310,7 @@ class WorkspaceDialog(QObject): self.showDialogSignal.emit() @pyqtSlot() - def notifyClosed(self): + def notifyClosed(self) -> None: """Used to notify the dialog so the lock can be released.""" self._result = {} # The result should be cleared before hide, because after it is released the main thread lock @@ -294,7 +320,7 @@ class WorkspaceDialog(QObject): except: pass - def hide(self): + def hide(self) -> None: self._visible = False self._view.hide() try: @@ -303,7 +329,7 @@ class WorkspaceDialog(QObject): pass @pyqtSlot(bool) - def _onVisibilityChanged(self, visible): + def _onVisibilityChanged(self, visible: bool) -> None: if not visible: try: self._lock.release() @@ -311,17 +337,17 @@ class WorkspaceDialog(QObject): pass @pyqtSlot() - def onOkButtonClicked(self): + def onOkButtonClicked(self) -> None: self._view.hide() self.hide() @pyqtSlot() - def onCancelButtonClicked(self): + def onCancelButtonClicked(self) -> None: self._result = {} self._view.hide() self.hide() - def waitForClose(self): + def waitForClose(self) -> None: """Block thread until the dialog is closed.""" if self._visible: @@ -334,7 +360,7 @@ class WorkspaceDialog(QObject): time.sleep(1 / 50) QCoreApplication.processEvents() # Ensure that the GUI does not freeze. - def __show(self): + def __show(self) -> None: if self._view is None: self._createViewFromQML() if self._view: diff --git a/plugins/3MFReader/WorkspaceDialog.qml b/plugins/3MFReader/WorkspaceDialog.qml index d0fd3d0846..5f67f54c39 100644 --- a/plugins/3MFReader/WorkspaceDialog.qml +++ b/plugins/3MFReader/WorkspaceDialog.qml @@ -2,7 +2,7 @@ // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.10 -import QtQuick.Controls 1.4 +import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 import QtQuick.Window 2.2 @@ -20,6 +20,7 @@ UM.Dialog property int comboboxHeight: 15 * screenScaleFactor property int spacerHeight: 10 * screenScaleFactor + property int doubleSpacerHeight: 20 * screenScaleFactor onClosing: manager.notifyClosed() onVisibleChanged: @@ -35,7 +36,7 @@ UM.Dialog Item { anchors.fill: parent - anchors.margins: 20 * screenScaleFactor + anchors.margins: 10 * screenScaleFactor UM.I18nCatalog { @@ -79,7 +80,7 @@ UM.Dialog } Item // Spacer { - height: spacerHeight + height: doubleSpacerHeight width: height } @@ -101,35 +102,53 @@ UM.Dialog } UM.TooltipArea { - id: machineResolveTooltip + id: machineResolveStrategyTooltip width: (parent.width / 3) | 0 height: visible ? comboboxHeight : 0 - visible: manager.machineConflict + visible: base.visible && machineResolveComboBox.model.count > 1 text: catalog.i18nc("@info:tooltip", "How should the conflict in the machine be resolved?") ComboBox { - model: ListModel - { - Component.onCompleted: - { - append({"key": "override", "label": catalog.i18nc("@action:ComboBox option", "Update") + " " + manager.machineName}); - append({"key": "new", "label": catalog.i18nc("@action:ComboBox option", "Create new")}); - } - } - Connections - { - target: manager - onMachineNameChanged: - { - machineResolveComboBox.model.get(0).label = catalog.i18nc("@action:ComboBox option", "Update") + " " + manager.machineName; - } - } - textRole: "label" id: machineResolveComboBox + model: manager.updatableMachinesModel + visible: machineResolveStrategyTooltip.visible + textRole: "displayName" width: parent.width - onActivated: + onCurrentIndexChanged: { - manager.setResolveStrategy("machine", resolveStrategiesModel.get(index).key) + if (model.getItem(currentIndex).id == "new" + && model.getItem(currentIndex).type == "default_option") + { + manager.setResolveStrategy("machine", "new") + } + else + { + manager.setResolveStrategy("machine", "override") + manager.setMachineToOverride(model.getItem(currentIndex).id) + } + } + + onVisibleChanged: + { + if (!visible) {return} + + currentIndex = 0 + // If the project printer exists in Cura, set it as the default dropdown menu option. + // No need to check object 0, which is the "Create new" option + for (var i = 1; i < model.count; i++) + { + if (model.getItem(i).name == manager.machineName) + { + currentIndex = i + break + } + } + // The project printer does not exist in Cura. If there is at least one printer of the same + // type, select the first one, else set the index to "Create new" + if (currentIndex == 0 && model.count > 1) + { + currentIndex = 1 + } } } } @@ -168,7 +187,7 @@ UM.Dialog Item // Spacer { - height: spacerHeight + height: doubleSpacerHeight width: height } Row @@ -271,7 +290,7 @@ UM.Dialog } Item // Spacer { - height: spacerHeight + height: doubleSpacerHeight width: height } Row @@ -333,7 +352,7 @@ UM.Dialog Item // Spacer { - height: spacerHeight + height: doubleSpacerHeight width: height } diff --git a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py index 42de199e8c..78e0e71626 100644 --- a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py +++ b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py @@ -1101,7 +1101,7 @@ class ChangeAtZProcessor: # if it's not a linear move, we don't care if linear_command is None: - return + return line # get our linear move parameters feed_rate = linear_command.arguments["F"] @@ -1120,7 +1120,8 @@ class ChangeAtZProcessor: new_line = self.processRetractFeedRate(extrude_length, feed_rate, new_line, x_coord, y_coord, z_coord) # handle print speed adjustments - new_line = self.processPrintSpeed(feed_rate, new_line) + if extrude_length is not None: # Only for extrusion moves. + new_line = self.processPrintSpeed(feed_rate, new_line) # set our current extrude position self.lastE = extrude_length if extrude_length is not None else self.lastE diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index b720fc5758..f594fefbe5 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -32,6 +32,7 @@ class SimulationPass(RenderPass): self._current_shader = None # This shader will be the shadow or the normal depending if the user wants to see the paths or the layers self._tool_handle_shader = None self._nozzle_shader = None + self._disabled_shader = None self._old_current_layer = 0 self._old_current_path = 0 self._switching_layers = True # It tracks when the user is moving the layers' slider @@ -90,9 +91,17 @@ class SimulationPass(RenderPass): self._nozzle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) self._nozzle_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_nozzle").getRgb())) + if not self._disabled_shader: + self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "striped.shader")) + self._disabled_shader.setUniformValue("u_diffuseColor1", Color(*Application.getInstance().getTheme().getColor("model_unslicable").getRgb())) + self._disabled_shader.setUniformValue("u_diffuseColor2", Color(*Application.getInstance().getTheme().getColor("model_unslicable_alt").getRgb())) + self._disabled_shader.setUniformValue("u_width", 50.0) + self._disabled_shader.setUniformValue("u_opacity", 0.6) + self.bind() tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay, backface_cull = True) + disabled_batch = RenderBatch(self._disabled_shader) head_position = None # Indicates the current position of the print head nozzle_node = None @@ -105,6 +114,9 @@ class SimulationPass(RenderPass): nozzle_node = node nozzle_node.setVisible(False) + elif getattr(node, "_outside_buildarea", False) and isinstance(node, SceneNode) and node.getMeshData() and node.isVisible(): + disabled_batch.addItem(node.getWorldTransformation(copy=False), node.getMeshData()) + elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: @@ -183,6 +195,9 @@ class SimulationPass(RenderPass): nozzle_batch.addItem(nozzle_node.getWorldTransformation(), mesh = nozzle_node.getMeshData()) nozzle_batch.render(self._scene.getActiveCamera()) + if len(disabled_batch.items) > 0: + disabled_batch.render(self._scene.getActiveCamera()) + # Render toolhandles on top of the layerview if len(tool_handle_batch.items) > 0: tool_handle_batch.render(self._scene.getActiveCamera()) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index d18cf4739e..508476095d 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -1,5 +1,6 @@ -# Copyright (c) 2019 Ultimaker B.V. +# Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. + import os from typing import Dict, List, Optional, Set @@ -37,7 +38,7 @@ class CloudOutputDeviceManager: SYNC_SERVICE_NAME = "CloudOutputDeviceManager" # The translation catalog for this device. - I18N_CATALOG = i18nCatalog("cura") + i18n_catalog = i18nCatalog("cura") # Signal emitted when the list of discovered devices changed. discoveredDevicesChanged = Signal() @@ -221,7 +222,7 @@ class CloudOutputDeviceManager: ) message = Message( - title = self.I18N_CATALOG.i18ncp( + title = self.i18n_catalog.i18ncp( "info:status", "New printer detected from your Ultimaker account", "New printers detected from your Ultimaker account", @@ -234,11 +235,7 @@ class CloudOutputDeviceManager: message.show() for idx, device in enumerate(new_devices): - message_text = self.I18N_CATALOG.i18nc( - "info:status", "Adding printer {} ({}) from your account", - device.name, - device.printerTypeName - ) + message_text = self.i18n_catalog.i18nc("info:status Filled in with printer name and printer model.", "Adding printer {name} ({model}) from your account").format(name = device.name, model = device.printerTypeName) message.setText(message_text) if len(new_devices) > 1: message.setProgress((idx / len(new_devices)) * 100) @@ -255,16 +252,12 @@ class CloudOutputDeviceManager: if len(new_devices) > max_disp_devices: num_hidden = len(new_devices) - max_disp_devices device_name_list = ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices[0:max_disp_devices]] - device_name_list.append(self.I18N_CATALOG.i18nc("info:hidden list items", "
  • ... and {} others
  • ", num_hidden)) + device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{0} gets replaced by a number of printers", "... and {0} other", "... and {0} others", num_hidden) + "
  • ") device_names = "".join(device_name_list) else: device_names = "".join(["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices]) - message_text = self.I18N_CATALOG.i18nc( - "info:status", - "Printers added from Digital Factory:
      {}
    ", - device_names - ) + message_text = self.i18n_catalog.i18nc("info:status", "Printers added from Digital Factory:") + "
      " + device_names + "
    " message.setText(message_text) def _updateOutdatedMachine(self, outdated_machine: GlobalStack, new_cloud_output_device: CloudOutputDevice) -> None: @@ -318,7 +311,7 @@ class CloudOutputDeviceManager: # Generate message self._removed_printers_message = Message( - title = self.I18N_CATALOG.i18ncp( + title = self.i18n_catalog.i18ncp( "info:status", "A cloud connection is not available for a printer", "A cloud connection is not available for some printers", @@ -326,26 +319,27 @@ class CloudOutputDeviceManager: ) ) device_names = "".join(["
  • {} ({})
  • ".format(self._um_cloud_printers[device].name, self._um_cloud_printers[device].definition.name) for device in self.reported_device_ids]) - message_text = self.I18N_CATALOG.i18ncp( + message_text = self.i18n_catalog.i18ncp( "info:status", "This printer is not linked to the Digital Factory:", "These printers are not linked to the Digital Factory:", len(self.reported_device_ids) ) - message_text += self.I18N_CATALOG.i18nc( + message_text += "
      {}

    ".format(device_names) + digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") + + message_text += self.i18n_catalog.i18nc( "info:status", - "
      {}
    To establish a connection, please visit the " - "Ultimaker Digital Factory.", - device_names + "To establish a connection, please visit the {website_link}".format(website_link = "{}.".format(digital_factory_string)) ) self._removed_printers_message.setText(message_text) self._removed_printers_message.addAction("keep_printer_configurations_action", - name = self.I18N_CATALOG.i18nc("@action:button", "Keep printer configurations"), + name = self.i18n_catalog.i18nc("@action:button", "Keep printer configurations"), icon = "", description = "Keep cloud printers in Ultimaker Cura when not connected to your account.", button_align = Message.ActionButtonAlignment.ALIGN_RIGHT) self._removed_printers_message.addAction("remove_printers_action", - name = self.I18N_CATALOG.i18nc("@action:button", "Remove printers"), + name = self.i18n_catalog.i18nc("@action:button", "Remove printers"), icon = "", description = "Remove cloud printer(s) which aren't linked to your account.", button_style = Message.ActionButtonStyle.SECONDARY, @@ -422,13 +416,12 @@ class CloudOutputDeviceManager: machine.setMetaDataEntry(self.META_HOST_GUID, device.clusterData.host_guid) machine.setMetaDataEntry("group_name", device.name) machine.setMetaDataEntry("group_size", device.clusterSize) - machine.setMetaDataEntry("removal_warning", self.I18N_CATALOG.i18nc( - "@label ({} is printer name)", - "{} will be removed until the next account sync.
    To remove {} permanently, " - "visit Ultimaker Digital Factory. " - "

    Are you sure you want to remove {} temporarily?", - device.name, device.name, device.name - )) + digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") + digital_factory_link = "{digital_factory_string}".format(digital_factory_string = digital_factory_string) + removal_warning_string = self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "{printer_name} will be removed until the next account sync.").format(printer_name = device.name) \ + + "
    " + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "To remove {printer_name} permanently, visit {digital_factory_link}").format(printer_name = device.name, digital_factory_link = digital_factory_link) \ + + "

    " + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "Are you sure you want to remove {printer_name} temporarily?").format(printer_name = device.name) + machine.setMetaDataEntry("removal_warning", removal_warning_string) machine.addConfiguredConnectionType(device.connectionType.value) def _connectToOutputDevice(self, device: CloudOutputDevice, machine: GlobalStack) -> None: @@ -464,10 +457,15 @@ class CloudOutputDeviceManager: remove_printers_ids = {self._um_cloud_printers[i].getId() for i in self.reported_device_ids} all_ids = {m.getId() for m in CuraApplication.getInstance().getContainerRegistry().findContainerStacks(type = "machine")} - question_title = self.I18N_CATALOG.i18nc("@title:window", "Remove printers?") - question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove {} printer(s) from Cura. This action cannot be undone. \nAre you sure you want to continue?".format(len(remove_printers_ids))) + question_title = self.i18n_catalog.i18nc("@title:window", "Remove printers?") + question_content = self.i18n_catalog.i18ncp( + "@label", + "You are about to remove {num_printers} printer from Cura. This action cannot be undone.\nAre you sure you want to continue?", + "You are about to remove {num_printers} printers from Cura. This action cannot be undone.\nAre you sure you want to continue?", + len(remove_printers_ids) + ).format(num_printers = len(remove_printers_ids)) if remove_printers_ids == all_ids: - question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone. \nAre you sure you want to continue?") + question_content = self.i18n_catalog.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone.\nAre you sure you want to continue?") result = QMessageBox.question(None, question_title, question_content) if result == QMessageBox.No: return diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 65a450b16f..c2e3571a62 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6152,7 +6152,7 @@ "infill_mesh_order": { "label": "Mesh Processing Rank", - "description": "Determines the priority of this mesh when considering overlapping volumes. Areas where multiple meshes reside will be won by the lower rank mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes.", + "description": "Determines the priority of this mesh when considering multiple overlapping infill meshes. Areas where multiple infill meshes overlap will take on the settings of the mesh with the lowest rank. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes.", "default_value": 0, "value": "1 if infill_mesh else 0", "minimum_value_warning": "1", diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index 41d68aef37..91f044ceed 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Ultimaker B.V. +// Copyright (c) 2020 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.7 @@ -11,7 +11,7 @@ UM.PointingRectangle id: base property real sourceWidth: 0 width: UM.Theme.getSize("tooltip").width - height: label.height + UM.Theme.getSize("tooltip_margins").height * 2 + height: textScroll.height + UM.Theme.getSize("tooltip_margins").height * 2 color: UM.Theme.getColor("tooltip") arrowSize: UM.Theme.getSize("default_arrow").width @@ -59,22 +59,48 @@ UM.PointingRectangle base.opacity = 0; } - Label + MouseArea { - id: label; - anchors + enabled: parent.opacity > 0 + visible: enabled + anchors.fill: parent + acceptedButtons: Qt.NoButton + hoverEnabled: true + onHoveredChanged: { - top: parent.top; - topMargin: UM.Theme.getSize("tooltip_margins").height; - left: parent.left; - leftMargin: UM.Theme.getSize("tooltip_margins").width; - right: parent.right; - rightMargin: UM.Theme.getSize("tooltip_margins").width; + if(containsMouse && base.opacity > 0) + { + base.show(Qt.point(target.x - 1, target.y - UM.Theme.getSize("tooltip_arrow_margins").height / 2)); //Same arrow position as before. + } + else + { + base.hide(); + } + } + + ScrollView + { + id: textScroll + width: parent.width + height: Math.min(label.height, base.parent.height) + + ScrollBar.horizontal: ScrollBar { + active: false //Only allow vertical scrolling. We should grow vertically only, but due to how the label is positioned it allocates space in the ScrollView horizontally. + } + + Label + { + id: label + x: UM.Theme.getSize("tooltip_margins").width + y: UM.Theme.getSize("tooltip_margins").height + width: base.width - UM.Theme.getSize("tooltip_margins").width * 2 + + wrapMode: Text.Wrap; + textFormat: Text.RichText + font: UM.Theme.getFont("default"); + color: UM.Theme.getColor("tooltip_text"); + renderType: Text.NativeRendering + } } - wrapMode: Text.Wrap; - textFormat: Text.RichText - font: UM.Theme.getFont("default"); - color: UM.Theme.getColor("tooltip_text"); - renderType: Text.NativeRendering } } diff --git a/resources/shaders/striped.shader b/resources/shaders/striped.shader index 71b1f7b0fa..07ce2bebe6 100644 --- a/resources/shaders/striped.shader +++ b/resources/shaders/striped.shader @@ -29,6 +29,7 @@ fragment = uniform mediump vec4 u_diffuseColor1; uniform mediump vec4 u_diffuseColor2; uniform mediump vec4 u_specularColor; + uniform mediump float u_opacity; uniform highp vec3 u_lightPosition; uniform mediump float u_shininess; uniform highp vec3 u_viewPosition; @@ -65,7 +66,7 @@ fragment = finalColor += pow(NdotR, u_shininess) * u_specularColor; gl_FragColor = finalColor; - gl_FragColor.a = 1.0; + gl_FragColor.a = u_opacity; } vertex41core = @@ -100,6 +101,7 @@ fragment41core = uniform mediump vec4 u_diffuseColor1; uniform mediump vec4 u_diffuseColor2; uniform mediump vec4 u_specularColor; + uniform mediump float u_opacity; uniform highp vec3 u_lightPosition; uniform mediump float u_shininess; uniform highp vec3 u_viewPosition; @@ -138,7 +140,7 @@ fragment41core = finalColor += pow(NdotR, u_shininess) * u_specularColor; frag_color = finalColor; - frag_color.a = 1.0; + frag_color.a = u_opacity; } [defaults] @@ -146,6 +148,7 @@ u_ambientColor = [0.3, 0.3, 0.3, 1.0] u_diffuseColor1 = [1.0, 0.5, 0.5, 1.0] u_diffuseColor2 = [0.5, 0.5, 0.5, 1.0] u_specularColor = [0.4, 0.4, 0.4, 1.0] +u_opacity = 1.0 u_shininess = 20.0 u_width = 5.0 u_vertical_stripes = 0