From b97d44dae4854c342b835d3fd5265a22aec5d174 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Tue, 18 Jun 2024 17:25:12 +0800 Subject: [PATCH] NEW:active "import obj color" in command line jira: none Change-Id: I8bc5d4a1eea116305037b8194ff1d2e8aab83ce9 (cherry picked from commit 7df9f9d27d174b30a54ed27756d4a4a157557019) --- src/libslic3r/CMakeLists.txt | 1 + src/libslic3r/ObjColorUtils.cpp | 14 ++++++++++++++ src/libslic3r/ObjColorUtils.hpp | 7 ++++++- src/slic3r/CMakeLists.txt | 2 ++ src/slic3r/GUI/DeviceManager.cpp | 13 ++----------- src/slic3r/GUI/GuiColor.cpp | 32 +++++++++++++++++++++++++++++++ src/slic3r/GUI/GuiColor.hpp | 13 +++++++++++++ src/slic3r/GUI/ObjColorDialog.cpp | 31 +++--------------------------- src/slic3r/GUI/ObjColorDialog.hpp | 2 +- src/slic3r/GUI/Plater.cpp | 6 +++--- 10 files changed, 77 insertions(+), 44 deletions(-) create mode 100644 src/libslic3r/ObjColorUtils.cpp create mode 100644 src/slic3r/GUI/GuiColor.cpp create mode 100644 src/slic3r/GUI/GuiColor.hpp diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index eca70c451..2cdc5255b 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -213,6 +213,7 @@ set(lisbslic3r_sources Arrange.cpp NormalUtils.cpp NormalUtils.hpp + ObjColorUtils.cpp ObjColorUtils.hpp Orient.hpp Orient.cpp diff --git a/src/libslic3r/ObjColorUtils.cpp b/src/libslic3r/ObjColorUtils.cpp new file mode 100644 index 000000000..2cdc964ee --- /dev/null +++ b/src/libslic3r/ObjColorUtils.cpp @@ -0,0 +1,14 @@ +#include "ObjColorUtils.hpp" + +bool obj_color_deal_algo(std::vector & input_colors, + std::vector & cluster_colors_from_algo, + std::vector & cluster_labels_from_algo, + char & cluster_number) +{ + QuantKMeans quant(10); + quant.apply(input_colors, cluster_colors_from_algo, cluster_labels_from_algo, (int) cluster_number); + if (cluster_number == -1) { + return false; + } + return true; +} \ No newline at end of file diff --git a/src/libslic3r/ObjColorUtils.hpp b/src/libslic3r/ObjColorUtils.hpp index ea4418adf..8077e8ce7 100644 --- a/src/libslic3r/ObjColorUtils.hpp +++ b/src/libslic3r/ObjColorUtils.hpp @@ -3,7 +3,7 @@ #include #include "opencv2/opencv.hpp" - +#include "libslic3r/Color.hpp" class QuantKMeans { public: @@ -260,3 +260,8 @@ public: return image8UC3; } }; + +bool obj_color_deal_algo(std::vector &input_colors, + std::vector& cluster_colors_from_algo, + std::vector& cluster_labels_from_algo, + char & cluster_number); \ No newline at end of file diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 94964f73b..f67fd88bb 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -157,6 +157,8 @@ set(SLIC3R_GUI_SOURCES GUI/GLTexture.cpp GUI/GLToolbar.hpp GUI/GLToolbar.cpp + GUI/GuiColor.cpp + GUI/GuiColor.hpp GUI/IMToolbar.hpp GUI/IMToolbar.cpp GUI/GCodeViewer.hpp diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 00e52a2b6..198a0eabf 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -2,7 +2,7 @@ #include "DeviceManager.hpp" #include "libslic3r/Time.hpp" #include "libslic3r/Thread.hpp" -#include "slic3r/Utils/ColorSpaceConvert.hpp" +#include "GuiColor.hpp" #include "GUI_App.hpp" #include "MsgDialog.hpp" @@ -777,15 +777,6 @@ bool MachineObject::is_support_ams_mapping() return true; } -static float calc_color_distance(wxColour c1, wxColour c2) -{ - float lab[2][3]; - RGB2Lab(c1.Red(), c1.Green(), c1.Blue(), &lab[0][0], &lab[0][1], &lab[0][2]); - RGB2Lab(c2.Red(), c2.Green(), c2.Blue(), &lab[1][0], &lab[1][1], &lab[1][2]); - - return DeltaE76(lab[0][0], lab[0][1], lab[0][2], lab[1][0], lab[1][1], lab[1][2]); -} - void MachineObject::get_ams_colors(std::vector &ams_colors) { ams_colors.clear(); ams_colors.reserve(amsList.size()); @@ -912,7 +903,7 @@ int MachineObject::ams_filament_mapping(std::vector filaments, std val.tray_id = tray->second.id; wxColour c = wxColour(filaments[i].color); wxColour tray_c = AmsTray::decode_color(tray->second.color); - val.distance = calc_color_distance(c, tray_c); + val.distance = GUI::calc_color_distance(c, tray_c); if (filaments[i].type != tray->second.type) { val.distance = 999999; val.is_type_match = false; diff --git a/src/slic3r/GUI/GuiColor.cpp b/src/slic3r/GUI/GuiColor.cpp new file mode 100644 index 000000000..aeaa8b63f --- /dev/null +++ b/src/slic3r/GUI/GuiColor.cpp @@ -0,0 +1,32 @@ +#include "GuiColor.hpp" + +namespace Slic3r { namespace GUI { +wxColour convert_to_wxColour(const RGBA &color) +{ + auto r = std::clamp((int) (color[0] * 255.f), 0, 255); + auto g = std::clamp((int) (color[1] * 255.f), 0, 255); + auto b = std::clamp((int) (color[2] * 255.f), 0, 255); + auto a = std::clamp((int) (color[3] * 255.f), 0, 255); + wxColour wx_color(r, g, b, a); + return wx_color; +} + +RGBA convert_to_rgba(const wxColour &color) +{ + RGBA rgba; + rgba[0] = std::clamp(color.Red() / 255.f, 0.f, 1.f); + rgba[1] = std::clamp(color.Green() / 255.f, 0.f, 1.f); + rgba[2] = std::clamp(color.Blue() / 255.f, 0.f, 1.f); + rgba[3] = std::clamp(color.Alpha() / 255.f, 0.f, 1.f); + return rgba; +} + +float calc_color_distance(wxColour c1, wxColour c2) +{ + float lab[2][3]; + RGB2Lab(c1.Red(), c1.Green(), c1.Blue(), &lab[0][0], &lab[0][1], &lab[0][2]); + RGB2Lab(c2.Red(), c2.Green(), c2.Blue(), &lab[1][0], &lab[1][1], &lab[1][2]); + + return DeltaE76(lab[0][0], lab[0][1], lab[0][2], lab[1][0], lab[1][1], lab[1][2]); +} +} } diff --git a/src/slic3r/GUI/GuiColor.hpp b/src/slic3r/GUI/GuiColor.hpp new file mode 100644 index 000000000..d83277d93 --- /dev/null +++ b/src/slic3r/GUI/GuiColor.hpp @@ -0,0 +1,13 @@ +#ifndef slic3r_GUI_Color_hpp_ +#define slic3r_GUI_Color_hpp_ +#include +#include "libslic3r/Color.hpp" +#include "slic3r/Utils/ColorSpaceConvert.hpp" +namespace Slic3r { namespace GUI { +wxColour convert_to_wxColour(const RGBA &color); +RGBA convert_to_rgba(const wxColour &color); +float calc_color_distance(wxColour c1, wxColour c2); +} // namespace GUI +} // namespace Slic3r + +#endif /* slic3r_GUI_Color_hpp_ */ diff --git a/src/slic3r/GUI/ObjColorDialog.cpp b/src/slic3r/GUI/ObjColorDialog.cpp index d872d9b18..6b68beab7 100644 --- a/src/slic3r/GUI/ObjColorDialog.cpp +++ b/src/slic3r/GUI/ObjColorDialog.cpp @@ -8,7 +8,6 @@ #include "GUI_App.hpp" #include "MsgDialog.hpp" #include "Widgets/Button.hpp" -#include "slic3r/Utils/ColorSpaceConvert.hpp" #include "MainFrame.hpp" #include "libslic3r/Config.hpp" #include "BitmapComboBox.hpp" @@ -189,24 +188,7 @@ ObjColorDialog::ObjColorDialog(wxWindow * parent, wxGetApp().UpdateDlgDarkUI(this); } -RGBA convert_to_rgba(const wxColour &color) -{ - RGBA rgba; - rgba[0] = std::clamp(color.Red() / 255.f, 0.f, 1.f); - rgba[1] = std::clamp(color.Green() / 255.f, 0.f, 1.f); - rgba[2] = std::clamp(color.Blue() / 255.f, 0.f, 1.f); - rgba[3] = std::clamp(color.Alpha() / 255.f, 0.f, 1.f); - return rgba; -} -wxColour convert_to_wxColour(const RGBA &color) -{ - auto r = std::clamp((int) (color[0] * 255.f), 0, 255); - auto g = std::clamp((int) (color[1] * 255.f), 0, 255); - auto b = std::clamp((int) (color[2] * 255.f), 0, 255); - auto a = std::clamp((int) (color[3] * 255.f), 0, 255); - wxColour wx_color(r,g,b,a); - return wx_color; -} + // This panel contains all control widgets for both simple and advanced mode (these reside in separate sizers) ObjColorPanel::ObjColorPanel(wxWindow * parent, std::vector& input_colors, @@ -546,13 +528,6 @@ ComboBox *ObjColorPanel::CreateEditorCtrl(wxWindow *parent, int id) // wxRect la void ObjColorPanel::deal_approximate_match_btn() { - auto calc_color_distance = [](wxColour c1, wxColour c2) { - float lab[2][3]; - RGB2Lab(c1.Red(), c1.Green(), c1.Blue(), &lab[0][0], &lab[0][1], &lab[0][2]); - RGB2Lab(c2.Red(), c2.Green(), c2.Blue(), &lab[1][0], &lab[1][1], &lab[1][2]); - - return DeltaE76(lab[0][0], lab[0][1], lab[0][2], lab[1][0], lab[1][1], lab[1][2]); - }; m_warning_text->SetLabelText(""); if (m_result_icon_list.size() == 0) { return; } auto map_count = m_result_icon_list[0]->bitmap_combox->GetCount() -1; @@ -693,8 +668,8 @@ void ObjColorPanel::deal_algo(char cluster_number, bool redraw_ui) return; } m_last_cluster_number = cluster_number; - QuantKMeans quant(10); - quant.apply(m_input_colors, m_cluster_colors_from_algo, m_cluster_labels_from_algo, (int)cluster_number); + obj_color_deal_algo(m_input_colors, m_cluster_colors_from_algo, m_cluster_labels_from_algo, cluster_number); + m_cluster_colours.clear(); m_cluster_colours.reserve(m_cluster_colors_from_algo.size()); for (size_t i = 0; i < m_cluster_colors_from_algo.size(); i++) { diff --git a/src/slic3r/GUI/ObjColorDialog.hpp b/src/slic3r/GUI/ObjColorDialog.hpp index 601903597..56808d6dc 100644 --- a/src/slic3r/GUI/ObjColorDialog.hpp +++ b/src/slic3r/GUI/ObjColorDialog.hpp @@ -2,7 +2,7 @@ #define _OBJ_COLOR_DIALOG_H_ #include "GUI_Utils.hpp" -#include "libslic3r/Color.hpp" +#include "GuiColor.hpp" #include #include #include diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index ea3f09a55..e753a5d8f 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -57,13 +57,14 @@ #include "libslic3r/Utils.hpp" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/ClipperUtils.hpp" - +#include "libslic3r/ObjColorUtils.hpp" // For stl export #include "libslic3r/CSGMesh/ModelToCSGMesh.hpp" #include "libslic3r/CSGMesh/PerformCSGMeshBooleans.hpp" #include "GUI.hpp" #include "GUI_App.hpp" +#include "GuiColor.hpp" #include "GUI_ObjectList.hpp" #include "GUI_Utils.hpp" #include "GUI_Factories.hpp" @@ -3961,14 +3962,13 @@ std::vector Plater::priv::load_files(const std::vector& input_ std::vector project_presets; bool is_xxx; Semver file_version; - //ObjImportColorFn obj_color_fun=nullptr; auto obj_color_fun = [this, &path](std::vector &input_colors, bool is_single_color, std::vector &filament_ids, unsigned char &first_extruder_id) { if (!boost::iends_with(path.string(), ".obj")) { return; } const std::vector extruder_colours = wxGetApp().plater()->get_extruder_colors_from_plater_config(); ObjColorDialog color_dlg(nullptr, input_colors, is_single_color, extruder_colours, filament_ids, first_extruder_id); - if (color_dlg.ShowModal() != wxID_OK) { + if (color_dlg.ShowModal() != wxID_OK) { filament_ids.clear(); } };