From a0669137ec7e698320d0bc50ee986cb3f0e85164 Mon Sep 17 00:00:00 2001 From: Mack Date: Thu, 28 Nov 2024 12:23:59 +0800 Subject: [PATCH] NEW:step mesh add 'Split compound and compsolid' Optimize getting STEP node names. Fix load_same_type_files() GITHUB: #5214 Change-Id: I7d1035c122f21e3b08305509489bce415634ae80 (cherry picked from commit 76a401bfca1897994795cb37ffa9cbcbdaca8b6c) --- src/libslic3r/AppConfig.cpp | 3 +++ src/libslic3r/Format/STEP.cpp | 34 ++++++++++++++++++++++--------- src/libslic3r/Format/STEP.hpp | 3 ++- src/libslic3r/Model.cpp | 9 ++++---- src/libslic3r/Model.hpp | 5 +++-- src/slic3r/GUI/Plater.cpp | 22 ++++++++++++-------- src/slic3r/GUI/StepMeshDialog.cpp | 7 +++++++ src/slic3r/GUI/StepMeshDialog.hpp | 4 ++++ 8 files changed, 61 insertions(+), 26 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 5ec83a1f1..d8586e7e2 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -384,6 +384,9 @@ void AppConfig::set_defaults() if (get("angle_defletion").empty()) { set("angle_defletion", "0.5"); } + if (get("is_split_compound").empty()) { + set_bool("is_split_compound", false); + } // Remove legacy window positions/sizes erase("app", "main_frame_maximized"); diff --git a/src/libslic3r/Format/STEP.cpp b/src/libslic3r/Format/STEP.cpp index bd5cc2c54..8b9fcce69 100644 --- a/src/libslic3r/Format/STEP.cpp +++ b/src/libslic3r/Format/STEP.cpp @@ -165,16 +165,21 @@ int StepPreProcessor::preNum(const unsigned char byte) { return num; } -static void getNamedSolids(const TopLoc_Location& location, const std::string& prefix, - unsigned int& id, const Handle(XCAFDoc_ShapeTool) shapeTool, - const TDF_Label label, std::vector& namedSolids) { +static void getNamedSolids(const TopLoc_Location& location, + const std::string& prefix, + unsigned int& id, + const Handle(XCAFDoc_ShapeTool) shapeTool, + const TDF_Label label, + std::vector& namedSolids, + bool isSplitCompound = false) { TDF_Label referredLabel{label}; if (shapeTool->IsReference(label)) shapeTool->GetReferredShape(label, referredLabel); std::string name; Handle(TDataStd_Name) shapeName; - if (referredLabel.FindAttribute(TDataStd_Name::GetID(), shapeName)) + if (referredLabel.FindAttribute(TDataStd_Name::GetID(), shapeName) || + label.FindAttribute(TDataStd_Name::GetID(), shapeName)) name = TCollection_AsciiString(shapeName->Get()).ToCString(); if (name == "" || !StepPreProcessor::isUtf8(name)) @@ -185,7 +190,7 @@ static void getNamedSolids(const TopLoc_Location& location, const std::string& p TDF_LabelSequence components; if (shapeTool->GetComponents(referredLabel, components)) { for (Standard_Integer compIndex = 1; compIndex <= components.Length(); ++compIndex) { - getNamedSolids(localLocation, fullName, id, shapeTool, components.Value(compIndex), namedSolids); + getNamedSolids(localLocation, fullName, id, shapeTool, components.Value(compIndex), namedSolids, isSplitCompound); } } else { TopoDS_Shape shape; @@ -196,11 +201,19 @@ static void getNamedSolids(const TopLoc_Location& location, const std::string& p int i = 0; switch (shape_type) { case TopAbs_COMPOUND: + if (!isSplitCompound) { + namedSolids.emplace_back(TopoDS::Compound(transform.Shape()), fullName); + break; + } case TopAbs_COMPSOLID: - for (explorer.Init(transform.Shape(), TopAbs_SOLID); explorer.More(); explorer.Next()) { - i++; - const TopoDS_Shape& currentShape = explorer.Current(); - namedSolids.emplace_back(TopoDS::Solid(currentShape), fullName + "-SOLID-" + std::to_string(i)); + if (!isSplitCompound) { + namedSolids.emplace_back(TopoDS::CompSolid(transform.Shape()), fullName); + } else { + for (explorer.Init(transform.Shape(), TopAbs_SOLID); explorer.More(); explorer.Next()) { + i++; + const TopoDS_Shape& currentShape = explorer.Current(); + namedSolids.emplace_back(TopoDS::Solid(currentShape), fullName + "-SOLID-" + std::to_string(i)); + } } break; case TopAbs_SOLID: @@ -215,6 +228,7 @@ static void getNamedSolids(const TopLoc_Location& location, const std::string& p bool load_step(const char *path, Model *model, bool& is_cancel, double linear_defletion/*=0.003*/, double angle_defletion/*= 0.5*/, + bool isSplitCompound, ImportStepProgressFn stepFn, StepIsUtf8Fn isUtf8Fn, long& mesh_face_num) { bool cb_cancel = false; @@ -263,7 +277,7 @@ bool load_step(const char *path, Model *model, bool& is_cancel, return false; } } - getNamedSolids(TopLoc_Location{}, "", id, shapeTool, topLevelShapes.Value(iLabel), namedSolids); + getNamedSolids(TopLoc_Location{}, "", id, shapeTool, topLevelShapes.Value(iLabel), namedSolids, isSplitCompound); } std::vector stl; diff --git a/src/libslic3r/Format/STEP.hpp b/src/libslic3r/Format/STEP.hpp index a1403aa06..b37e85a22 100644 --- a/src/libslic3r/Format/STEP.hpp +++ b/src/libslic3r/Format/STEP.hpp @@ -41,6 +41,7 @@ extern bool load_step(const char *path, Model *model, bool& is_cancel, double linear_defletion = 0.003, double angle_defletion = 0.5, + bool isSplitCompound = false, ImportStepProgressFn proFn = nullptr, StepIsUtf8Fn isUtf8Fn = nullptr, long& mesh_face_num = *(new long(-1))); @@ -63,7 +64,7 @@ public: bool preprocess(const char* path, std::string &output_path); static bool isUtf8File(const char* path); static bool isUtf8(const std::string str); -private: +private: static bool isGBK(const std::string str); static int preNum(const unsigned char byte); //BBS: default is UTF8 for most step file. diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index f0ff09589..2c71793c2 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -188,9 +188,10 @@ Model Model::read_from_step(const std::string& LoadStrategy options, ImportStepProgressFn stepFn, StepIsUtf8Fn stepIsUtf8Fn, - std::function step_mesh_fn, + std::function step_mesh_fn, double linear_defletion, - double angle_defletion) + double angle_defletion, + bool is_split_compound) { Model model; bool result = false; @@ -199,12 +200,12 @@ Model Model::read_from_step(const std::string& Step step_file(input_file); step_file.load(); if (step_mesh_fn) { - if (step_mesh_fn(step_file, linear_defletion, angle_defletion) == -1) { + if (step_mesh_fn(step_file, linear_defletion, angle_defletion, is_split_compound) == -1) { Model empty_model; return empty_model; } } - result = load_step(input_file.c_str(), &model, is_cb_cancel, linear_defletion, angle_defletion, stepFn, stepIsUtf8Fn); + result = load_step(input_file.c_str(), &model, is_cb_cancel, linear_defletion, angle_defletion, is_split_compound, stepFn, stepIsUtf8Fn); if (is_cb_cancel) { Model empty_model; return empty_model; diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 3dac101d2..2131eb611 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -1592,9 +1592,10 @@ public: LoadStrategy options, ImportStepProgressFn stepFn, StepIsUtf8Fn stepIsUtf8Fn, - std::function step_mesh_fn, + std::function step_mesh_fn, double linear_defletion, - double angle_defletion); + double angle_defletion, + bool is_split_compound); //BBS: add part plate related logic // BBS: backup diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a4ef100dd..ea333fbc8 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -4027,6 +4027,7 @@ std::vector Plater::priv::load_files(const std::vector& input_ if (linear <= 0) linear = 0.003; double angle = string_to_double_decimal_point(wxGetApp().app_config->get("angle_defletion")); if (angle <= 0) angle = 0.5; + bool split_compound = wxGetApp().app_config->get_bool("is_split_compound"); model = Slic3r::Model:: read_from_step(path.string(), strategy, [this, &dlg, real_filename, &progress_percent, &file_percent, step_percent, INPUT_FILES_RATIO, total_files, i](int load_stage, int current, int total, bool &cancel) { @@ -4043,22 +4044,24 @@ std::vector Plater::priv::load_files(const std::vector& input_ Slic3r::GUI::show_info(nullptr, _L("Name of components inside step file is not UTF8 format!") + "\n\n" + _L("The name may show garbage characters!"), _L("Attention!")); }, - [this, &path, &is_user_cancel, &linear, &angle](Slic3r::Step& file, double& linear_value, double& angle_value)-> int { + [this, &path, &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(); + 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; - }, linear, angle); + }, linear, angle, split_compound); }else { model = Slic3r::Model:: read_from_file( path.string(), nullptr, nullptr, strategy, &plate_data, &project_presets, &is_xxx, &file_version, nullptr, @@ -5852,7 +5855,8 @@ void Plater::priv::reload_from_disk() boost::iends_with(path, ".step")) { double linear = string_to_double_decimal_point(wxGetApp().app_config->get("linear_defletion")); double angle = string_to_double_decimal_point(wxGetApp().app_config->get("angle_defletion")); - new_model = Model::read_from_step(path, LoadStrategy::AddDefaultInstances | LoadStrategy::LoadModel, nullptr, nullptr, nullptr, linear, angle); + bool is_split = wxGetApp().app_config->get_bool("is_split_compound"); + new_model = Model::read_from_step(path, LoadStrategy::AddDefaultInstances | LoadStrategy::LoadModel, nullptr, nullptr, nullptr, linear, angle, is_split); }else { new_model = Model::read_from_file(path, nullptr, nullptr, LoadStrategy::AddDefaultInstances | LoadStrategy::LoadModel, &plate_data, &project_presets, nullptr, nullptr, nullptr, nullptr, nullptr, 0, obj_color_fun); } @@ -10597,12 +10601,12 @@ bool Plater::load_same_type_files(const wxArrayString &filenames) { if (filenames.size() <= 1) { return true; } else { const wxString &filename = filenames.front(); - boost::filesystem::path path(filename.ToStdWstring()); - auto extension = trans_extension(path.extension()); + boost::filesystem::path path(filename.ToStdString()); + auto extension = trans_extension(path); for (size_t i = 1; i < filenames.size(); i++) { - boost::filesystem::path temp(filenames[i].ToStdWstring()); - auto temp_extension = trans_extension(temp.extension()); - if (extension != temp_extension) { + boost::filesystem::path temp(filenames[i].ToStdString()); + auto temp_extension = trans_extension(temp); + if (extension.extension() != temp_extension.extension()) { return false; } } diff --git a/src/slic3r/GUI/StepMeshDialog.cpp b/src/slic3r/GUI/StepMeshDialog.cpp index fa64b447d..fe9dbc9bb 100644 --- a/src/slic3r/GUI/StepMeshDialog.cpp +++ b/src/slic3r/GUI/StepMeshDialog.cpp @@ -235,6 +235,12 @@ StepMeshDialog::StepMeshDialog(wxWindow* parent, Slic3r::Step& file, double line bSizer->Add(angle_sizer, 1, wxEXPAND | wxLEFT | wxRIGHT, LEFT_RIGHT_PADING); + wxBoxSizer* check_sizer = new wxBoxSizer(wxHORIZONTAL); + m_split_compound_checkbox = new wxCheckBox(this, wxID_ANY, _L("Split compound and compsolid into multiple objects"), wxDefaultPosition, wxDefaultSize, 0); + m_split_compound_checkbox->SetValue(wxGetApp().app_config->get_bool("is_split_compound")); + check_sizer->Add(m_split_compound_checkbox, 0, wxALIGN_LEFT); + bSizer->Add(check_sizer, 1, wxEXPAND | wxLEFT | wxRIGHT, LEFT_RIGHT_PADING); + wxBoxSizer* mesh_face_number_sizer = new wxBoxSizer(wxHORIZONTAL); wxStaticText *mesh_face_number_title = new wxStaticText(this, wxID_ANY, _L("Number of triangular facets") + ": "); mesh_face_number_text = new wxStaticText(this, wxID_ANY, _L("0")); @@ -267,6 +273,7 @@ StepMeshDialog::StepMeshDialog(wxWindow* parent, Slic3r::Step& file, double line if (m_checkbox->IsChecked()) { wxGetApp().app_config->set_bool("enable_step_mesh_setting", false); } + wxGetApp().app_config->set_bool("is_split_compound", m_split_compound_checkbox->GetValue()); wxGetApp().app_config->set("linear_defletion", float_to_string_decimal_point(get_linear_defletion(), 3)); wxGetApp().app_config->set("angle_defletion", float_to_string_decimal_point(get_angle_defletion(), 2)); diff --git a/src/slic3r/GUI/StepMeshDialog.hpp b/src/slic3r/GUI/StepMeshDialog.hpp index 2090bcda9..1ed0a7384 100644 --- a/src/slic3r/GUI/StepMeshDialog.hpp +++ b/src/slic3r/GUI/StepMeshDialog.hpp @@ -30,11 +30,15 @@ public: return m_last_angle; } } + inline bool get_split_compound_value() { + return m_split_compound_checkbox->GetValue(); + } private: Slic3r::Step& m_file; Button* m_button_ok = nullptr; Button* m_button_cancel = nullptr; wxCheckBox* m_checkbox = nullptr; + wxCheckBox* m_split_compound_checkbox = nullptr; wxString m_linear_last; wxString m_angle_last; wxStaticText* mesh_face_number_text;