From 83a64559a2067f95a6d63d96f922ea99783fd8f2 Mon Sep 17 00:00:00 2001 From: Rodrigo Faselli <162915171+RF47@users.noreply.github.com> Date: Fri, 12 Dec 2025 10:48:46 -0300 Subject: [PATCH 01/35] Update default Windows SDK include path version (Fix netfab mesh repair service for local compilation) (#11450) Update default Windows SDK include path version Changed the default Windows SDK include path from version 10.0.22000.0 to 10.0.26100.0 in CMakeLists.txt to use a newer SDK version when environment variables are not set. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f2fe7fd414..162763621c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -346,7 +346,7 @@ if(WIN32) if (DEFINED ENV{WindowsSdkDir} AND DEFINED ENV{WindowsSDKVersion}) set(WIN10SDK_INCLUDE_PATH "$ENV{WindowsSdkDir}/Include/$ENV{WindowsSDKVersion}") else () - set(WIN10SDK_INCLUDE_PATH "C:/Program Files (x86)/Windows Kits/10/Include/10.0.22000.0") + set(WIN10SDK_INCLUDE_PATH "C:/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0") endif () if (NOT EXISTS "${WIN10SDK_INCLUDE_PATH}/winrt/windows.graphics.printing3d.h") message("${WIN10SDK_INCLUDE_PATH}/winrt/windows.graphics.printing3d.h was not found") From c9ea433cd5ceff420bff6257260218863560899e Mon Sep 17 00:00:00 2001 From: Alexandre Folle de Menezes Date: Fri, 12 Dec 2025 10:50:37 -0300 Subject: [PATCH 02/35] Complement the pt-BR translation (#11620) --- localization/i18n/pt_BR/OrcaSlicer_pt_BR.po | 120 +++++++++++++------- 1 file changed, 82 insertions(+), 38 deletions(-) diff --git a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po index d52a68ee1b..73fcdb50ea 100644 --- a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po +++ b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po @@ -2057,7 +2057,7 @@ msgid "Replace the selected part with new STL" msgstr "Substituir a peça selecionada por novo STL" msgid "Replace all with STL" -msgstr "" +msgstr "Substituir tudo por STL" msgid "Replace all selected parts with STL from folder" msgstr "Substituir todas peças selecionadas com STL da pasta" @@ -3406,7 +3406,7 @@ msgid "Step" msgstr "Passo" msgid "Unmapped" -msgstr "" +msgstr "Não mapeado" msgid "" "Upper half area: Original\n" @@ -4267,7 +4267,7 @@ msgid "Auto Check: Material" msgstr "Verificação Automática: Material" msgid "Live View Camera Calibration" -msgstr "" +msgstr "Calibração da Câmera ao Vivo" msgid "Waiting for heatbed to reach target temperature" msgstr "Aguardando mesa aquecida atingir a temperatura desejada" @@ -6785,7 +6785,7 @@ msgid "Monitor if the waste is piled up in the purge chute." msgstr "Verifique se os resíduos estão se acumulando na calha de purga." msgid "Nozzle Clumping Detection" -msgstr "Detecção de acúmulo no bico" +msgstr "Detecção de Aglomeração no Bico" msgid "Check if the nozzle is clumping by filaments or other foreign objects." msgstr "" @@ -8037,10 +8037,12 @@ msgid "All" msgstr "Todos" msgid "Auto flush after changing..." -msgstr "" +msgstr "Auto purga depois da troca..." msgid "Auto calculate flushing volumes when selected values changed" msgstr "" +"Calcula automaticamente os volumes de purga quando os valores selecionados " +"são alterados" msgid "Auto arrange plate after cloning" msgstr "Organizar automaticamente a placa após a clonagem" @@ -8100,7 +8102,7 @@ msgid "If enabled, reverses the direction of zoom with mouse wheel." msgstr "Se ativo, inverte a direção de zoom com a roda do mouse." msgid "Clear my choice on..." -msgstr "" +msgstr "Limpar minha escolha em..." msgid "Unsaved projects" msgstr "Projetos não salvos" @@ -8158,7 +8160,7 @@ msgid "Update built-in Presets automatically." msgstr "Atualizar automaticamente Predefinições integradas." msgid "Network plugin" -msgstr "" +msgstr "Plugin de rede" msgid "Enable network plugin" msgstr "Ativar plugin de rede" @@ -8882,15 +8884,20 @@ msgid "" "You have selected both external and AMS filaments for an extruder. You will " "need to manually switch the external filament during printing." msgstr "" +"Você selecionou filamentos externos e AMS para uma extrusora. Será " +"necessário trocar manualmente o filamento externo durante a impressão." msgid "" "TPU 90A/TPU 85A is too soft and does not support automatic Flow Dynamics " "calibration." -msgstr "" +msgstr "TPU 90A/TPU 85A é muito mole e não suporta calibração automática de " +"Dinâmica de Fluxo." msgid "" "Set dynamic flow calibration to 'OFF' to enable custom dynamic flow value." msgstr "" +"Desative a calibração de fluxo dinâmico para habilitar o valor de fluxo " +"dinâmico personalizado." msgid "This printer does not support printing all plates." msgstr "Esta impressora não suporta a imprimir todas as placas." @@ -8899,6 +8906,9 @@ msgid "" "Please cold pull before printing TPU to avoid clogging. You may use cold " "pull maintenance on the printer." msgstr "" +"Recomenda-se realizar um processo de 'cold pull' antes de imprimir em TPU " +"para evitar entupimentos. Você pode utilizar esse processo de manutenção na " +"impressora." msgid "High chamber temperature is required. Please close the door." msgstr "É necessária uma temperatura elevada na câmara. Feche a porta." @@ -8916,8 +8926,9 @@ msgid "click to retry" msgstr "clique para tentar novamente" msgid "Upload file timeout, please check if the firmware version supports it." -msgstr "Limite de tempo de envio exedido, verifique se a versão do firmware " -"tem suporte." +msgstr "" +"Limite de tempo de envio de arquivo excedido, verifique se a versão do " +"firmware tem suporte." msgid "" "No available external storage was obtained. Please confirm and try again." @@ -8936,6 +8947,8 @@ msgid "" "Please check the network and try again, You can restart or update the " "printer if the issue persists." msgstr "" +"Verifique a rede e tente novamente. Se o problema persistir, você pode " +"reiniciar ou atualizar a impressora." msgid "Sending..." msgstr "Enviando…" @@ -8952,7 +8965,7 @@ msgid "Sending failed, please try again!" msgstr "Falha no envio, tente novamente!" msgid "Connection failed. Click the icon to retry" -msgstr "" +msgstr "Falha na coexão. Clique no icon para tentar novamente" msgid "Cannot send the print task when the upgrade is in progress" msgstr "" @@ -9653,7 +9666,7 @@ msgid "Wipe tower parameters" msgstr "Parâmetros da torre de limpeza" msgid "Multi Filament" -msgstr "" +msgstr "Multi Filamento" msgid "Tool change parameters with single extruder MM printers" msgstr "" @@ -9723,7 +9736,7 @@ msgid "Timelapse G-code" msgstr "G-code de timelapse" msgid "Clumping Detection G-code" -msgstr "" +msgstr "G-code para detecção de aglomeração" msgid "Change filament G-code" msgstr "G-code de mudança de filamento" @@ -9862,11 +9875,11 @@ msgstr "Tem certeza de %1% a predefinição selecionada?" #, c-format, boost-format msgid "Left: %s" -msgstr "" +msgstr "Esquerda: %s" #, c-format, boost-format msgid "Right: %s" -msgstr "" +msgstr "Direita: %s" msgid "Click to reset current value and attach to the global value." msgstr "Clique para redefinir o valor atual e anexá-lo ao valor global." @@ -10102,25 +10115,25 @@ msgid "The configuration is up to date." msgstr "A configuração está atualizada." msgid "Open Wiki for more information >" -msgstr "" +msgstr "Abra o Wiki para mais informações >" msgid "OBJ file import color" msgstr "Importar cor de arquivo Obj" msgid "Some faces don't have color defined." -msgstr "" +msgstr "Algumas faces não têm a cor definida." msgid "MTL file exist error, could not find the material:" msgstr "" msgid "Please check OBJ or MTL file." -msgstr "" +msgstr "Verifique o arquivo OBJ ou MTL." msgid "Specify number of colors:" msgstr "Especifique a quantidade de cores:" msgid "Enter or click the adjustment button to modify number again" -msgstr "" +msgstr "Digite ou clique no botão de ajuste para modificar o número novamente" msgid "Recommended " msgstr "Recomendado " @@ -10129,10 +10142,10 @@ msgid "view" msgstr "" msgid "Current filament colors" -msgstr "" +msgstr "Cores de filamento atuais" msgid "Matching" -msgstr "" +msgstr "Correspondendo" msgid "Quick set" msgstr "" @@ -10147,7 +10160,7 @@ msgid "Append" msgstr "Adicionar" msgid "Append to existing filaments" -msgstr "" +msgstr "Adicionar aos filamentos existentes" msgid "Reset mapped extruders." msgstr "Redefinir extrusoras mapeadas." @@ -10389,6 +10402,9 @@ msgid "" "changed or filaments changed. You could disable the auto-calculate in Orca " "Slicer > Preferences" msgstr "" +"O Orca recalculará seus volumes de purga toda vez que a cor dos filamentos " +"ou os filamentos forem alterados. Você pode desativar o cálculo automático " +"em OrcaSlicer > Preferências" msgid "Flushing volume (mm³) for each filament pair." msgstr "Volume de purga (mm³) para cada par de filamentos." @@ -10405,10 +10421,10 @@ msgid "Re-calculate" msgstr "Recalcular" msgid "Left extruder" -msgstr "" +msgstr "Extrusora esquerda" msgid "Right extruder" -msgstr "" +msgstr "Extrusora direita" msgid "Multiplier" msgstr "Multiplicador" @@ -10417,7 +10433,7 @@ msgid "Flushing volumes for filament change" msgstr "Volumes de purga para troca de filamento" msgid "Please choose the filament colour" -msgstr "" +msgstr "Escolha a cor do filamento" msgid "" "Windows Media Player is required for this task! Do you want to enable " @@ -10732,19 +10748,27 @@ msgid "" "Try the following methods to update the connection parameters and reconnect " "to the printer." msgstr "" +"Tente os seguintes métodos para atualizar os parâmetros de conexão e " +"reconectar à impressora." msgid "1. Please confirm Orca Slicer and your printer are in the same LAN." msgstr "" +"1. Confirme se o Orca Slicer e sua impressora estão na mesma rede local." msgid "" "2. If the IP and Access Code below are different from the actual values on " "your printer, please correct them." msgstr "" +"2. Se o IP e o Código de Acesso abaixo forem diferentes dos valores reais da " +"sua impressora, corrija-os." msgid "" "3. Please obtain the device SN from the printer side; it is usually found in " "the device information on the printer screen." msgstr "" +"3. Obtenha o número de série (SN) do dispositivo na própria impressora; " +"geralmente ele pode ser encontrado nas informações do dispositivo na tela da " +"impressora." msgid "IP" msgstr "IP" @@ -10800,7 +10824,7 @@ msgstr "" "por favor passe para o passo 3 para resolver problemas de rede" msgid "Connection failed! Please refer to the wiki page." -msgstr "" +msgstr "Falha na conexão! Consulte a página da wiki." msgid "sending failed" msgstr "falha no envio" @@ -10809,9 +10833,11 @@ msgid "" "Failed to send. Click Retry to attempt sending again. If retrying does not " "work, please check the reason." msgstr "" +"Falha ao enviar. Clique em Tentar Novamente para tentar enviar de novo. Se " +"tentar novamente não funcionar, verifique o motivo." msgid "reconnect" -msgstr "" +msgstr "reconectar" msgid "Air Pump" msgstr "Bomba de Ar" @@ -10826,7 +10852,7 @@ msgid "Cutting Module" msgstr "Módulo de Corte" msgid "Auto Fire Extinguishing System" -msgstr "" +msgstr "Sistema Automático de Extinção de Incêndio" msgid "Model:" msgstr "Modelo:" @@ -10988,13 +11014,13 @@ msgid "Generating G-code: layer %1%" msgstr "Gerando G-code: camada %1%" msgid "Flush volumes matrix do not match to the correct size!" -msgstr "" +msgstr "A matriz de volumes de descarga não corresponde ao tamanho correto!" msgid "Grouping error: " -msgstr "" +msgstr "Erro de agrupamento: " msgid " can not be placed in the " -msgstr "" +msgstr " não pode ser colocado na " msgid "Inner wall" msgstr "Parede interna" @@ -11162,6 +11188,8 @@ msgid "" " is too close to clumping detection area, there may be collisions when " "printing." msgstr "" +" está muito perto da área de detecção de aglomeração, podendo haver colisões " +"durante a impressão." msgid "Prime Tower" msgstr "Torre de Preparo" @@ -11175,32 +11203,44 @@ msgstr " está muito perto da área de exclusão, e ocorrerão colisões.\n" msgid "" " is too close to clumping detection area, and collisions will be caused.\n" msgstr "" +" está muito perto da área de detecção de aglomeração, e ocorrerão colisões.\n" msgid "" "Printing high-temp and low-temp filaments together may cause nozzle clogging " "or printer damage." msgstr "" +"A impressão simultânea de filamentos de alta e baixa temperatura pode causar " +"entupimento do bico ou danos à impressora." msgid "" "Printing high-temp and low-temp filaments together may cause nozzle clogging " "or printer damage. If you still want to print, you can enable the option in " "Preferences." msgstr "" +"A impressão simultânea de filamentos de alta e baixa temperatura pode causar " +"entupimento do bico ou danos à impressora. Se ainda assim desejar imprimir, " +"você pode ativar a opção em Preferências." msgid "" "Printing different-temp filaments together may cause nozzle clogging or " "printer damage." msgstr "" +"Imprimir filamentos com temperaturas diferentes simultaneamente pode causar " +"entupimento dos bicos ou danos à impressora." msgid "" "Printing high-temp and mid-temp filaments together may cause nozzle clogging " "or printer damage." msgstr "" +"A impressão simultânea de filamentos de alta e média temperatura pode causar " +"entupimento do bico ou danos à impressora." msgid "" "Printing mid-temp and low-temp filaments together may cause nozzle clogging " "or printer damage." msgstr "" +"A impressão simultânea de filamentos de temperatura média e baixa pode causar " +"entupimento do bico ou danos à impressora." msgid "No extrusions under current settings." msgstr "Nenhuma extrusão com as configurações atuais." @@ -11215,6 +11255,8 @@ msgstr "" msgid "" "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "" +"A detecção de aglomeração não é suportada quando a sequência \"por objeto\" " +"está ativada." msgid "" "Prime tower is required for clumping detection; otherwise, there may be " @@ -11528,7 +11570,7 @@ msgid "Printable area" msgstr "Área de impressão" msgid "Extruder printable area" -msgstr "" +msgstr "Área de impressão da extrusora" msgid "Bed exclude area" msgstr "Área de exclusão da mesa" @@ -11590,12 +11632,14 @@ msgid "Maximum printable height which is limited by mechanism of printer." msgstr "Altura máxima de impressão limitada pelo mecanismo da impressora." msgid "Extruder printable height" -msgstr "" +msgstr "Altura de impressão da extrusora" msgid "" "Maximum printable height of this extruder which is limited by mechanism of " "printer." msgstr "" +"Altura máxima de impressão desta extrusora, limitada pelo mecanismo da " +"impressora." msgid "Preferred orientation" msgstr "Orientação preferida" @@ -14908,19 +14952,19 @@ msgstr "" "diâmetro do bico." msgid "Enable clumping detection" -msgstr "" +msgstr "Habilitar detecção de aglomeração" msgid "Clumping detection layers" -msgstr "" +msgstr "Camadas de detecção de aglomeração" msgid "Clumping detection layers." -msgstr "" +msgstr "Camadas de detecção de aglomeração." msgid "Probing exclude area of clumping" -msgstr "" +msgstr "Sondagem exclui área de aglomeração" msgid "Probing exclude area of clumping." -msgstr "" +msgstr "Sondagem exclui área de aglomeração." msgid "Filament to print internal sparse infill." msgstr "Filamento para imprimir preenchimento esparso interno." From 54c876222e0fb40f6209e46ce4519bfa22b98af4 Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Fri, 12 Dec 2025 12:32:28 -0300 Subject: [PATCH 03/35] Minor Tab.cpp redirection fixes + PowerLoss recovery link (#11608) * Update Tab.cpp * Readme Fix * Update Tab.cpp --- README.md | 2 +- src/slic3r/GUI/Tab.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b70b7cc431..59fb76034b 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ If you come across any of these in search results, please report them as Use varied infill [patterns](https://github.com/OrcaSlicer/OrcaSlicer/wiki/strength_settings_patterns) and accurate hole shapes for improved clarity. - **[Overhang](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_overhangs) and [Support Optimization](https://github.com/OrcaSlicer/OrcaSlicer/wiki#support-settings)** Modify geometry for printable overhangs with precise support placement. -- **[Granular Controls](https://github.com/OrcaSlicer/OrcaSlicer/wiki#process-settings and Customization)** +- **[Granular Controls and Customization](https://github.com/OrcaSlicer/OrcaSlicer/wiki#process-settings)** Fine-tune print speed, layer height, pressure, and temperature with precision. - **Network Printer Support** Seamless integration with Klipper, PrusaLink, and OctoPrint for remote control. diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index c26403c9fd..b98bb91ec3 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2482,7 +2482,7 @@ void TabPrint::build() optgroup->append_single_option_line("slowdown_for_curled_perimeters", "speed_settings_overhang_speed#slow-down-for-curled-perimeters"); Line line = { L("Overhang speed"), L("This is the speed for various overhang degrees. Overhang degrees are expressed as a percentage of line width. 0 speed means no slowing down for the overhang degree range and wall speed is used") }; - line.label_path = "slow-down-for-overhang"; + line.label_path = "speed_settings_overhang_speed#speed"; line.append_option(optgroup->get_option("overhang_1_4_speed")); line.append_option(optgroup->get_option("overhang_2_4_speed")); line.append_option(optgroup->get_option("overhang_3_4_speed")); @@ -3866,7 +3866,7 @@ void TabFilament::build() // Orca: adaptive pressure advance and calibration model optgroup->append_single_option_line("adaptive_pressure_advance", "material_flow_ratio_and_pressure_advance#enable-adaptive-pressure-advance-beta"); - optgroup->append_single_option_line("adaptive_pressure_advance_overhangs", "material_flow_ratio_and_pressure_advance##enable-adaptive-pressure-advance-for-overhangs-beta"); + optgroup->append_single_option_line("adaptive_pressure_advance_overhangs", "material_flow_ratio_and_pressure_advance#enable-adaptive-pressure-advance-for-overhangs-beta"); optgroup->append_single_option_line("adaptive_pressure_advance_bridges", "material_flow_ratio_and_pressure_advance#pressure-advance-for-bridges"); Option option = optgroup->get_option("adaptive_pressure_advance_model"); @@ -4366,7 +4366,7 @@ void TabPrinter::build_fff() optgroup->append_single_option_line("pellet_modded_printer", "printer_basic_information_advanced#pellet-modded-printer"); optgroup->append_single_option_line("bbl_use_printhost", "printer_basic_information_advanced#use-3rd-party-print-host"); optgroup->append_single_option_line("scan_first_layer" , "printer_basic_information_advanced#scan-first-layer"); - optgroup->append_single_option_line("enable_power_loss_recovery"); + optgroup->append_single_option_line("enable_power_loss_recovery", "printer_basic_information_advanced#power-loss-recovery"); //option = optgroup->get_option("wrapping_exclude_area"); //option.opt.full_width = true; //optgroup->append_single_option_line(option); @@ -4714,11 +4714,11 @@ PageShp TabPrinter::build_kinematics_page() // resonance avoidance ported over from qidi slicer optgroup = page->new_optgroup(L("Resonance Avoidance"), "param_resonance_avoidance"); - optgroup->append_single_option_line("resonance_avoidance", "printer_motion_ability_resonance_avoidance#resonance-avoidance"); + optgroup->append_single_option_line("resonance_avoidance", "printer_motion_ability#resonance-avoidance"); // Resonance‑avoidance speed inputs { Line resonance_line = {L("Resonance Avoidance Speed"), L""}; - resonance_line.label_path = "printer_motion_ability_resonance_avoidance#resonance-avoidance-speed"; + resonance_line.label_path = "printer_motion_ability#resonance-avoidance-speed"; resonance_line.append_option(optgroup->get_option("min_resonance_avoidance_speed")); resonance_line.append_option(optgroup->get_option("max_resonance_avoidance_speed")); optgroup->append_line(resonance_line); @@ -4896,7 +4896,7 @@ if (is_marlin_flavor) optgroup = page->new_optgroup(L("Single extruder multi-material parameters"), "param_settings"); optgroup->append_single_option_line("cooling_tube_retraction", "printer_multimaterial_semm_parameters#cooling-tube-position"); optgroup->append_single_option_line("cooling_tube_length", "printer_multimaterial_semm_parameters#cooling-tube-length"); - optgroup->append_single_option_line("parking_pos_retraction", "printer_multimaterial_semm_parameters#filament-parking-positions"); + optgroup->append_single_option_line("parking_pos_retraction", "printer_multimaterial_semm_parameters#filament-parking-position"); optgroup->append_single_option_line("extra_loading_move", "printer_multimaterial_semm_parameters#extra-loading-distance"); optgroup->append_single_option_line("high_current_on_filament_swap", "printer_multimaterial_semm_parameters#high-extruder-current-on-filament-swap"); From 7ec3d85a02b979a7f0a81f500f1ad1429660ca24 Mon Sep 17 00:00:00 2001 From: Matthew <84782280+xyluphobia@users.noreply.github.com> Date: Sun, 14 Dec 2025 01:36:47 +1100 Subject: [PATCH 04/35] Allow 'Change Type' to be used with Multiple Parts Selected (#11544) * Initial changes allowing you to change the type of multiple parts at once by selecting them all. * Removed second occurance of Change type in right click menu * Ready to go feature change * Remove accidental file creation * Removing excessive std::cerr --------- Co-authored-by: SoftFever --- src/slic3r/GUI/GUI_Factories.cpp | 11 +- src/slic3r/GUI/GUI_ObjectList.cpp | 197 ++++++++++++++++++++++++++---- 2 files changed, 184 insertions(+), 24 deletions(-) diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index 7686356bfb..a5e09271c6 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -751,8 +751,14 @@ wxMenuItem* MenuFactory::append_menu_item_change_type(wxMenu* menu) return append_menu_item(menu, wxID_ANY, _L("Change type"), "", [](wxCommandEvent&) { obj_list()->change_part_type(); }, "", menu, []() { - wxDataViewItem item = obj_list()->GetSelection(); - return item.IsOk() || obj_list()->GetModel()->GetItemType(item) == itVolume; + wxDataViewItemArray selections; + obj_list()->GetSelections(selections); + if (selections.empty()) return false; + for (const auto& it : selections) { + if (!(obj_list()->GetModel()->GetItemType(it) & itVolume)) + return false; // non-volume present -> disable + } + return true; }, m_parent); } @@ -1798,6 +1804,7 @@ wxMenu* MenuFactory::multi_selection_menu() } append_menu_item_per_object_process(menu); menu->AppendSeparator(); + append_menu_item_change_type(menu); append_menu_item_change_filament(menu); } return menu; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 5b5e0bd77a..1cea62ece8 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -24,6 +24,10 @@ #include "SingleChoiceDialog.hpp" #include "StepMeshDialog.hpp" + +#include +#include +#include #include #include #include @@ -5337,26 +5341,32 @@ ModelVolume* ObjectList::get_selected_model_volume() void ObjectList::change_part_type() { - ModelVolume* volume = get_selected_model_volume(); - if (!volume) - return; + wxDataViewItemArray selections; + GetSelections(selections); - const int obj_idx = get_selected_obj_idx(); - if (obj_idx < 0) return; + if (selections.size() <= 1) { + int obj_idx = get_selected_obj_idx(); + if (obj_idx < 0) { + return; + } + + ModelVolume* volume = get_selected_model_volume(); + if (!volume) { + return; + } const ModelVolumeType type = volume->type(); - if (type == ModelVolumeType::MODEL_PART) - { - int model_part_cnt = 0; - for (auto vol : (*m_objects)[obj_idx]->volumes) { - if (vol->type() == ModelVolumeType::MODEL_PART) - ++model_part_cnt; - } + if (type == ModelVolumeType::MODEL_PART) { + int model_part_cnt = 0; + for (auto vol : (*m_objects)[obj_idx]->volumes) { + if (vol->type() == ModelVolumeType::MODEL_PART) + ++model_part_cnt; + } - if (model_part_cnt == 1) { - Slic3r::GUI::show_error(nullptr, _(L("The type of the last solid object part is not to be changed."))); - return; - } + if (model_part_cnt == 1) { + Slic3r::GUI::show_error(nullptr, _(L("The type of the last solid object part is not to be changed."))); + return; + } } // ORCA: Fix crash when changing type of svg / text modifier @@ -5365,22 +5375,165 @@ void ObjectList::change_part_type() names.Add(_L("Negative Part")); names.Add(_L("Modifier")); if (!volume->is_svg() && !volume->is_text()) { - names.Add(_L("Support Blocker")); - names.Add(_L("Support Enforcer")); + names.Add(_L("Support Blocker")); + names.Add(_L("Support Enforcer")); } SingleChoiceDialog dlg(_L("Type:"), _L("Choose part type"), names, int(type)); auto new_type = ModelVolumeType(dlg.GetSingleChoiceIndex()); - if (new_type == type || new_type == ModelVolumeType::INVALID) - return; + if (new_type == type || new_type == ModelVolumeType::INVALID) { + return; + } take_snapshot("Change part type"); volume->set_type(new_type); wxDataViewItemArray sel = reorder_volumes_and_get_selection(obj_idx, [volume](const ModelVolume* vol) { return vol == volume; }); - if (!sel.IsEmpty()) - select_item(sel.front()); + if (!sel.IsEmpty()) { + select_item(sel.front()); + } + + return; + } + + // --- Multi Selection --- + struct Target { int obj_idx; Slic3r::ModelVolume* vol; }; + std::vector targets; + targets.reserve(selections.size()); + bool any_text_or_svg = false; + + for (const auto& item : selections) { + auto typeMask = m_objects_model->GetItemType(item); + if (!(typeMask & itVolume)) { + continue; + } + + int obj_idx = -1, vol_idx = -1; + get_selected_item_indexes(obj_idx, vol_idx, item); + if (obj_idx < 0 || vol_idx < 0) { + continue; + } + + ModelVolume* vol = (*m_objects)[obj_idx]->volumes[vol_idx]; + if (!vol) { + continue; + } + + targets.push_back({ obj_idx, vol }); + if (vol->is_svg() || vol->is_text()) + any_text_or_svg = true; + } + + if (targets.empty()) { + return; + } + + wxArrayString names; + names.Add(_L("Part")); + names.Add(_L("Negative Part")); + names.Add(_L("Modifier")); + if (!any_text_or_svg) { + names.Add(_L("Support Blocker")); + names.Add(_L("Support Enforcer")); + } + + // Preselect current type of the first selected volume + ModelVolumeType initial_type = targets.front().vol->type(); + SingleChoiceDialog dlg(_L("Type:"), _L("Choose part type"), names, int(initial_type)); + auto new_type = ModelVolumeType(dlg.GetSingleChoiceIndex()); + if (new_type == ModelVolumeType::INVALID) { + return; + } + + if (new_type != ModelVolumeType::MODEL_PART) { + // Count initial MODEL_PARTs per object + std::unordered_map parts_initial; + for (const auto& t : targets) { + int cnt = 0; + for (auto v : (*m_objects)[t.obj_idx]->volumes) + if (v->type() == ModelVolumeType::MODEL_PART) ++cnt; + parts_initial[t.obj_idx] = cnt; + } + + // Count how many selected MODEL_PARTs would be converted away, per object + std::unordered_map parts_to_remove; + for (const auto& t : targets) { + if (t.vol->type() == ModelVolumeType::MODEL_PART) { + ++parts_to_remove[t.obj_idx]; + } + } + + // If for any object: initial_parts > 0 and removals == initial_parts => would remove all + bool would_remove_all_for_any = false; + for (const auto& kv : parts_to_remove) { + const int obj_idx = kv.first; + const int removing = kv.second; + const int initial = parts_initial[obj_idx]; + if (initial > 0 && removing == initial) { + would_remove_all_for_any = true; + break; + } + } + + if (would_remove_all_for_any) { + Slic3r::GUI::show_error(nullptr, _(L("The type of the last solid object part is not to be changed."))); + return; + } + } + + take_snapshot("Change part type (multi)"); + + // Apply changes + size_t applied = 0, skipped_same = 0; + std::unordered_map> changed_per_object; + for (const auto& t : targets) { + const auto current = t.vol->type(); + if (current == new_type) { + ++skipped_same; + continue; + } + t.vol->set_type(new_type); + changed_per_object[t.obj_idx].push_back(t.vol); + ++applied; + } + + if (applied == 0) { + // Nothing changed; keep the original selection as-is + select_items(selections); + return; + } + + // Reorder per object and rebuild selection to follow changed volumes + wxDataViewItemArray new_selection; + for (const auto& kv : changed_per_object) { + const int obj_idx = kv.first; + const auto& changed_vols = kv.second; + + std::unordered_set changed_set; + changed_set.reserve(changed_vols.size()); + for (const auto* v : changed_vols) { + changed_set.insert(v); + } + + wxDataViewItemArray sel = reorder_volumes_and_get_selection( + obj_idx, + [&changed_set](const ModelVolume* v) -> bool { + return changed_set.find(v) != changed_set.end(); + } + ); + + // Append to new_selection + for (const auto& it : sel) new_selection.Add(it); + } + + if (!new_selection.IsEmpty()) { + select_items(new_selection); + } else { + select_items(selections); + } + + return; } void ObjectList::last_volume_is_deleted(const int obj_idx) From b2822b68614aaf86001bf767fba5f47ff48e970a Mon Sep 17 00:00:00 2001 From: Andreas Rammhold Date: Sun, 14 Dec 2025 04:43:04 +0100 Subject: [PATCH 05/35] Enable IPv6 usage in curls resolve code (#11639) * Enable IPv6 usage in curls resolve code Before this change OrcaSlicer would fail to resolve the IPv6 addresses of printers when trying to interact with them via HTTP. For context: I'm running my Klipper based printers with only IPv6 addresses being assigned to them. That works fine for everything (including other slicers such as prusa-slic3r). A few years ago I did debug this and figured that it came down to the single line in the code base that this commit removes. I've since patched every single OrcaSlicer version with this change and never noticed a downside. It should be fine to remove the restriction. --- src/slic3r/Utils/Http.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/slic3r/Utils/Http.cpp b/src/slic3r/Utils/Http.cpp index bcb9dda915..e10115b1f7 100644 --- a/src/slic3r/Utils/Http.cpp +++ b/src/slic3r/Utils/Http.cpp @@ -189,7 +189,6 @@ Http::priv::priv(const std::string &url) #ifdef __WINDOWS__ ::curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_MAX_TLSv1_2); #endif - ::curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); ::curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); ::curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); From 59ad126b48f02e6f4d3e4a6d0f41d93f16e3ac44 Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Sun, 14 Dec 2025 02:20:14 -0300 Subject: [PATCH 06/35] Fix: Replace with STL to Replace with 3D file: Support STEP (#11637) * Replace with STL to Replace with 3D file: Support STEP Enhanced the replace logic to support STEP (.stp, .step) files, including user-configurable mesh settings and dialog, while maintaining backward compatibility with STL and other formats. Updated the menu label and tooltips to 'Replace 3D file' for clarity. * Update 'STL' references to '3D file' in UI and logs Replaces user-facing text and log messages referring to 'STL' with '3D file' for broader file type support and improved clarity in the menu, status messages, and logging. * Merge branch 'main' into remplace-with-stl --- src/slic3r/GUI/GUI_Factories.cpp | 4 ++-- src/slic3r/GUI/Plater.cpp | 39 ++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index a5e09271c6..0148f695aa 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -870,14 +870,14 @@ void MenuFactory::append_menu_item_reload_from_disk(wxMenu* menu) void MenuFactory::append_menu_item_replace_with_stl(wxMenu *menu) { - append_menu_item(menu, wxID_ANY, _L("Replace with STL") + dots, _L("Replace the selected part with new STL"), + append_menu_item(menu, wxID_ANY, _L("Replace 3D file") + dots, _L("Replace the selected part with a new 3D file"), [](wxCommandEvent &) { plater()->replace_with_stl(); }, "", menu, []() { return plater()->can_replace_with_stl(); }, m_parent); } void MenuFactory::append_menu_item_replace_all_with_stl(wxMenu *menu) { - append_menu_item(menu, wxID_ANY, _L("Replace all with STL") + dots, _L("Replace all selected parts with STL from folder"), + append_menu_item(menu, wxID_ANY, _L("Replace all with 3D files") + dots, _L("Replace all selected parts with 3D files from folder"), [](wxCommandEvent &) { plater()->replace_all_with_stl(); }, "", menu, []() { return plater()->can_replace_all_with_stl(); }, m_parent); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 855788f1ff..1d5c6f508a 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -7766,7 +7766,38 @@ bool Plater::priv::replace_volume_with_stl(int object_idx, int volume_idx, const Model new_model; try { - new_model = Model::read_from_file(path, nullptr, nullptr, LoadStrategy::AddDefaultInstances | LoadStrategy::LoadModel); + const bool is_step = boost::algorithm::iends_with(path, ".stp") || boost::algorithm::iends_with(path, ".step"); + if (is_step) { + auto config = wxGetApp().app_config; + double linear = std::max(0.003, string_to_double_decimal_point(config->get("linear_defletion"))); + double angle = std::max(0.5, string_to_double_decimal_point(config->get("angle_defletion"))); + bool split_compound = config->get_bool("is_split_compound"); + bool is_user_cancel = false; + + auto callback = [&is_user_cancel, linear, angle, split_compound](Slic3r::Step &file, double &linear_value, double &angle_value, bool &is_split) -> int { + if (wxGetApp().app_config->get_bool("enable_step_mesh_setting")) { + StepMeshDialog mesh_dlg(nullptr, file, linear, angle); + if (mesh_dlg.ShowModal() == wxID_OK) { + linear_value = mesh_dlg.get_linear_defletion(); + angle_value = mesh_dlg.get_angle_defletion(); + is_split = mesh_dlg.get_split_compound_value(); + return 1; + } + } else { + linear_value = linear; + angle_value = angle; + is_split = split_compound; + return 1; + } + is_user_cancel = true; + return -1; + }; + + new_model = Model::read_from_step(path, LoadStrategy::AddDefaultInstances | LoadStrategy::LoadModel, nullptr, nullptr, callback, linear, angle, split_compound); + if (is_user_cancel) return false; + } else { + new_model = Model::read_from_file(path, nullptr, nullptr, LoadStrategy::AddDefaultInstances | LoadStrategy::LoadModel); + } for (ModelObject* model_object : new_model.objects) { model_object->center_around_origin(); model_object->ensure_on_bed(); @@ -7865,7 +7896,7 @@ void Plater::priv::replace_with_stl() return; } - if (!replace_volume_with_stl(object_idx, volume_idx, out_path, "Replace with STL")) + if (!replace_volume_with_stl(object_idx, volume_idx, out_path, "Replace with 3D file")) return; // update 3D scene @@ -7949,7 +7980,7 @@ void Plater::priv::replace_all_with_stl() return; } - std::string status = _L("Replaced with STLs from directory:\n").ToStdString() + out_path.string() + "\n\n"; + std::string status = _L("Replaced with 3D files from directory:\n").ToStdString() + out_path.string() + "\n\n"; for (unsigned int idx : volume_idxs) { const GLVolume* v = selection.get_volume(idx); @@ -7982,7 +8013,7 @@ void Plater::priv::replace_all_with_stl() BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " replacing volume : " << input_path << " with " << new_path; - if (!replace_volume_with_stl(object_idx, volume_idx, new_path, "Replace with STL")) { + if (!replace_volume_with_stl(object_idx, volume_idx, new_path, "Replace with 3D file")) { status += boost::str(boost::format(_L("✖ Skipped %1%: failed to replace.\n").ToStdString()) % volume_name); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " cannot replace volume : failed to replace with " << new_path; continue; From 00ff06a5d3a0b24172fad26f04afcc9f97cdd050 Mon Sep 17 00:00:00 2001 From: yw4z Date: Thu, 18 Dec 2025 15:14:56 +0300 Subject: [PATCH 07/35] Match button styles on whole UI and fixes for button class (#11233) * init * web buttons * Bind Dialog & Fix states * update * update * Update common.css * objcolordialog * privacy update dialog * Update CaliHistoryDialog.cpp * Update MultiMachineManagerPage.cpp * Update AMSControl.cpp * TipsDialog * Update AMSMaterialsSetting.cpp * extrusion calibration * Update UpdateDialogs.cpp * recenterdialog * update * Update Calibration.cpp * update * update * update * fix * update * ReleaseNote * update * update * fix remember checkbox position * add comments --- resources/web/flush/WipingDialog.html | 63 +---- resources/web/guide/1/index.html | 3 +- resources/web/guide/11/index.html | 3 +- resources/web/guide/21/21.css | 6 +- resources/web/guide/21/21.js | 8 +- resources/web/guide/21/index.html | 11 +- resources/web/guide/22/22.css | 8 +- resources/web/guide/22/index.html | 15 +- resources/web/guide/23/23.css | 8 +- resources/web/guide/23/index.html | 15 +- resources/web/guide/24/24.css | 6 +- resources/web/guide/24/24.js | 8 +- resources/web/guide/24/index.html | 13 +- resources/web/guide/3/index.html | 5 +- resources/web/guide/31/index.html | 5 +- resources/web/guide/4orca/index.html | 5 +- resources/web/guide/5/index.html | 5 +- resources/web/guide/6/index.html | 7 +- resources/web/guide/css/common.css | 79 +----- resources/web/guide/css/dark.css | 14 -- resources/web/homepage/css/dark.css | 11 - resources/web/homepage/css/home.css | 37 --- resources/web/homepage/index.html | 7 +- resources/web/include/global.css | 73 ++++++ resources/web/login/css/login.css | 12 - resources/web/login/error.html | 3 +- resources/web/model/css/dark.css | 5 - resources/web/model/index.html | 3 +- resources/web/model/model.css | 14 +- src/slic3r/GUI/AMSMaterialsSetting.cpp | 43 +--- src/slic3r/GUI/BBLStatusBarSend.cpp | 19 +- src/slic3r/GUI/BindDialog.cpp | 101 ++------ src/slic3r/GUI/CaliHistoryDialog.cpp | 78 +----- src/slic3r/GUI/Calibration.cpp | 10 +- src/slic3r/GUI/CloneDialog.cpp | 11 +- src/slic3r/GUI/ConnectPrinter.cpp | 22 +- src/slic3r/GUI/CreatePresetsDialog.cpp | 6 +- src/slic3r/GUI/DeviceManager.cpp | 2 +- src/slic3r/GUI/ExtrusionCalibration.cpp | 43 +--- src/slic3r/GUI/ExtrusionCalibration.hpp | 3 - src/slic3r/GUI/FilamentPickerDialog.cpp | 63 +---- src/slic3r/GUI/FilamentPickerDialog.hpp | 1 - src/slic3r/GUI/MultiMachineManagerPage.cpp | 29 +-- src/slic3r/GUI/OAuthDialog.cpp | 9 +- src/slic3r/GUI/OAuthDialog.hpp | 1 - src/slic3r/GUI/ObjColorDialog.cpp | 130 ++-------- src/slic3r/GUI/ParamsPanel.cpp | 37 +-- src/slic3r/GUI/ParamsPanel.hpp | 2 - src/slic3r/GUI/Preferences.cpp | 2 +- src/slic3r/GUI/PrivacyUpdateDialog.cpp | 22 +- src/slic3r/GUI/PrivacyUpdateDialog.hpp | 4 +- src/slic3r/GUI/RecenterDialog.cpp | 39 +-- src/slic3r/GUI/RecenterDialog.hpp | 2 - src/slic3r/GUI/ReleaseNote.cpp | 270 +++------------------ src/slic3r/GUI/ReleaseNote.hpp | 13 +- src/slic3r/GUI/SelectMachine.cpp | 18 +- src/slic3r/GUI/SendMultiMachinePage.cpp | 34 +-- src/slic3r/GUI/SendToPrinter.cpp | 34 +-- src/slic3r/GUI/StatusPanel.cpp | 130 ++-------- src/slic3r/GUI/UnsavedChangesDialog.cpp | 5 +- src/slic3r/GUI/UpdateDialogs.cpp | 24 +- src/slic3r/GUI/UpgradePanel.cpp | 16 +- src/slic3r/GUI/Widgets/AMSControl.cpp | 53 +--- src/slic3r/GUI/Widgets/Button.cpp | 21 +- src/slic3r/GUI/Widgets/DialogButtons.cpp | 42 ++-- src/slic3r/GUI/Widgets/DialogButtons.hpp | 15 +- src/slic3r/GUI/Widgets/StateColor.cpp | 1 + 67 files changed, 406 insertions(+), 1401 deletions(-) create mode 100644 resources/web/include/global.css diff --git a/resources/web/flush/WipingDialog.html b/resources/web/flush/WipingDialog.html index 4f6b807b9d..efaea1c8ea 100644 --- a/resources/web/flush/WipingDialog.html +++ b/resources/web/flush/WipingDialog.html @@ -137,40 +137,6 @@ display: inline-block; } - .btn { - display: inline-block; - padding: 6px 9px; - border: 2px solid transparent; - border-radius: 12px; - font-size: 12px; - text-align: center; - cursor: pointer; - transition: all 0.3s; - } - - .btn-ok { - color: #fff; - background-color: #009688; - } - .btn-ok:hover { - background-color: #26A69A; - } - - .btn-cancel { - color: black; - background-color: white; - border: 1px solid black; - } - .btn-cancel:hover { - background-color: #eeeeee; - } - - body.dark-mode button.btn-cancel { - background-color: #2d2d31; - color: #e0e0e0; - border: 1px solid #e0e0e0; - } - select { padding: 6px 9px; border: 1px solid #dbdbdb; @@ -197,7 +163,7 @@ .button-container { display: flex; justify-content: center; - gap: 10px; + gap: 0px; margin: 10px; } @@ -266,15 +232,6 @@ position: sticky; z-index: 11; } - - body.dark-mode .btn-ok { - background-color: #009688; - } - - body.dark-mode .btn-dark { - background-color: #34495e; - } - body.dark-mode select { background-color: #2d2d31; color: white; @@ -295,6 +252,8 @@ + +
@@ -303,14 +262,14 @@ in Orca Slicer > Preferences.
-
- +