From ee7ebda584bf474b1ad2edd7858b4c605767872b Mon Sep 17 00:00:00 2001 From: Shantanu Nair Date: Sun, 20 Apr 2025 21:30:10 +0530 Subject: [PATCH 01/15] Fixed an issue where the Max Volumetric Speed doesn't consider the Filament Flow Ratio (#9218) * Rework extrusion-per-mm and speed-cap logic to enforce max vol speed * Fix _mm3_per_mm typo --- src/libslic3r/Extruder.hpp | 2 ++ src/libslic3r/GCode.cpp | 12 +++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Extruder.hpp b/src/libslic3r/Extruder.hpp index f048055456..398d388fd1 100644 --- a/src/libslic3r/Extruder.hpp +++ b/src/libslic3r/Extruder.hpp @@ -34,7 +34,9 @@ public: double unretract(); double E() const { return m_share_extruder ? m_share_E : m_E; } void reset_E() { m_E = 0.; m_share_E = 0.; } + // e_per_mm is extrusion_per_mm = geometric volume * (filament flow ratio / cross-sectional area) [Doesn't account for print_flow_ratio, or modifiers like bridge flow ratio etc.] double e_per_mm(double mm3_per_mm) const { return mm3_per_mm * m_e_per_mm3; } + // e_per_mm3 is extrusion_per_mm3 = filament flow ratio / cross-sectional area [Doesn't account for print_flow_ratio, or modifiers like bridge flow ratio etc.] double e_per_mm3() const { return m_e_per_mm3; } // Used filament volume in mm^3. double extruded_volume() const; diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 020471033c..5037465574 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5270,8 +5270,11 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, gcode += m_writer.set_jerk_xy(jerk); } - // calculate extrusion length per distance unit + // calculate effective extrusion length per distance unit (e_per_mm) + double filament_flow_ratio = m_config.option("filament_flow_ratio")->get_at(0); + // We set _mm3_per_mm to effectove flow = Geometric volume * print flow ratio * filament flow ratio * role-based-flow-ratios auto _mm3_per_mm = path.mm3_per_mm * this->config().print_flow_ratio; + _mm3_per_mm *= filament_flow_ratio; if (path.role() == erTopSolidInfill) _mm3_per_mm *= m_config.top_solid_infill_flow_ratio; else if (path.role() == erBottomSurface) @@ -5280,9 +5283,12 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, _mm3_per_mm *= m_config.internal_bridge_flow; else if(sloped) _mm3_per_mm *= m_config.scarf_joint_flow_ratio; - - + // Effective extrusion length per distance unit = (filament_flow_ratio/cross_section) * mm3_per_mm / print flow ratio + // m_writer.extruder()->e_per_mm3() below is (filament flow ratio / cross-sectional area) double e_per_mm = m_writer.extruder()->e_per_mm3() * _mm3_per_mm; + e_per_mm /= filament_flow_ratio; + + // set speed if (speed == -1) { From 1f74b6b78ad32ee9d74cf2867fa0478826fc6517 Mon Sep 17 00:00:00 2001 From: yw4z Date: Tue, 22 Apr 2025 07:47:07 +0300 Subject: [PATCH 02/15] Fix: Prevent move of Advanced toggle when highlighting Global / Objects switch (#9445) Update ParamsPanel.cpp --- src/slic3r/GUI/ParamsPanel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/ParamsPanel.cpp b/src/slic3r/GUI/ParamsPanel.cpp index 4435519a42..69048b0f95 100644 --- a/src/slic3r/GUI/ParamsPanel.cpp +++ b/src/slic3r/GUI/ParamsPanel.cpp @@ -366,13 +366,13 @@ void ParamsPanel::create_layout() m_mode_sizer->Add( m_title_label, 0, wxALIGN_CENTER ); m_mode_sizer->AddStretchSpacer(2); m_mode_sizer->Add(m_mode_region, 0, wxALIGN_CENTER); - m_mode_sizer->AddStretchSpacer(1); + m_mode_sizer->AddSpacer(FromDIP(SidebarProps::ElementSpacing())); m_mode_sizer->Add(m_tips_arrow, 0, wxALIGN_CENTER); m_mode_sizer->AddStretchSpacer(8); m_mode_sizer->Add( m_title_view, 0, wxALIGN_CENTER ); m_mode_sizer->AddSpacer(FromDIP(SidebarProps::ElementSpacing())); m_mode_sizer->Add(m_mode_view, 0, wxALIGN_CENTER); - m_mode_sizer->AddStretchSpacer(2); + m_mode_sizer->AddSpacer(FromDIP(SidebarProps::ElementSpacing() * 6)); // ORCA using spacer prevents shaky mode_view when tips_arrow highlighting mode_region instead using AddStretchSpacer m_mode_sizer->Add(m_setting_btn, 0, wxALIGN_CENTER); m_mode_sizer->AddSpacer(FromDIP(SidebarProps::IconSpacing())); m_mode_sizer->Add(m_compare_btn, 0, wxALIGN_CENTER); From e2f59f02e4d465530258394d96dc53a077cbe8a0 Mon Sep 17 00:00:00 2001 From: FusRock Date: Tue, 22 Apr 2025 13:54:01 +0800 Subject: [PATCH 03/15] Fix FusRock ABS-GF Parameters in .bbl , Add Global Parameters for FusRock ABS-GF (#9442) * Fix FusRock ABS-GF Parameters in .bbl , Add Global Parameters for FusRock ABS-GF * Add Global Parameters for FusRock ABS-GF --- .../FusRock/FusRock ABS-GF @base.json | 183 +++++++++++------- resources/profiles/OrcaFilamentLibrary.json | 8 + .../FusRock/FusRock ABS-GF @System.json | 15 ++ .../FusRock/FusRock ABS-GF @base.json | 161 +++++++++++++++ 4 files changed, 301 insertions(+), 66 deletions(-) create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/FusRock/FusRock ABS-GF @System.json create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/FusRock/FusRock ABS-GF @base.json diff --git a/resources/profiles/BBL/filament/FusRock/FusRock ABS-GF @base.json b/resources/profiles/BBL/filament/FusRock/FusRock ABS-GF @base.json index 29b77ca23a..b53c36d1b1 100644 --- a/resources/profiles/BBL/filament/FusRock/FusRock ABS-GF @base.json +++ b/resources/profiles/BBL/filament/FusRock/FusRock ABS-GF @base.json @@ -6,21 +6,11 @@ "filament_id": "GFR00", "instantiation": "false", "description": "When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials(https://wiki.fusrock.com).", - "filament_notes": "//EN\n1.Be sure to read it carefully before using (https://wiki.fusrock.com).\n2.When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials(https://wiki.fusrock.com).\\n3.Thank you for choosing us FusRock. \n//CN\n1.使用前请务必仔细阅读(https://wiki.fusrock.com)。\n2.打印该耗材时,可能会出现喷嘴堵塞、拉丝、翘边以及层间附着力不足等问题。为了获得更好的打印效果,请参考此维基页面:高温 / 工程材料打印技巧(https://wiki.fusrock.com)。\n3.感谢您选择FusRock。", - "activate_air_filtration": [ - "1" + "filament_extruder_variant": [ + "Direct Drive Standard" ], - "cool_plate_temp": [ - "0" - ], - "cool_plate_temp_initial_layer": [ - "0" - ], - "fan_cooling_layer_time": [ - "30" - ], - "fan_min_speed": [ - "10" + "filament_adhesiveness_category": [ + "200" ], "filament_type": [ "ABS-GF" @@ -28,83 +18,144 @@ "filament_vendor": [ "FusRock" ], - "nozzle_temperature": [ - "270" + "filament_flow_ratio": [ + "0.92" ], - "nozzle_temperature_initial_layer": [ - "260" + "filament_density": [ + "1.08" ], - "nozzle_temperature_range_high": [ - "280" + "filament_cost": [ + "13" ], "nozzle_temperature_range_low": [ "240" ], - "overhang_fan_threshold": [ - "25%" + "nozzle_temperature_range_high": [ + "280" ], - "slow_down_layer_time": [ - "3" + "cool_plate_temp_initial_layer": [ + "0" ], - "slow_down_min_speed": [ - "20" - ], - "supertack_plate_temp": [ + "cool_plate_temp": [ "0" ], "supertack_plate_temp_initial_layer": [ "0" ], - "filament_end_gcode": [ - "; filament end gcode \n\n" - ], - "eng_plate_temp": [ - "105" + "supertack_plate_temp": [ + "0" ], "eng_plate_temp_initial_layer": [ "105" ], - "fan_max_speed": [ - "50" - ], - "filament_adhesiveness_category": [ - "100" - ], - "filament_cost": [ - "0" - ], - "filament_density": [ - "1.05" - ], - "filament_extruder_variant": [ - "Direct Drive Standard" - ], - "filament_flow_ratio": [ - "0.92" - ], - "filament_max_volumetric_speed": [ - "20" - ], - "filament_retraction_length": [ - "0.8" - ], - "hot_plate_temp": [ + "eng_plate_temp": [ "105" ], "hot_plate_temp_initial_layer": [ "105" ], - "overhang_fan_speed": [ - "50" - ], - "reduce_fan_stop_start_freq": [ - "0" - ], - "textured_plate_temp": [ + "hot_plate_temp": [ "105" ], "textured_plate_temp_initial_layer": [ "105" ], - "version": "1.10.0.32" + "textured_plate_temp": [ + "105" + ], + "nozzle_temperature_initial_layer": [ + "260" + ], + "nozzle_temperature": [ + "270" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_min_speed": [ + "10" + ], + "fan_cooling_layer_time": [ + "12" + ], + "fan_max_speed": [ + "30" + ], + "slow_down_layer_time": [ + "4" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_min_speed": [ + "20" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "overhang_fan_threshold": [ + "10%" + ], + "overhang_threshold_participating_cooling": [ + "100%" + ], + "overhang_fan_speed": [ + "30" + ], + "pre_start_fan_time": [ + "0" + ], + "additional_cooling_fan_speed": [ + "0" + ], + "activate_air_filtration": [ + "1" + ], + "during_print_exhaust_fan_speed": [ + "30" + ], + "complete_print_exhaust_fan_speed": [ + "10" + ], + "filament_retraction_length": [ + "0.8" + ], + "filament_z_hop": [ + "0.4" + ], + "filament_z_hop_types": [ + "Spiral Lift" + ], + "filament_retraction_speed": [ + "30" + ], + "filament_deretraction_speed": [ + "0" + ], + "filament_retraction_minimum_travel": [ + "2" + ], + "filament_retract_when_changing_layer": [ + "0" + ], + "filament_wipe": [ + "0" + ], + "filament_wipe_distance": [ + "2" + ], + "filament_retract_before_wipe": [ + "100%" + ], + "filament_end_gcode": [ + "; filament end gcode \n\n" + ], + "filament_notes": "//EN\n1.Be sure to read it carefully before using (https://wiki.fusrock.com).\n2.When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials(https://wiki.fusrock.com).\\n3.Thank you for choosing us FusRock.\n*This setting may not be able to adapt to all models. In some cases, you need to modify and adjust the parameters by yourself to improve the printing effect.\n*FusRock 3D printing filaments are intended for general-purpose printing and have been tested under standard conditions. However, the performance and safety of printed objects are affected by multiple factors, including printing parameters, model design, usage environment, and the specific application.\n*By using FusRock materials, the user acknowledges and agrees to independently evaluate whether the printed parts are suitable for their intended use, and assumes all associated risks.\n*FusRock shall not be held liable for any damage, injury, or loss that may result from the use of printed products made with our materials, including but not limited to structural failure, functional defects, or safety hazards under actual usage conditions.Before applying printed parts in any critical, functional, or commercial context, thorough testing must be conducted. Except for the certifications explicitly stated for specific FusRock materials, our products are not certified for medical, aerospace, or life-support applications.\n//CN\n1.使用前请务必仔细阅读(https://wiki.fusrock.com)。\n2.打印该耗材时,可能会出现喷嘴堵塞、拉丝、翘边以及层间附着力不足等问题。为了获得更好的打印效果,请参考此维基页面:高温 / 工程材料打印技巧(https://wiki.fusrock.com)。\n3.感谢您选择FusRock。\n*此设置不一定能够适配所有模型,存在部分情况下需要您自行修改调整参数来提升打印效果。\n*FusRock 3D打印耗材适用于通用打印用途,已在标准条件下进行测试。然而,打印成品的性能与安全性受多种因素影响,包括打印参数、模型设计、使用环境及实际用途。\n*使用FusRock材料即表示用户已知悉并同意,自行评估打印件是否适用于其具体应用,并承担由此产生的全部风险。\n*FusRock对使用本公司耗材打印的产品在实际应用中可能导致的任何损害、伤害或损失不承担任何责任,包括但不限于结构失效、功能异常或使用环境中的安全隐患。在将打印件应用于关键、功能性或商业性场景前,请务必进行充分测试。除FusRock已标明材料所获得的各项认证资质外,FusRock产品未取得医疗、航天或生命支持系统认证资质。", + "impact_strength_z":["5.3"] } diff --git a/resources/profiles/OrcaFilamentLibrary.json b/resources/profiles/OrcaFilamentLibrary.json index 982830b0ec..96ff81a4c0 100644 --- a/resources/profiles/OrcaFilamentLibrary.json +++ b/resources/profiles/OrcaFilamentLibrary.json @@ -756,6 +756,14 @@ "name": "Bambu TPU 95A HF @System", "sub_path": "filament/Bambu/Bambu TPU 95A HF @System.json" }, + { + "name": "FusRock ABS-GF @base", + "sub_path": "filament/FusRock/FusRock ABS-GF @base.json" + }, + { + "name": "FusRock ABS-GF @System", + "sub_path": "filament/FusRock/FusRock ABS-GF @System.json" + }, { "name": "AliZ PETG-CF @System", "sub_path": "filament/AliZ/AliZ PETG-CF @System.json" diff --git a/resources/profiles/OrcaFilamentLibrary/filament/FusRock/FusRock ABS-GF @System.json b/resources/profiles/OrcaFilamentLibrary/filament/FusRock/FusRock ABS-GF @System.json new file mode 100644 index 0000000000..151c311ab5 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/FusRock/FusRock ABS-GF @System.json @@ -0,0 +1,15 @@ +{ + "type": "filament", + "name": "FusRock ABS-GF @System", + "inherits": "FusRock ABS-GF @base", + "from": "system", + "setting_id": "OGFSB50_00", + "instantiation": "true", + "filament_long_retractions_when_cut": [ + "1" + ], + "filament_retraction_distances_when_cut": [ + "18" + ], + "compatible_printers": [] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/FusRock/FusRock ABS-GF @base.json b/resources/profiles/OrcaFilamentLibrary/filament/FusRock/FusRock ABS-GF @base.json new file mode 100644 index 0000000000..7c1d4e3e64 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/FusRock/FusRock ABS-GF @base.json @@ -0,0 +1,161 @@ +{ + "type": "filament", + "name": "FusRock ABS-GF @base", + "inherits": "fdm_filament_common", + "from": "system", + "filament_id": "OGFR00", + "instantiation": "false", + "description": "When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials(https://wiki.fusrock.com).", + "filament_extruder_variant": [ + "Direct Drive Standard" + ], + "filament_adhesiveness_category": [ + "200" + ], + "filament_type": [ + "ABS-GF" + ], + "filament_vendor": [ + "FusRock" + ], + "filament_flow_ratio": [ + "0.92" + ], + "filament_density": [ + "1.08" + ], + "filament_cost": [ + "13" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "cool_plate_temp": [ + "0" + ], + "supertack_plate_temp_initial_layer": [ + "0" + ], + "supertack_plate_temp": [ + "0" + ], + "eng_plate_temp_initial_layer": [ + "105" + ], + "eng_plate_temp": [ + "105" + ], + "hot_plate_temp_initial_layer": [ + "105" + ], + "hot_plate_temp": [ + "105" + ], + "textured_plate_temp_initial_layer": [ + "105" + ], + "textured_plate_temp": [ + "105" + ], + "nozzle_temperature_initial_layer": [ + "260" + ], + "nozzle_temperature": [ + "270" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_min_speed": [ + "10" + ], + "fan_cooling_layer_time": [ + "12" + ], + "fan_max_speed": [ + "30" + ], + "slow_down_layer_time": [ + "4" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_min_speed": [ + "20" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "overhang_fan_threshold": [ + "10%" + ], + "overhang_threshold_participating_cooling": [ + "100%" + ], + "overhang_fan_speed": [ + "30" + ], + "pre_start_fan_time": [ + "0" + ], + "additional_cooling_fan_speed": [ + "0" + ], + "activate_air_filtration": [ + "1" + ], + "during_print_exhaust_fan_speed": [ + "30" + ], + "complete_print_exhaust_fan_speed": [ + "10" + ], + "filament_retraction_length": [ + "0.8" + ], + "filament_z_hop": [ + "0.4" + ], + "filament_z_hop_types": [ + "Spiral Lift" + ], + "filament_retraction_speed": [ + "30" + ], + "filament_deretraction_speed": [ + "0" + ], + "filament_retraction_minimum_travel": [ + "2" + ], + "filament_retract_when_changing_layer": [ + "0" + ], + "filament_wipe": [ + "0" + ], + "filament_wipe_distance": [ + "2" + ], + "filament_retract_before_wipe": [ + "100%" + ], + "filament_end_gcode": [ + "; filament end gcode \n\n" + ], + "filament_notes": "//EN\n1.Be sure to read it carefully before using (https://wiki.fusrock.com).\n2.When printing this filament, there's a risk of nozzle clogging, oozing, warping and low layer adhesion strength. To get better results, please refer to this wiki: Printing Tips for High Temp / Engineering materials(https://wiki.fusrock.com).\\n3.Thank you for choosing us FusRock.\n*This setting may not be able to adapt to all models. In some cases, you need to modify and adjust the parameters by yourself to improve the printing effect.\n*FusRock 3D printing filaments are intended for general-purpose printing and have been tested under standard conditions. However, the performance and safety of printed objects are affected by multiple factors, including printing parameters, model design, usage environment, and the specific application.\n*By using FusRock materials, the user acknowledges and agrees to independently evaluate whether the printed parts are suitable for their intended use, and assumes all associated risks.\n*FusRock shall not be held liable for any damage, injury, or loss that may result from the use of printed products made with our materials, including but not limited to structural failure, functional defects, or safety hazards under actual usage conditions.Before applying printed parts in any critical, functional, or commercial context, thorough testing must be conducted. Except for the certifications explicitly stated for specific FusRock materials, our products are not certified for medical, aerospace, or life-support applications.\n//CN\n1.使用前请务必仔细阅读(https://wiki.fusrock.com)。\n2.打印该耗材时,可能会出现喷嘴堵塞、拉丝、翘边以及层间附着力不足等问题。为了获得更好的打印效果,请参考此维基页面:高温 / 工程材料打印技巧(https://wiki.fusrock.com)。\n3.感谢您选择FusRock。\n*此设置不一定能够适配所有模型,存在部分情况下需要您自行修改调整参数来提升打印效果。\n*FusRock 3D打印耗材适用于通用打印用途,已在标准条件下进行测试。然而,打印成品的性能与安全性受多种因素影响,包括打印参数、模型设计、使用环境及实际用途。\n*使用FusRock材料即表示用户已知悉并同意,自行评估打印件是否适用于其具体应用,并承担由此产生的全部风险。\n*FusRock对使用本公司耗材打印的产品在实际应用中可能导致的任何损害、伤害或损失不承担任何责任,包括但不限于结构失效、功能异常或使用环境中的安全隐患。在将打印件应用于关键、功能性或商业性场景前,请务必进行充分测试。除FusRock已标明材料所获得的各项认证资质外,FusRock产品未取得医疗、航天或生命支持系统认证资质。", + "impact_strength_z":["5.3"] +} From f4ebf9830cbbc02b64af099244d7ec113bbd5306 Mon Sep 17 00:00:00 2001 From: yw4z Date: Wed, 23 Apr 2025 14:49:25 +0300 Subject: [PATCH 04/15] Fix alignment of plate name text an its input box on plate settings window (#9456) Update PlateSettingsDialog.cpp --- src/slic3r/GUI/PlateSettingsDialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/PlateSettingsDialog.cpp b/src/slic3r/GUI/PlateSettingsDialog.cpp index 88f9391773..0558fabcf9 100644 --- a/src/slic3r/GUI/PlateSettingsDialog.cpp +++ b/src/slic3r/GUI/PlateSettingsDialog.cpp @@ -382,8 +382,8 @@ PlateSettingsDialog::PlateSettingsDialog(wxWindow* parent, const wxString& title auto plate_name_txt = new wxStaticText(this, wxID_ANY, _L("Plate name")); plate_name_txt->SetFont(Label::Body_14); m_ti_plate_name = new TextInput(this, wxString::FromDouble(0.0), "", "", wxDefaultPosition, wxSize(FromDIP(240),-1), wxTE_PROCESS_ENTER); - top_sizer->Add(plate_name_txt, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT |wxALL, FromDIP(5)); - top_sizer->Add(m_ti_plate_name, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT |wxALL, FromDIP(5)); + top_sizer->Add(plate_name_txt, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxTOP | wxBOTTOM, FromDIP(5)); + top_sizer->Add(m_ti_plate_name, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxTOP | wxBOTTOM, FromDIP(5)); m_bed_type_choice = new ComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(240), -1), 0, NULL, wxCB_READONLY); From 2c12515035a71ea28764d774679a949b389fd705 Mon Sep 17 00:00:00 2001 From: yw4z Date: Wed, 23 Apr 2025 14:49:52 +0300 Subject: [PATCH 05/15] Add icon to Profile dependencies (#9455) Update Tab.cpp --- src/slic3r/GUI/Tab.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 9d0dda40f2..3807626741 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3568,7 +3568,7 @@ void TabFilament::build() optgroup->append_single_option_line("filament_multitool_ramming_flow"); page = add_options_page(L("Dependencies"), "advanced"); - optgroup = page->new_optgroup(L("Profile dependencies")); + optgroup = page->new_optgroup(L("Profile dependencies"), "param_profile_dependencies"); create_line_with_widget(optgroup.get(), "compatible_printers", "", [this](wxWindow* parent) { return compatible_widget_create(parent, m_compatible_printers); }); From d1c2368eee127beecc74a8f5d00b738cf6750341 Mon Sep 17 00:00:00 2001 From: vampiro2004 <48026290+vampiro2004@users.noreply.github.com> Date: Wed, 23 Apr 2025 12:50:19 +0100 Subject: [PATCH 06/15] adding overture TPU & ABS profiles (#9453) Co-authored-by: Vampiro2004 --- resources/profiles/OrcaFilamentLibrary.json | 16 ++ .../Overture/Overture ABS Basic @System.json | 14 ++ .../Overture/Overture ABS Basic @base.json | 195 ++++++++++++++++++ .../Overture/Overture TPU @System.json | 14 ++ .../filament/Overture/Overture TPU @base.json | 184 +++++++++++++++++ 5 files changed, 423 insertions(+) create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture ABS Basic @System.json create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture ABS Basic @base.json create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture TPU @System.json create mode 100644 resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture TPU @base.json diff --git a/resources/profiles/OrcaFilamentLibrary.json b/resources/profiles/OrcaFilamentLibrary.json index 96ff81a4c0..690eaded8f 100644 --- a/resources/profiles/OrcaFilamentLibrary.json +++ b/resources/profiles/OrcaFilamentLibrary.json @@ -367,6 +367,14 @@ { "name": "Overture PLA @base", "sub_path": "filament/Overture/Overture PLA @base.json" + }, + { + "name": "Overture TPU @base", + "sub_path": "filament/Overture/Overture TPU @base.json" + }, + { + "name": "Overture ABS Basic @base", + "sub_path": "filament/Overture/Overture ABS Basic @base.json" }, { "name": "PolyLite PLA @base", @@ -683,6 +691,14 @@ { "name": "Overture PLA @System", "sub_path": "filament/Overture/Overture PLA @System.json" + }, + { + "name": "Overture TPU @System", + "sub_path": "filament/Overture/Overture TPU @System.json" + }, + { + "name": "Overture ABS Basic @System", + "sub_path": "filament/Overture/Overture ABS Basic @System.json" }, { "name": "PolyLite Dual PLA @System", diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture ABS Basic @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture ABS Basic @System.json new file mode 100644 index 0000000000..c8b5543e0e --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture ABS Basic @System.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Overture ABS Basic @System", + "inherits": "Overture ABS Basic @base", + "from": "system", + "setting_id": "OVABS08", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "16" + ], + "filament_long_retractions_when_cut": ["nil"], + "filament_retraction_distances_when_cut": ["nil"], + "compatible_printers": [] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture ABS Basic @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture ABS Basic @base.json new file mode 100644 index 0000000000..479894a51f --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture ABS Basic @base.json @@ -0,0 +1,195 @@ +{ + "type": "filament", + "name": "Overture ABS Basic @base", + "inherits": "fdm_filament_abs", + "from": "system", + "filament_id": "OVTABS08", + "instantiation": "false", + "description": "Overture ABS settings from https://overture3d.com/.", + "activate_air_filtration": [ + "1" + ], + "additional_cooling_fan_speed": [ + "0" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "compatible_printers": [ + "" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "0" + ], + "cool_plate_temp_initial_layer": [ + "0" + ], + "default_filament_colour": [ + "" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "90" + ], + "eng_plate_temp_initial_layer": [ + "90" + ], + "fan_cooling_layer_time": [ + "38" + ], + "fan_max_speed": [ + "50" + ], + "fan_min_speed": [ + "10" + ], + "filament_cost": [ + "0" + ], + "filament_density": [ + "1.15" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_is_support": [ + "0" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "16" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_notes": "", + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_settings_id": [ + "OVERTURE ABS Basic" + ], + "filament_soluble": [ + "0" + ], + "filament_start_gcode": [ + "; Filament gcode\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_type": [ + "ABS" + ], + "filament_vendor": [ + "OVERTURE" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "90" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "is_custom_defined": "0", + "nozzle_temperature": [ + "260" + ], + "nozzle_temperature_initial_layer": [ + "260" + ], + "nozzle_temperature_range_high": [ + "265" + ], + "nozzle_temperature_range_low": [ + "245" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "95%" + ], + "pressure_advance": [ + "0.02" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "3" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "2" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "103" + ], + "textured_plate_temp": [ + "90" + ], + "textured_plate_temp_initial_layer": [ + "90" + ], + "version": "1.9.0.14" +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture TPU @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture TPU @System.json new file mode 100644 index 0000000000..4f004c6c12 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture TPU @System.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Overture TPU @System", + "inherits": "Overture TPU @base", + "from": "system", + "setting_id": "OFOVT08", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "4" + ], + "filament_long_retractions_when_cut": ["0"], + "filament_retraction_distances_when_cut": ["0"], + "compatible_printers": [] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture TPU @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture TPU @base.json new file mode 100644 index 0000000000..9485dd5fe9 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Overture/Overture TPU @base.json @@ -0,0 +1,184 @@ +{ + "type": "filament", + "name": "Overture TPU @base", + "inherits": "fdm_filament_tpu", + "from": "system", + "filament_id": "OGFOVT08", + "instantiation": "false", + "description": "Overture TPU settings from https://overture3d.com/.", + "activate_air_filtration": [ + "0" + ], + "additional_cooling_fan_speed": [ + "100" + ], + "chamber_temperatures": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "complete_print_exhaust_fan_speed": [ + "70" + ], + "cool_plate_temp": [ + "35" + ], + "cool_plate_temp_initial_layer": [ + "35" + ], + "default_filament_colour": [ + "" + ], + "during_print_exhaust_fan_speed": [ + "70" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "0" + ], + "eng_plate_temp_initial_layer": [ + "0" + ], + "fan_cooling_layer_time": [ + "120" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_cost": [ + "0" + ], + "filament_density": [ + "1.18" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_end_gcode": [ + "; filament end gcode \nM106 P3 S0\n" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_is_support": [ + "0" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_notes": "", + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "0.4" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_soluble": [ + "0" + ], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S255\n{elsif(bed_temperature[current_extruder] >30)||(bed_temperature_initial_layer[current_extruder] >30)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ], + "filament_type": [ + "TPU" + ], + "filament_vendor": [ + "OVERTURE" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "hot_plate_temp": [ + "35" + ], + "hot_plate_temp_initial_layer": [ + "35" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "nozzle_temperature_range_low": [ + "210" + ], + "overhang_fan_speed": [ + "100" + ], + "overhang_fan_threshold": [ + "95%" + ], + "pressure_advance": [ + "0.02" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "3" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "120" + ], + "slow_down_min_speed": [ + "20" + ], + "temperature_vitrification": [ + "0" + ], + "textured_plate_temp": [ + "35" + ], + "textured_plate_temp_initial_layer": [ + "35" + ] +} \ No newline at end of file From 66cab434b82b7d4f253b31bd87da463b5abfc90f Mon Sep 17 00:00:00 2001 From: Henk <40023052+elektrohenk@users.noreply.github.com> Date: Wed, 23 Apr 2025 15:17:19 +0200 Subject: [PATCH 07/15] Fix infill anchor missing (#9407) * Fix infill anchor missing * Correctly process cases without fill lines in FillRectilinear::fill_surface_with_multilines() * Fix infill anchor missing for several other infill patterns * Fix infill anchor missing for rectilinear and aligned rectilinear infill pattern --------- Co-authored-by: Noisyfox --- src/libslic3r/Fill/Fill3DHoneycomb.cpp | 5 +---- src/libslic3r/Fill/FillAdaptive.cpp | 5 +---- src/libslic3r/Fill/FillBase.cpp | 12 ++++++++++++ src/libslic3r/Fill/FillBase.hpp | 2 ++ src/libslic3r/Fill/FillCrossHatch.cpp | 5 +---- src/libslic3r/Fill/FillGyroid.cpp | 5 +---- src/libslic3r/Fill/FillHoneycomb.cpp | 5 +---- src/libslic3r/Fill/FillLightning.cpp | 5 +---- src/libslic3r/Fill/FillRectilinear.cpp | 25 ++++++++++++++++--------- 9 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/libslic3r/Fill/Fill3DHoneycomb.cpp b/src/libslic3r/Fill/Fill3DHoneycomb.cpp index 7b7a3b8878..eadcfbf537 100644 --- a/src/libslic3r/Fill/Fill3DHoneycomb.cpp +++ b/src/libslic3r/Fill/Fill3DHoneycomb.cpp @@ -273,10 +273,7 @@ void Fill3DHoneycomb::_fill_surface_single( if (!polylines.empty()) { int infill_start_idx = polylines_out.size(); // only rotate what belongs to us. // connect lines - if (params.dont_connect() || polylines.size() <= 1) - append(polylines_out, chain_polylines(std::move(polylines))); - else - this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); // rotate back if (std::abs(infill_angle) >= EPSILON) { diff --git a/src/libslic3r/Fill/FillAdaptive.cpp b/src/libslic3r/Fill/FillAdaptive.cpp index 8f28697eb8..d4b117b99d 100644 --- a/src/libslic3r/Fill/FillAdaptive.cpp +++ b/src/libslic3r/Fill/FillAdaptive.cpp @@ -1401,10 +1401,7 @@ void Filler::_fill_surface_single( } #endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */ - if (params.dont_connect() || all_polylines_with_hooks.size() <= 1) - append(polylines_out, chain_polylines(std::move(all_polylines_with_hooks))); - else - connect_infill(std::move(all_polylines_with_hooks), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(all_polylines_with_hooks), expolygon, polylines_out, this->spacing, params); #ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT { diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 8ae8a6d4a7..1430e678bc 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -1787,6 +1787,18 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vector 1) + infill_ordered = chain_polylines(std::move(infill_ordered)); + append(polylines_out, std::move(infill_ordered)); + } else + connect_infill(std::move(infill_ordered), boundary, polylines_out, spacing, params); + } +} + // Extend the infill lines along the perimeters, this is mainly useful for grid aligned support, where a perimeter line may be nearly // aligned with the infill lines. static inline void base_support_extend_infill_lines(Polylines &infill, BoundaryInfillGraph &graph, const double spacing, const FillParams ¶ms) diff --git a/src/libslic3r/Fill/FillBase.hpp b/src/libslic3r/Fill/FillBase.hpp index de93db3693..01aaf38d28 100644 --- a/src/libslic3r/Fill/FillBase.hpp +++ b/src/libslic3r/Fill/FillBase.hpp @@ -191,6 +191,8 @@ public: static void connect_infill(Polylines &&infill_ordered, const Polygons &boundary, const BoundingBox& bbox, Polylines &polylines_out, const double spacing, const FillParams ¶ms); static void connect_infill(Polylines &&infill_ordered, const std::vector &boundary, const BoundingBox &bbox, Polylines &polylines_out, double spacing, const FillParams ¶ms); + static void chain_or_connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary, Polylines &polylines_out, const double spacing, const FillParams ¶ms); + static void connect_base_support(Polylines &&infill_ordered, const std::vector &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams ¶ms); static void connect_base_support(Polylines &&infill_ordered, const Polygons &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams ¶ms); diff --git a/src/libslic3r/Fill/FillCrossHatch.cpp b/src/libslic3r/Fill/FillCrossHatch.cpp index 10f421bef3..3772a1fec2 100644 --- a/src/libslic3r/Fill/FillCrossHatch.cpp +++ b/src/libslic3r/Fill/FillCrossHatch.cpp @@ -218,10 +218,7 @@ void FillCrossHatch ::_fill_surface_single( if (!polylines.empty()) { int infill_start_idx = polylines_out.size(); // only rotate what belongs to us. // connect lines - if (params.dont_connect() || polylines.size() <= 1) - append(polylines_out, chain_polylines(std::move(polylines))); - else - this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); // rotate back if (std::abs(infill_angle) >= EPSILON) { diff --git a/src/libslic3r/Fill/FillGyroid.cpp b/src/libslic3r/Fill/FillGyroid.cpp index 5c555df88f..9040f740b2 100644 --- a/src/libslic3r/Fill/FillGyroid.cpp +++ b/src/libslic3r/Fill/FillGyroid.cpp @@ -194,10 +194,7 @@ void FillGyroid::_fill_surface_single( if (! polylines.empty()) { // connect lines size_t polylines_out_first_idx = polylines_out.size(); - if (params.dont_connect()) - append(polylines_out, chain_polylines(polylines)); - else - this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params); // new paths must be rotated back if (std::abs(infill_angle) >= EPSILON) { diff --git a/src/libslic3r/Fill/FillHoneycomb.cpp b/src/libslic3r/Fill/FillHoneycomb.cpp index 5dc2ed501c..3e37ddbc84 100644 --- a/src/libslic3r/Fill/FillHoneycomb.cpp +++ b/src/libslic3r/Fill/FillHoneycomb.cpp @@ -74,10 +74,7 @@ void FillHoneycomb::_fill_surface_single( } all_polylines = intersection_pl(std::move(all_polylines), expolygon); - if (params.dont_connect() || all_polylines.size() <= 1) - append(polylines_out, chain_polylines(std::move(all_polylines))); - else - connect_infill(std::move(all_polylines), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(all_polylines), expolygon, polylines_out, this->spacing, params); } } // namespace Slic3r diff --git a/src/libslic3r/Fill/FillLightning.cpp b/src/libslic3r/Fill/FillLightning.cpp index dd2189e6b9..5cd7ae5797 100644 --- a/src/libslic3r/Fill/FillLightning.cpp +++ b/src/libslic3r/Fill/FillLightning.cpp @@ -16,10 +16,7 @@ void Filler::_fill_surface_single( const Layer &layer = generator->getTreesForLayer(this->layer_id); Polylines fill_lines = layer.convertToLines(to_polygons(expolygon), scaled(0.5 * this->spacing - this->overlap)); - if (params.dont_connect() || fill_lines.size() <= 1) { - append(polylines_out, chain_polylines(std::move(fill_lines))); - } else - connect_infill(std::move(fill_lines), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(fill_lines), expolygon, polylines_out, this->spacing, params); } void GeneratorDeleter::operator()(Generator *p) { diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index c85d5e02fb..7fe310e14b 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -2928,7 +2928,7 @@ void make_fill_lines(const ExPolygonWithOffset &poly_with_offset, Point refpt, d bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillParams params, const std::initializer_list &sweep_params, Polylines &polylines_out) { - assert(sweep_params.size() > 1); + assert(sweep_params.size() >= 1); assert(! params.full_infill()); params.density /= double(sweep_params.size()); assert(params.density > 0.0001f && params.density <= 1.f); @@ -2948,12 +2948,14 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar make_fill_lines(ExPolygonWithOffset(poly_with_offset_base, - angle), rotate_vector.second.rotated(-angle), angle, line_width + coord_t(SCALED_EPSILON), line_spacing, coord_t(scale_(sweep.pattern_shift)), fill_lines); } - if (params.dont_connect() || fill_lines.size() <= 1) { - if (fill_lines.size() > 1) - fill_lines = chain_polylines(std::move(fill_lines)); - append(polylines_out, std::move(fill_lines)); - } else - connect_infill(std::move(fill_lines), poly_with_offset_base.polygons_outer, get_extents(surface->expolygon.contour), polylines_out, this->spacing, params); + if (!fill_lines.empty()) { + if (params.dont_connect()) { + if (fill_lines.size() > 1) + fill_lines = chain_polylines(std::move(fill_lines)); + append(polylines_out, std::move(fill_lines)); + } else + connect_infill(std::move(fill_lines), poly_with_offset_base.polygons_outer, get_extents(surface->expolygon.contour), polylines_out, this->spacing, params); + } return true; } @@ -2961,8 +2963,13 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar Polylines FillRectilinear::fill_surface(const Surface *surface, const FillParams ¶ms) { Polylines polylines_out; - if (! fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out)) - BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() failed to fill a region."; + if (params.full_infill()) { + if (!fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out)) + BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() fill_surface_by_lines() failed to fill a region."; + } else { + if (!fill_surface_by_multilines(surface, params, {{0.f, 0.f}}, polylines_out)) + BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() fill_surface_by_multilines() failed to fill a region."; + } return polylines_out; } From e2b16f527a2318738ec9fd8441861de48a23c017 Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Wed, 23 Apr 2025 23:37:08 +0800 Subject: [PATCH 08/15] Improve gcode preview flow rate scale (#9319) * Ignore very tiny extrusions in flow rate scale (SoftFever/OrcaSlicer#9190) * Don't show flow rate if it's not extrusion * Merge branch 'main' into bugfox/gcode-viewer-flow-scale --- src/libslic3r/GCode/GCodeProcessor.cpp | 8 ++++++-- src/libslic3r/GCode/GCodeProcessor.hpp | 2 ++ src/slic3r/GUI/GCodeViewer.cpp | 9 +++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 7b22a50eb5..4fd08c5f68 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -1150,6 +1150,7 @@ void GCodeProcessor::reset() m_forced_width = 0.0f; m_forced_height = 0.0f; m_mm3_per_mm = 0.0f; + m_travel_dist = 0.0f; m_fan_speed = 0.0f; m_z_offset = 0.0f; @@ -2648,7 +2649,8 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line, const std::o EMoveType type = move_type(delta_pos); if (type == EMoveType::Extrude) { - float delta_xyz = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z])); + const float delta_xyz = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z])); + m_travel_dist = delta_xyz; float volume_extruded_filament = area_filament_cross_section * delta_pos[E]; float area_toolpath_cross_section = volume_extruded_filament / delta_xyz; @@ -3125,7 +3127,8 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line) EMoveType type = move_type(delta_pos[E]); - float delta_xyz = std::sqrt(sqr(arc_length) + sqr(delta_pos[Z])); + const float delta_xyz = std::sqrt(sqr(arc_length) + sqr(delta_pos[Z])); + m_travel_dist = delta_xyz; if (type == EMoveType::Extrude) { float volume_extruded_filament = area_filament_cross_section * delta_pos[E]; float area_toolpath_cross_section = volume_extruded_filament / delta_xyz; @@ -4783,6 +4786,7 @@ void GCodeProcessor::store_move_vertex(EMoveType type, EMovePathType path_type) m_width, m_height, m_mm3_per_mm, + m_travel_dist, m_fan_speed, m_extruder_temps[m_extruder_id], static_cast(m_result.moves.size()), diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 661dd8a981..311920b6b8 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -162,6 +162,7 @@ class Print; float width{ 0.0f }; // mm float height{ 0.0f }; // mm float mm3_per_mm{ 0.0f }; + float travel_dist{ 0.0f }; // mm float fan_speed{ 0.0f }; // percentage float temperature{ 0.0f }; // Celsius degrees float time{ 0.0f }; // s @@ -704,6 +705,7 @@ class Print; float m_forced_width; // mm float m_forced_height; // mm float m_mm3_per_mm; + float m_travel_dist; // mm float m_fan_speed; // percentage float m_z_offset; // mm ExtrusionRole m_extrusion_role; diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index e42fe38ab1..3470556fb3 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -412,6 +412,7 @@ void GCodeViewer::SequentialView::Marker::render(int canvas_width, int canvas_he // break; // } case EViewType::VolumetricRate: { + if (m_curr_move.type != EMoveType::Extrude) break; ImGui::SameLine(startx2); sprintf(buf, "%s%.2f", flow.c_str(), m_curr_move.volumetric_rate()); ImGui::PushItemWidth(item_size); @@ -1143,8 +1144,12 @@ void GCodeViewer::refresh(const GCodeProcessorResult& gcode_result, const std::v m_extrusions.ranges.width.update_from(round_to_bin(curr.width)); m_extrusions.ranges.fan_speed.update_from(curr.fan_speed); m_extrusions.ranges.temperature.update_from(curr.temperature); - if (curr.extrusion_role != erCustom || is_visible(erCustom)) - m_extrusions.ranges.volumetric_rate.update_from(round_to_bin(curr.volumetric_rate())); + if (curr.delta_extruder > 0.005 && curr.travel_dist > 0.01) { + // Ignore very tiny extrusions from flow rate calculation, because + // it could give very imprecise result due to rounding in gcode generation + if (curr.extrusion_role != erCustom || is_visible(erCustom)) + m_extrusions.ranges.volumetric_rate.update_from(round_to_bin(curr.volumetric_rate())); + } if (curr.layer_duration > 0.f) { m_extrusions.ranges.layer_duration.update_from(curr.layer_duration); From 54a5ac923549be1a8ccb8e1fc87284908a45eff2 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 24 Apr 2025 08:13:15 +0800 Subject: [PATCH 09/15] reenable appimage build on ubuntu 24.04 (#9458) * reenable appimage build on ubuntu 24.04 * update TIFF * fix build error --- .cursorignore | 5 ++++- .github/workflows/build_all.yml | 4 ++-- .github/workflows/build_orca.yml | 2 +- deps/TIFF/TIFF.cmake | 7 ++----- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.cursorignore b/.cursorignore index 5ff5f06f8d..d79104d045 100644 --- a/.cursorignore +++ b/.cursorignore @@ -4,4 +4,7 @@ build_*/ build/ localization/ sandboxes/ -resources/ +resources/* +!resources/web/ +!resources/dailytip +!resources/shaders diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index fcdfad099b..c0990561e1 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -49,9 +49,9 @@ jobs: fail-fast: false matrix: include: - # Deprecate appimage + # Deprecate 20.04appimage # - os: ubuntu-20.04 - # - os: ubuntu-24.04 + - os: ubuntu-24.04 - os: windows-latest - os: macos-14 arch: arm64 diff --git a/.github/workflows/build_orca.yml b/.github/workflows/build_orca.yml index 68f6553e0a..650ef10bec 100644 --- a/.github/workflows/build_orca.yml +++ b/.github/workflows/build_orca.yml @@ -267,7 +267,7 @@ jobs: chmod +x ./build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage - name: Build orca_custom_preset_tests - if: github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-20.04' + if: github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-24.04' working-directory: ${{ github.workspace }}/build/src shell: bash run: | diff --git a/deps/TIFF/TIFF.cmake b/deps/TIFF/TIFF.cmake index 01d72428b9..9d66d89b8b 100644 --- a/deps/TIFF/TIFF.cmake +++ b/deps/TIFF/TIFF.cmake @@ -17,7 +17,7 @@ if (APPLE) else() orcaslicer_add_cmake_project(TIFF URL https://gitlab.com/libtiff/libtiff/-/archive/v4.1.0/libtiff-v4.1.0.zip - URL_HASH SHA256=c56edfacef0a60c0de3e6489194fcb2f24c03dbb550a8a7de5938642d045bd32 + URL_HASH SHA256=17a3e875acece9be40b093361cfef47385d4ef22c995ffbf36b2871f5785f9b8 DEPENDS ${ZLIB_PKG} ${PNG_PKG} dep_JPEG CMAKE_ARGS -Dlzma:BOOL=OFF @@ -27,7 +27,4 @@ else() -Dpixarlog:BOOL=OFF ) -endif() - - - +endif() \ No newline at end of file From 09f2ee467b4ed6c666c1a179cbe8b40df2eaedee Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Thu, 24 Apr 2025 09:37:05 +0800 Subject: [PATCH 10/15] Enable deploy orca_custom_preset_tests (#9465) --- .github/workflows/build_orca.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_orca.yml b/.github/workflows/build_orca.yml index 650ef10bec..75e78e344a 100644 --- a/.github/workflows/build_orca.yml +++ b/.github/workflows/build_orca.yml @@ -307,7 +307,7 @@ jobs: message: "nightly-builds" - name: Deploy orca_custom_preset_tests - if: ${{ ! env.ACT && github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-20.04' }} + if: ${{ ! env.ACT && github.ref == 'refs/heads/main' && inputs.os == 'ubuntu-24.04' }} uses: WebFreak001/deploy-nightly@v3.2.0 with: upload_url: https://uploads.github.com/repos/SoftFever/OrcaSlicer/releases/137995723/assets{?name,label} From 672c115c6103528a39660acdb089a5d5e3802273 Mon Sep 17 00:00:00 2001 From: Henk <40023052+elektrohenk@users.noreply.github.com> Date: Thu, 24 Apr 2025 05:03:28 +0200 Subject: [PATCH 11/15] Fix infill anchor missing for FillPlanePath (#9462) Fix infill anchor missing for archimedian chords, hilbert curve and octagram spiral infill pattern --- src/libslic3r/Fill/FillPlanePath.cpp | 66 ++++++++++++++-------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/src/libslic3r/Fill/FillPlanePath.cpp b/src/libslic3r/Fill/FillPlanePath.cpp index 2167e3704b..6044ba43a2 100644 --- a/src/libslic3r/Fill/FillPlanePath.cpp +++ b/src/libslic3r/Fill/FillPlanePath.cpp @@ -119,42 +119,44 @@ void FillPlanePath::_fill_surface_single( if (polyline.size() >= 2) { Polylines polylines = intersection_pl(polyline, expolygon); - Polylines chained; - if (params.dont_connect() || params.density > 0.5 || polylines.size() <= 1) { - // ORCA: special flag for flow rate calibration - auto is_flow_calib = params.extrusion_role == erTopSolidInfill && - this->print_object_config->has("calib_flowrate_topinfill_special_order") && - this->print_object_config->option("calib_flowrate_topinfill_special_order")->getBool() && - dynamic_cast(this); - if (is_flow_calib) { - // We want the spiral part to be printed inside-out - // Find the center spiral line first, by looking for the longest one - auto it = std::max_element(polylines.begin(), polylines.end(), [](const Polyline& a, const Polyline& b) { return a.length() < b.length(); }); - Polyline center_spiral = std::move(*it); + if (!polylines.empty()) { + Polylines chained; + if (params.dont_connect() || params.density > 0.5) { + // ORCA: special flag for flow rate calibration + auto is_flow_calib = params.extrusion_role == erTopSolidInfill && + this->print_object_config->has("calib_flowrate_topinfill_special_order") && + this->print_object_config->option("calib_flowrate_topinfill_special_order")->getBool() && + dynamic_cast(this); + if (is_flow_calib) { + // We want the spiral part to be printed inside-out + // Find the center spiral line first, by looking for the longest one + auto it = std::max_element(polylines.begin(), polylines.end(), + [](const Polyline& a, const Polyline& b) { return a.length() < b.length(); }); + Polyline center_spiral = std::move(*it); - // Ensure the spiral is printed from inside to out - if (center_spiral.first_point().squaredNorm() > center_spiral.last_point().squaredNorm()) { - center_spiral.reverse(); + // Ensure the spiral is printed from inside to out + if (center_spiral.first_point().squaredNorm() > center_spiral.last_point().squaredNorm()) { + center_spiral.reverse(); + } + + // Chain the other polylines + polylines.erase(it); + chained = chain_polylines(std::move(polylines)); + + // Then add the center spiral back + chained.push_back(std::move(center_spiral)); + } else { + chained = chain_polylines(std::move(polylines)); } - - // Chain the other polylines - polylines.erase(it); - chained = chain_polylines(std::move(polylines)); - - // Then add the center spiral back - chained.push_back(std::move(center_spiral)); - } else { - chained = chain_polylines(std::move(polylines)); + } else + connect_infill(std::move(polylines), expolygon, chained, this->spacing, params); + // paths must be repositioned and rotated back + for (Polyline& pl : chained) { + pl.translate(shift.x(), shift.y()); + pl.rotate(direction.first); } + append(polylines_out, std::move(chained)); } - else - connect_infill(std::move(polylines), expolygon, chained, this->spacing, params); - // paths must be repositioned and rotated back - for (Polyline &pl : chained) { - pl.translate(shift.x(), shift.y()); - pl.rotate(direction.first); - } - append(polylines_out, std::move(chained)); } } From 2a6c15d15a2c4c35acbdba2779d4295047aea789 Mon Sep 17 00:00:00 2001 From: yw4z Date: Thu, 24 Apr 2025 10:41:36 +0300 Subject: [PATCH 12/15] Fix: Rotation gizmo axis line colors not matches with axis colors (#9427) Update GLGizmoRotate.cpp --- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 59c5f194ed..dfdd788029 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -174,7 +174,9 @@ void GLGizmoRotate::on_render() render_angle_arc(m_highlight_color, hover_radius_changed); } - render_grabber_connection(color, radius_changed); + // ORCA dont use axis color on line because they are not on same direction with axis + const ColorRGBA line_color = (m_hover_id != -1) ? m_drag_color : ColorRGBA(.6f, .6f ,.6f, 1.f); + render_grabber_connection(line_color, radius_changed); shader->stop_using(); } From 07634d2ba26561786a8034aa3f470dff0c2b5225 Mon Sep 17 00:00:00 2001 From: yw4z Date: Thu, 24 Apr 2025 11:09:39 +0300 Subject: [PATCH 13/15] Modernize wxButtons on Parameters & Physical Printer window (#9459) * update * Update Tab.hpp --- src/slic3r/GUI/PhysicalPrinterDialog.cpp | 36 ++++++++--- src/slic3r/GUI/PhysicalPrinterDialog.hpp | 14 ++--- src/slic3r/GUI/Tab.cpp | 78 +++++++++++++++++++----- src/slic3r/GUI/Tab.hpp | 2 +- src/slic3r/GUI/Widgets/StateColor.cpp | 5 +- 5 files changed, 101 insertions(+), 34 deletions(-) diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.cpp b/src/slic3r/GUI/PhysicalPrinterDialog.cpp index 1ec7b537e3..78e33b19e7 100644 --- a/src/slic3r/GUI/PhysicalPrinterDialog.cpp +++ b/src/slic3r/GUI/PhysicalPrinterDialog.cpp @@ -136,9 +136,26 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr m_optgroup->append_single_option_line("host_type"); - auto create_sizer_with_btn = [](wxWindow* parent, ScalableButton** btn, const std::string& icon_name, const wxString& label) { - *btn = new ScalableButton(parent, wxID_ANY, icon_name, label, wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT); - (*btn)->SetFont(wxGetApp().normal_font()); + auto create_sizer_with_btn = [](wxWindow* parent, Button** btn, const std::string& icon_name, const wxString& label) { + *btn = new Button(parent, label, ""/*icon_name*/, 0, parent->FromDIP(16)); + (*btn)->SetFont(Label::Body_14); + (*btn)->SetMinSize(wxSize(parent->FromDIP(120), parent->FromDIP(26))); + (*btn)->SetSize(wxSize(parent->FromDIP(120), parent->FromDIP(26))); + (*btn)->SetCornerRadius(parent->FromDIP(4)); + StateColor clr_bg = StateColor( + std::pair(wxColour("#DFDFDF"), (int)StateColor::Disabled), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Pressed), + std::pair(wxColour("#D4D4D4"), (int)StateColor::Hovered), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Normal), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Enabled) + ); + (*btn)->SetBackgroundColor(clr_bg); + (*btn)->SetBorderColor(clr_bg); + (*btn)->SetTextColor(StateColor( + std::pair(wxColour("#6B6A6A"), (int)StateColor::Disabled), + std::pair(wxColour("#262E30"), (int)StateColor::Hovered), + std::pair(wxColour("#262E30"), (int)StateColor::Normal) + )); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(*btn); @@ -235,9 +252,8 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr auto print_host_printers = [this, create_sizer_with_btn](wxWindow* parent) { //add_scaled_button(parent, &m_printhost_port_browse_btn, "browse", _(L("Refresh Printers")), wxBU_LEFT | wxBU_EXACTFIT); - auto sizer = create_sizer_with_btn(parent, &m_printhost_port_browse_btn, "monitor_signal_strong", _(L("Refresh Printers"))); - ScalableButton* btn = m_printhost_port_browse_btn; - btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); + auto sizer = create_sizer_with_btn(parent, &m_printhost_port_browse_btn, "monitor_signal_strong", _L("Refresh") + " " + dots); + Button* btn = m_printhost_port_browse_btn; btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent e) { update_printers(); }); return sizer; }; @@ -712,11 +728,11 @@ void PhysicalPrinterDialog::on_dpi_changed(const wxRect& suggested_rect) { const int& em = em_unit(); - m_printhost_browse_btn->msw_rescale(); - m_printhost_test_btn->msw_rescale(); - m_printhost_logout_btn->msw_rescale(); + m_printhost_browse_btn->Rescale(); + m_printhost_test_btn->Rescale(); + m_printhost_logout_btn->Rescale(); if (m_printhost_cafile_browse_btn) - m_printhost_cafile_browse_btn->msw_rescale(); + m_printhost_cafile_browse_btn->Rescale(); m_optgroup->msw_rescale(); diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.hpp b/src/slic3r/GUI/PhysicalPrinterDialog.hpp index b6faff82f9..102e4635f6 100644 --- a/src/slic3r/GUI/PhysicalPrinterDialog.hpp +++ b/src/slic3r/GUI/PhysicalPrinterDialog.hpp @@ -11,7 +11,7 @@ class wxTextCtrl; class wxStaticText; -class ScalableButton; +class Button; class wxBoxSizer; namespace Slic3r { @@ -28,12 +28,12 @@ class PhysicalPrinterDialog : public DPIDialog DynamicPrintConfig* m_config { nullptr }; ConfigOptionsGroup* m_optgroup { nullptr }; - ScalableButton* m_printhost_browse_btn {nullptr}; - ScalableButton* m_printhost_test_btn {nullptr}; - ScalableButton* m_printhost_logout_btn {nullptr}; - ScalableButton* m_printhost_cafile_browse_btn {nullptr}; - ScalableButton* m_printhost_client_cert_browse_btn {nullptr}; - ScalableButton* m_printhost_port_browse_btn {nullptr}; + Button* m_printhost_browse_btn {nullptr}; + Button* m_printhost_test_btn {nullptr}; + Button* m_printhost_logout_btn {nullptr}; + Button* m_printhost_cafile_browse_btn {nullptr}; + Button* m_printhost_client_cert_browse_btn {nullptr}; + Button* m_printhost_port_browse_btn {nullptr}; RoundedRectangle* m_input_area {nullptr}; wxStaticText* m_valid_label {nullptr}; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 3807626741..13d0eff67e 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3545,14 +3545,30 @@ void TabFilament::build() optgroup->append_single_option_line("filament_stamping_loading_speed"); optgroup->append_single_option_line("filament_stamping_distance"); create_line_with_widget(optgroup.get(), "filament_ramming_parameters", "", [this](wxWindow* parent) { - auto ramming_dialog_btn = new wxButton(parent, wxID_ANY, _(L("Ramming settings"))+dots, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); - wxGetApp().UpdateDarkUI(ramming_dialog_btn); - ramming_dialog_btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); - ramming_dialog_btn->SetSize(ramming_dialog_btn->GetBestSize()); - auto sizer = new wxBoxSizer(wxHORIZONTAL); - sizer->Add(ramming_dialog_btn); + // ORCA modernize button style + Button* btn = new Button(parent, _(L("Set")) + " " + dots); + btn->SetFont(Label::Body_14); + btn->SetSize(wxSize(FromDIP(120), FromDIP(26))); + btn->SetCornerRadius(FromDIP(4)); + StateColor clr_bg = StateColor( + std::pair(wxColour("#DFDFDF"), (int)StateColor::Disabled), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Pressed), + std::pair(wxColour("#D4D4D4"), (int)StateColor::Hovered), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Normal), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Enabled) + ); + btn->SetBackgroundColor(clr_bg); + btn->SetBorderColor(clr_bg); + btn->SetTextColor(StateColor( + std::pair(wxColour("#6B6A6A"), (int)StateColor::Disabled), + std::pair(wxColour("#262E30"), (int)StateColor::Hovered), + std::pair(wxColour("#262E30"), (int)StateColor::Normal) + )); - ramming_dialog_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { + auto sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(btn); + + btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { RammingDialog dlg(this,(m_config->option("filament_ramming_parameters"))->get_at(0)); if (dlg.ShowModal() == wxID_OK) { load_key_value("filament_ramming_parameters", dlg.get_parameters()); @@ -5907,10 +5923,27 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep deps.checkbox = new wxCheckBox(parent, wxID_ANY, _(L("All"))); deps.checkbox->SetFont(Slic3r::GUI::wxGetApp().normal_font()); wxGetApp().UpdateDarkUI(deps.checkbox, false, true); - deps.btn = new ScalableButton(parent, wxID_ANY, "printer", from_u8((boost::format(" %s %s") % _utf8(L("Set")) % std::string(dots.ToUTF8())).str()), - wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true); - deps.btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); - deps.btn->SetSize(deps.btn->GetBestSize()); + + // ORCA modernize button style + Button* btn = new Button(parent, _(L("Set")) + " " + dots); + btn->SetFont(Label::Body_14); + btn->SetSize(wxSize(FromDIP(120), FromDIP(26))); + btn->SetCornerRadius(FromDIP(4)); + StateColor clr_bg = StateColor( + std::pair(wxColour("#DFDFDF"), (int)StateColor::Disabled), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Pressed), + std::pair(wxColour("#D4D4D4"), (int)StateColor::Hovered), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Normal), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Enabled) + ); + btn->SetBackgroundColor(clr_bg); + btn->SetBorderColor(clr_bg); + btn->SetTextColor(StateColor( + std::pair(wxColour("#6B6A6A"), (int)StateColor::Disabled), + std::pair(wxColour("#262E30"), (int)StateColor::Hovered), + std::pair(wxColour("#262E30"), (int)StateColor::Normal) + )); + deps.btn = btn; auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add((deps.checkbox), 0, wxALIGN_CENTER_VERTICAL); @@ -5994,10 +6027,25 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep // Return a callback to create a TabPrinter widget to edit bed shape wxSizer* TabPrinter::create_bed_shape_widget(wxWindow* parent) { - ScalableButton* btn = new ScalableButton(parent, wxID_ANY, "printer", " " + _(L("Set")) + " " + dots, - wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true); - btn->SetFont(wxGetApp().normal_font()); - btn->SetSize(btn->GetBestSize()); + // ORCA modernize button style + Button* btn = new Button(parent, _(L("Set")) + " " + dots); + btn->SetFont(Label::Body_14); + btn->SetSize(wxSize(FromDIP(120), FromDIP(26))); + btn->SetCornerRadius(FromDIP(4)); + StateColor clr_bg = StateColor( + std::pair(wxColour("#DFDFDF"), (int)StateColor::Disabled), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Pressed), + std::pair(wxColour("#D4D4D4"), (int)StateColor::Hovered), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Normal), + std::pair(wxColour("#DFDFDF"), (int)StateColor::Enabled) + ); + btn->SetBackgroundColor(clr_bg); + btn->SetBorderColor(clr_bg); + btn->SetTextColor(StateColor( + std::pair(wxColour("#6B6A6A"), (int)StateColor::Disabled), + std::pair(wxColour("#262E30"), (int)StateColor::Hovered), + std::pair(wxColour("#262E30"), (int)StateColor::Normal) + )); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(btn, 0, wxALIGN_CENTER_VERTICAL); diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index cab9990bb4..5f5081fe54 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -164,7 +164,7 @@ protected: struct PresetDependencies { Preset::Type type = Preset::TYPE_INVALID; wxCheckBox *checkbox = nullptr; - ScalableButton *btn = nullptr; + Button *btn = nullptr; std::string key_list; // "compatible_printers" std::string key_condition; wxString dialog_title; diff --git a/src/slic3r/GUI/Widgets/StateColor.cpp b/src/slic3r/GUI/Widgets/StateColor.cpp index f2e1b07027..95cea1882f 100644 --- a/src/slic3r/GUI/Widgets/StateColor.cpp +++ b/src/slic3r/GUI/Widgets/StateColor.cpp @@ -11,6 +11,10 @@ static std::map gDarkColors{ {"#FF6F00", "#D15B00"}, // rgb(255, 111, 0) Secondary color {"#D01B1B", "#BB2A3A"}, // rgb(208, 27, 27) ??? {"#262E30", "#EFEFF0"}, // rgb(38, 46, 48) Button text color | Input Text Color + {"#DFDFDF", "#3E3E45"}, // rgb(223, 223, 223) Button Background color + {"#D4D4D4", "#4D4D54"}, // rgb(212, 212, 212) Button Background color on Hover + {"#6B6A6A", "#909090"}, // rgb(107, 107, 106) Button Dimmed text + {"#6B6B6A", "#B3B3B5"}, // rgb(107, 107, 106) Input box side text {"#2C2C2E", "#B3B3B4"}, // rgb(44, 44, 46) ??? {"#6B6B6B", "#818183"}, // rgb(107, 107, 107) Disabled Text {"#ACACAC", "#65656A"}, // rgb(172, 172, 172) Disabled Text on boxes | Dimmed Elements @@ -28,7 +32,6 @@ static std::map gDarkColors{ {"#DBDBDB", "#4A4A51"}, // rgb(219, 219, 219) Input/Combo Box Border Color {"#EDFAF2", "#283232"}, // rgb(229, 240, 238) Not Used anymore // Was used for BBS Combo / Dropdown focused background color {"#323A3C", "#E5E5E6"}, // rgb(50, 58, 60) Text color used on search list | - {"#6B6B6A", "#B3B3B5"}, // rgb(107, 107, 106) Button Dimmed text | Input box side text {"#303A3C", "#E5E5E5"}, // rgb(48, 58, 60) Object Table > Column header text color | StaticBox Border Color {"#FEFFFF", "#242428"}, // rgb(254, 255, 255) Side Tabbar bg | {"#A6A9AA", "#2D2D29"}, // rgb(166, 169, 170) Seperator color From 0d3683c3e12f9d1ecdb753c9f646e62d4940991e Mon Sep 17 00:00:00 2001 From: yw4z Date: Thu, 24 Apr 2025 11:23:28 +0300 Subject: [PATCH 14/15] Add Filament / Printer window & web based windows improvements (#9431) * update * update * Update 23.css * update * update * Update 21.css * update --- resources/web/guide/11/earth.png | Bin 39765 -> 20685 bytes resources/web/guide/11/tip.png | Bin 16890 -> 8515 bytes resources/web/guide/21/21.css | 63 +++++++++++++++++++-------- resources/web/guide/21/21.js | 6 ++- resources/web/guide/21/index.html | 4 ++ resources/web/guide/22/22.css | 2 +- resources/web/guide/22/22.js | 13 +++--- resources/web/guide/22/index.html | 6 +-- resources/web/guide/23/23.css | 2 +- resources/web/guide/23/23.js | 13 +++--- resources/web/guide/23/index.html | 6 +-- resources/web/guide/24/24.css | 60 +++++++++++++++++-------- resources/web/guide/24/24.js | 6 ++- resources/web/guide/24/index.html | 4 ++ resources/web/guide/3/index.html | 4 +- resources/web/guide/31/index.html | 4 +- resources/web/guide/4orca/4orca.css | 4 +- resources/web/guide/4orca/index.html | 4 +- resources/web/guide/5/5.css | 3 +- resources/web/guide/5/index.html | 4 +- resources/web/guide/css/common.css | 51 ++++++++++++++++++++-- resources/web/guide/css/dark.css | 33 ++++++++++---- 22 files changed, 211 insertions(+), 81 deletions(-) diff --git a/resources/web/guide/11/earth.png b/resources/web/guide/11/earth.png index 1b15fb712e524d10814e46c03934a0d0ef75cc1b..be8ffa44fbf286502705f28d4c8a43b71b44d3b2 100644 GIT binary patch literal 20685 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 literal 39765 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 WC9$g4jM-Em;89V~M3&20y!#)i>ezh% diff --git a/resources/web/guide/11/tip.png b/resources/web/guide/11/tip.png index 1e64a958df930a86ad64d3b4b274dadd7ea06401..3bda75771a26782877c8066a47e4c9c98bb9b006 100644 GIT binary patch literal 8515 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 D=>A8* literal 16890 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.SmallBtn_Green.trans{ + margin-right: 7px; /* ORCA adds a small gap between buttons */ } .BlockBanner a @@ -36,7 +40,7 @@ .PrinterArea { - padding: 10px; + padding: 10px 0px; /* ORCA Reduce horizontal paddings to fit 4 items per row */ display: flex; flex-wrap: wrap; } @@ -57,7 +61,7 @@ .PName { font-weight: 700; - text-align: left; + text-align:left; } .pNozzel @@ -66,7 +70,7 @@ align-items: center; justify-content:flex-start; color: #5A5A5A; - padding-left: 10px; + padding-left: 0px; /* ORCA Align checkboxes with with model text */ } .pNozzel input @@ -129,26 +133,47 @@ width: 100%; position: relative; display: flex; - } +} - .searchTerm { +.searchTerm { width: 100%; - border: 3px solid #009688; + border: 1px solid #DBDBDB; /* ORCA Searchbox > match border style */ /*border-right: none;*/ padding: 5px; - height: 20px; + padding-left:32px; + height: 20px; /* ORCA match height */ + line-height: 20px; /* ORCA center text vertically */ border-radius: 5px 5px 5px 5px; outline: none; color: #9DBFAF; - } - - .searchTerm:focus{ - color: #009688; - } - - /*Resize the wrap to see the search bar change!*/ - .wrap{ +} +@media (prefers-color-scheme: dark) { /* ORCA Searchbox > add dark mode support */ + .searchTerm {border: 1px solid #4A4A51;} +} + +.searchTerm:focus{ + color: #363636; /* ORCA Searchbox > use normal text color */ + border-color:#009688; /* ORCA Searchbox > highlight border color when focused. like on normal UI */ +} +@media (prefers-color-scheme: dark) { /* ORCA Searchbox > add dark mode support */ + .searchTerm:focus{color: #FFFFFF} +} + +#search-icon{ /* ORCA */ + position:absolute; + top: 50%; + transform: translateY(-50%); + left:8px; + margin:0px auto; + fill:#7C8282 +} +@media (prefers-color-scheme: dark) { /* ORCA Searchbox > add dark mode support */ + #search-icon{fill:#949494} +} + +/*Resize the wrap to see the search bar change!*/ +.wrap{ width: 30%; padding-bottom: 5px; - padding-left: 42px; - } \ No newline at end of file + padding-left: 32px; /* ORCA Align with content */ +} diff --git a/resources/web/guide/21/21.js b/resources/web/guide/21/21.js index deca4516d0..4ade5cb150 100644 --- a/resources/web/guide/21/21.js +++ b/resources/web/guide/21/21.js @@ -98,7 +98,8 @@ function HandleModelList( pVal ) for(let m=0;m'+nNozzel+'mm nozzle'; + /* ORCA use label tag to allow checkbox to toggle when user ckicked to text */ + HtmlNozzel += ''; } let CoverImage=OneModel['cover']; @@ -261,7 +262,8 @@ function FilterModelList(keyword) { let HtmlNozzel = ''; for (let m = 0; m < NozzleArray.length; m++) { let nNozzel = NozzleArray[m]; - HtmlNozzel += '
' + nNozzel + 'mm nozzle
'; + /* ORCA use label tag to allow checkbox to toggle when user ckicked to text */ + HtmlNozzel += ''; } let CoverImage = OneModel['cover']; diff --git a/resources/web/guide/21/index.html b/resources/web/guide/21/index.html index 3e19309d19..5122ccec49 100644 --- a/resources/web/guide/21/index.html +++ b/resources/web/guide/21/index.html @@ -22,6 +22,10 @@
diff --git a/resources/web/guide/22/22.css b/resources/web/guide/22/22.css index 0a542a4645..8f8abac0a9 100644 --- a/resources/web/guide/22/22.css +++ b/resources/web/guide/22/22.css @@ -60,7 +60,7 @@ input .MItem { - min-width: 220px; + min-width: 180px; /* ORCA Filtered items > slightly reduce min width to fit more items*/ height: 32px; } diff --git a/resources/web/guide/22/22.js b/resources/web/guide/22/22.js index ce75dd59eb..73a4110b2a 100644 --- a/resources/web/guide/22/22.js +++ b/resources/web/guide/22/22.js @@ -95,8 +95,8 @@ function SortUI() for(let n=0;n'+sModel['model']+'
'; + /* ORCA use label tag to allow checkbox to toggle when user ckicked to text */ + HtmlMode+=''; } $('#MachineList .CValues').append(HtmlMode); @@ -172,7 +172,8 @@ function SortUI() let LowType=fType.toLowerCase(); if(!TypeHtmlArray.hasOwnProperty(LowType)) { - let HtmlType='
'+fType+'
'; + /* ORCA use label tag to allow checkbox to toggle when user ckicked to text */ + let HtmlType=''; TypeHtmlArray[LowType]=HtmlType; } @@ -181,7 +182,8 @@ function SortUI() let lowVendor=fVendor.toLowerCase(); if(!VendorHtmlArray.hasOwnProperty(lowVendor)) { - let HtmlVendor='
'+fVendor+'
'; + /* ORCA use label tag to allow checkbox to toggle when user ckicked to text */ + let HtmlVendor=''; VendorHtmlArray[lowVendor]=HtmlVendor; } @@ -190,7 +192,8 @@ function SortUI() let pFila=$("#ItemBlockArea input[vendor='"+fVendor+"'][filatype='"+fType+"'][name='"+fShortName+"']"); if(pFila.length==0) { - let HtmlFila='
'+fShortName+'
'; + /* ORCA use label tag to allow checkbox to toggle when user ckicked to text */ + let HtmlFila=''; $("#ItemBlockArea").append(HtmlFila); } diff --git a/resources/web/guide/22/index.html b/resources/web/guide/22/index.html index 6e379d2a0b..cf8e26e7d6 100644 --- a/resources/web/guide/22/index.html +++ b/resources/web/guide/22/index.html @@ -24,7 +24,7 @@
printer
-
all
+ + + +
diff --git a/resources/web/guide/3/index.html b/resources/web/guide/3/index.html index c9ae0994bd..836811bf84 100644 --- a/resources/web/guide/3/index.html +++ b/resources/web/guide/3/index.html @@ -26,10 +26,10 @@

-
+
+
Back
diff --git a/resources/web/guide/31/index.html b/resources/web/guide/31/index.html index 965d1538ae..65b81fd420 100644 --- a/resources/web/guide/31/index.html +++ b/resources/web/guide/31/index.html @@ -25,10 +25,10 @@

-
+
+
Back
diff --git a/resources/web/guide/4orca/4orca.css b/resources/web/guide/4orca/4orca.css index f12a7860fe..d2ffcd8469 100644 --- a/resources/web/guide/4orca/4orca.css +++ b/resources/web/guide/4orca/4orca.css @@ -16,12 +16,12 @@ margin-top:10mm; line-height: 30px; } - +/* ORCA brokes shape of custom css checkbox #StealthMode { width: 30px; } - +*/ #RestartText { padding-left:30px; diff --git a/resources/web/guide/4orca/index.html b/resources/web/guide/4orca/index.html index 975123eabc..c108144a81 100644 --- a/resources/web/guide/4orca/index.html +++ b/resources/web/guide/4orca/index.html @@ -25,8 +25,8 @@
- -
+ +
diff --git a/resources/web/guide/5/5.css b/resources/web/guide/5/5.css index 52d3248faa..8dd1cdc1f3 100644 --- a/resources/web/guide/5/5.css +++ b/resources/web/guide/5/5.css @@ -16,11 +16,12 @@ margin-top:10mm; line-height: 30px; } - +/* ORCA brokes shape of custom css checkbox #InstallCheck { width: 30px; } +*/ #RestartText { diff --git a/resources/web/guide/5/index.html b/resources/web/guide/5/index.html index aa838c1515..96357328d6 100644 --- a/resources/web/guide/5/index.html +++ b/resources/web/guide/5/index.html @@ -31,8 +31,8 @@ - - + +
diff --git a/resources/web/guide/css/common.css b/resources/web/guide/css/common.css index 411b219ee4..11eac6d01a 100644 --- a/resources/web/guide/css/common.css +++ b/resources/web/guide/css/common.css @@ -133,16 +133,17 @@ body padding: 3mm 9mm; font-size: 14px; text-align: center; - border: 1px solid #575757; + /* border: 1px solid #575757; */ /* ORCA match button style */ border-radius: 18px; - color: #575757; + background-color: #D9D9D9; + color: #000; /* ORCA match button style */ cursor: pointer; margin-left: 10px; } .GrayBtn:hover { - background-color:#E8E8E8; + background-color:#CCCCCC; /* ORCA match button style */ } .SmallBtn @@ -189,6 +190,50 @@ body cursor: pointer; } +/*---Checkboxes ORCA ---*/ +label:has(input[type="checkbox"]){ + margin:0; + padding: 0; + margin-right: 20px; +} + +label:has(input[type="checkbox"])>span{ + vertical-align: middle; + margin:0; +} + +input[type="checkbox"] { + -webkit-appearance: none; + appearance: none; + background-color:#FFFFFF; + margin:0; + margin-right: 6px; + width: 1em; + height: 1em; + border: 0.1em solid #DBDBDB; + border-radius: 0.15em; + display: inline-flex; + place-content: center; + background-color:#FFFFFF; +} + +input[type="checkbox"]::before { + content: ""; + width: 0.8em; + height: 0.8em; + transform: scale(0); + box-shadow: inset 1em 1em #FFFFFF; + clip-path: polygon(7% 37%, 0 45%, 33% 78%, 100% 30%, 95% 21%, 33% 64%); +} + +input[type="checkbox"]:checked { + border-color:#009688; + background-color:#009688; +} + +input[type="checkbox"]:checked::before { + transform: scale(1); +} /*----------------Light Mode-------------------*/ diff --git a/resources/web/guide/css/dark.css b/resources/web/guide/css/dark.css index ff3a22c342..4ba7e79baf 100644 --- a/resources/web/guide/css/dark.css +++ b/resources/web/guide/css/dark.css @@ -6,7 +6,7 @@ body { - background-color:#3E3E45; + background-color:#2D2D31; /* ORCA match background color */ color: #efeff0; } @@ -23,17 +23,32 @@ body color: #009688; } -/*-----Button-----*/ -.GrayBtn -{ - border: 1px solid #B9B9BC; - color: #B9B9BC; +.search>input[type=text]{ + background-color:#2D2D31; } -.GrayBtn:hover +/*---Checkboxes ORCA---*/ +input[type=checkbox]{ + background-color:#2D2D31; + border-color:#4A4A51; +} + +input[type=checkbox]:checked{ + background-color:#009688; +} + +/*-----Button-----*/ +.GrayBtn, .SmallBtn /* ORCA match button style GrayBtn & SmallBtn */ { - background-color:#E8E8E8; - color: #565656; + background-color:#3E3E45; + /* border: 1px solid #B9B9BC; */ + color: #FFFFFF; +} + +.GrayBtn:hover, .SmallBtn:hover /* ORCA match button style GrayBtn & SmallBtn */ +{ + background-color:#49494E; + color: #FFFFFF; } /*-------Text------*/ From 9f4cd93817730438bcba81cfa244d793e90624fd Mon Sep 17 00:00:00 2001 From: yw4z Date: Thu, 24 Apr 2025 17:33:50 +0300 Subject: [PATCH 15/15] Modernize Object Search Box & Improvements for Parameter Search Box (#9434) * update * Update Plater.cpp * Update Plater.cpp * Update Plater.cpp * Update Plater.cpp * Update Plater.cpp * Update Tab.cpp * update * Update Tab.cpp * Update Plater.cpp * Update Tab.cpp --- src/slic3r/GUI/Plater.cpp | 52 ++++++++++++++++++++++++++++----------- src/slic3r/GUI/Tab.cpp | 7 +++--- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 58a011b3b3..650f1bc563 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -352,7 +352,8 @@ struct Sidebar::priv wxPanel* m_panel_project_title; ScalableButton* m_filament_icon = nullptr; Button * m_flushing_volume_btn = nullptr; - wxSearchCtrl* m_search_bar = nullptr; + TextInput* m_search_item = nullptr; + StaticBox* m_search_bar = nullptr; Search::SearchObjectDialog* dia = nullptr; // BBS printer config @@ -426,7 +427,7 @@ void Sidebar::priv::on_search_update() { m_object_list->assembly_plate_object_name(); - wxString search_text = m_search_bar->GetValue(); + wxString search_text = m_search_item->GetTextCtrl()->GetValue(); m_object_list->GetModel()->search_object(search_text); dia->update_list(); } @@ -439,7 +440,7 @@ void Sidebar::priv::jump_to_object(ObjectDataViewModelNode* item) void Sidebar::priv::can_search() { if (m_search_bar->IsShown()) { - m_search_bar->SetFocus(); + m_search_item->SetFocus(); } } @@ -1092,25 +1093,45 @@ Sidebar::Sidebar(Plater *parent) //add project content p->sizer_params = new wxBoxSizer(wxVERTICAL); - p->m_search_bar = new wxSearchCtrl(p->scrolled, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); - p->m_search_bar->ShowSearchButton(true); - p->m_search_bar->ShowCancelButton(true); - p->m_search_bar->SetDescriptiveText(_L("Search plate, object and part.")); + // ORCA: Update search box to modern style + p->m_search_bar = new StaticBox(p->scrolled); + p->m_search_bar->SetCornerRadius(0); + p->m_search_bar->SetBorderColor(wxColour("#CECECE")); - p->m_search_bar->Bind(wxEVT_SET_FOCUS, [this](wxFocusEvent&) { + p->m_search_item = new TextInput(p->m_search_bar, wxEmptyString, wxEmptyString, "", wxDefaultPosition, wxDefaultSize, 0 | wxBORDER_NONE); + p->m_search_item->SetIcon(*BitmapCache().load_svg("search", FromDIP(16), FromDIP(16))); // ORCA: Add search icon to search box + + wxTextCtrl* text_ctrl = p->m_search_item->GetTextCtrl(); + text_ctrl->SetHint(_L("Search plate, object and part.")); + text_ctrl->SetForegroundColour(wxColour("#262E30")); + text_ctrl->SetFont(Label::Body_13); + text_ctrl->SetSize(wxSize(-1, FromDIP(16))); // Centers text vertically + + text_ctrl->Bind(wxEVT_SET_FOCUS, [this](wxFocusEvent& e) { this->p->on_search_update(); + p->m_search_bar->SetBorderColor(wxColour("#009688")); wxPoint pos = this->p->m_search_bar->ClientToScreen(wxPoint(0, 0)); pos.y += this->p->m_search_bar->GetRect().height; p->dia->SetPosition(pos); p->dia->Popup(); - }); - p->m_search_bar->Bind(wxEVT_COMMAND_TEXT_UPDATED, [this](wxCommandEvent&) { + e.Skip(); // required to show caret + }); + text_ctrl->Bind(wxEVT_COMMAND_TEXT_UPDATED, [this](wxCommandEvent&) { this->p->on_search_update(); - }); - p->m_search_bar->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e) { + }); + text_ctrl->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e) { p->dia->Dismiss(); + p->m_search_bar->SetBorderColor(wxColour("#CECECE")); + p->m_search_item->GetTextCtrl()->SetValue(""); // reset value when loose focus e.Skip(); - }); + }); + + auto search_sizer = new wxBoxSizer(wxHORIZONTAL); + search_sizer->Add(new wxWindow(p->m_search_bar, wxID_ANY, wxDefaultPosition, wxSize(0, 0)), 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(1)); + search_sizer->Add(p->m_search_item, 1, wxEXPAND | wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(2)); + p->m_search_bar->SetSizer(search_sizer); + p->m_search_bar->Layout(); + search_sizer->Fit(p->m_search_bar); p->m_object_list = new ObjectList(p->scrolled); @@ -1122,7 +1143,7 @@ Sidebar::Sidebar(Plater *parent) // Frequently Object Settings p->object_settings = new ObjectSettings(p->scrolled); - p->dia = new Search::SearchObjectDialog(p->m_object_list, p->m_search_bar); + p->dia = new Search::SearchObjectDialog(p->m_object_list, text_ctrl); #if !NEW_OBJECT_SETTING p->object_settings->Hide(); p->sizer_params->Add(p->object_settings->get_sizer(), 0, wxEXPAND | wxTOP, 5 * em / 10); @@ -1511,6 +1532,9 @@ void Sidebar::msw_rescale() // BBS //p->object_manipulation->msw_rescale(); p->object_settings->msw_rescale(); + p->m_search_item->Rescale(); + p->m_search_item->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(16))); + p->m_search_bar->Layout(); // BBS #if 0 diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 13d0eff67e..bfa7ae2803 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -273,7 +273,7 @@ void Tab::create_preset_tab() //search input m_search_item = new StaticBox(m_top_panel); StateColor box_colour(std::pair(*wxWHITE, StateColor::Normal)); - StateColor box_border_colour(std::pair(wxColour("#DBDBDB"), StateColor::Normal)); // ORCA match border color with other input/combo boxes + StateColor box_border_colour(std::pair(wxColour("#009688"), StateColor::Normal)); // ORCA match border color with other input/combo boxes m_search_item->SetBackgroundColor(box_colour); m_search_item->SetBorderColor(box_border_colour); @@ -286,8 +286,9 @@ void Tab::create_preset_tab() m_search_input->SetBackgroundColour(wxColour(238, 238, 238)); m_search_input->SetForegroundColour(wxColour(43, 52, 54)); m_search_input->SetFont(wxGetApp().bold_font()); - - search_sizer->Add(new wxWindow(m_search_item, wxID_ANY, wxDefaultPosition, wxSize(0, 0)), 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(6)); + m_search_input->SetIcon(*BitmapCache().load_svg("search", FromDIP(16), FromDIP(16))); + m_search_input->GetTextCtrl()->SetHint(_L("Search in preset") + dots); + search_sizer->Add(new wxWindow(m_search_item, wxID_ANY, wxDefaultPosition, wxSize(0, 0)), 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(2)); search_sizer->Add(m_search_input, 1, wxEXPAND | wxALL, FromDIP(2)); //bbl for linux //search_sizer->Add(new wxWindow(m_search_input, wxID_ANY, wxDefaultPosition, wxSize(0, 0)), 0, wxEXPAND | wxLEFT, 16);