Improvements for statistics information:
+ Show 2 groups of errors: "Auto-repared" and "Remaning". + Use different icons for volumes with/without remaining errors + Fixed update of the ObjectList warnings icons after switch the color mode of a PrusaSlicer + Some code refactoring: Use same code for tooltips for "exclamation"-icon from an ObjectList and from a Sidebar->ObjectInfo
This commit is contained in:
parent
a5a7f64db0
commit
238e65e455
17
resources/icons/exclamation_manifold.svg
Normal file
17
resources/icons/exclamation_manifold.svg
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path fill="#808080" d="M8,11c-0.55,0-1-0.45-1-1V7c0-0.55,0.45-1,1-1s1,0.45,1,1v3C9,10.55,8.55,11,8,11z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<circle fill="#808080" cx="8" cy="13" r="1"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path fill="#808080" d="M15,15.5H1c-0.18,0-0.34-0.09-0.43-0.24c-0.09-0.15-0.09-0.34-0.01-0.49l7-13c0.17-0.32,0.71-0.32,0.88,0
|
||||||
|
l7,13c0.08,0.16,0.08,0.34-0.01,0.49C15.34,15.41,15.18,15.5,15,15.5z M1.84,14.5h12.33L8,3.05L1.84,14.5z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 781 B |
17
resources/icons/white/exclamation_manifold.svg
Normal file
17
resources/icons/white/exclamation_manifold.svg
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M8,11c-0.55,0-1-0.45-1-1V7c0-0.55,0.45-1,1-1s1,0.45,1,1v3C9,10.55,8.55,11,8,11z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<circle fill="#FFFFFF" cx="8" cy="13" r="1"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M15,15.5H1c-0.18,0-0.34-0.09-0.43-0.24c-0.09-0.15-0.09-0.34-0.01-0.49l7-13c0.17-0.32,0.71-0.32,0.88,0
|
||||||
|
l7,13c0.08,0.16,0.08,0.34-0.01,0.49C15.34,15.41,15.18,15.5,15,15.5z M1.84,14.5h12.33L8,3.05L1.84,14.5z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 781 B |
@ -1615,6 +1615,7 @@ TriangleMeshStats ModelObject::get_object_stl_stats() const
|
|||||||
const TriangleMeshStats& stats = volume->mesh().stats();
|
const TriangleMeshStats& stats = volume->mesh().stats();
|
||||||
|
|
||||||
// initialize full_stats (for repaired errors)
|
// initialize full_stats (for repaired errors)
|
||||||
|
full_stats.open_edges += stats.open_edges;
|
||||||
full_stats.degenerate_facets += stats.degenerate_facets;
|
full_stats.degenerate_facets += stats.degenerate_facets;
|
||||||
full_stats.edges_fixed += stats.edges_fixed;
|
full_stats.edges_fixed += stats.edges_fixed;
|
||||||
full_stats.facets_removed += stats.facets_removed;
|
full_stats.facets_removed += stats.facets_removed;
|
||||||
|
@ -1403,9 +1403,8 @@ void GUI_App::force_colors_update()
|
|||||||
void GUI_App::update_ui_from_settings()
|
void GUI_App::update_ui_from_settings()
|
||||||
{
|
{
|
||||||
update_label_colours();
|
update_label_colours();
|
||||||
mainframe->update_ui_from_settings();
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
// Upadte UU colors before Update UI from settings
|
||||||
if (m_force_colors_update) {
|
if (m_force_colors_update) {
|
||||||
m_force_colors_update = false;
|
m_force_colors_update = false;
|
||||||
mainframe->force_color_changed();
|
mainframe->force_color_changed();
|
||||||
@ -1414,6 +1413,7 @@ void GUI_App::update_ui_from_settings()
|
|||||||
m_wizard->force_color_changed();
|
m_wizard->force_color_changed();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
mainframe->update_ui_from_settings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI_App::persist_window_geometry(wxTopLevelWindow *window, bool default_maximized)
|
void GUI_App::persist_window_geometry(wxTopLevelWindow *window, bool default_maximized)
|
||||||
|
@ -382,12 +382,17 @@ int ObjectList::get_mesh_errors_count(const int obj_idx, const int vol_idx /*= -
|
|||||||
return (*m_objects)[obj_idx]->get_mesh_errors_count(vol_idx);
|
return (*m_objects)[obj_idx]->get_mesh_errors_count(vol_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx /*= -1*/) const
|
static std::string get_warning_icon_name(const TriangleMeshStats& stats)
|
||||||
|
{
|
||||||
|
return stats.repaired() ? (stats.manifold() ? "exclamation_manifold" : "exclamation") : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::pair<wxString, std::string> ObjectList::get_mesh_errors(const int obj_idx, const int vol_idx /*= -1*/, bool from_plater /*= false*/) const
|
||||||
{
|
{
|
||||||
const int errors = get_mesh_errors_count(obj_idx, vol_idx);
|
const int errors = get_mesh_errors_count(obj_idx, vol_idx);
|
||||||
|
|
||||||
if (errors == 0)
|
if (errors == 0)
|
||||||
return ""; // hide tooltip
|
return { "", "" }; // hide tooltip
|
||||||
|
|
||||||
// Create tooltip string, if there are errors
|
// Create tooltip string, if there are errors
|
||||||
wxString tooltip = format_wxstr(_L_PLURAL("Auto-repaired %1$d error", "Auto-repaired %1$d errors", errors), errors) + ":\n";
|
wxString tooltip = format_wxstr(_L_PLURAL("Auto-repaired %1$d error", "Auto-repaired %1$d errors", errors), errors) + ":\n";
|
||||||
@ -407,21 +412,26 @@ wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx /
|
|||||||
if (stats.backwards_edges > 0)
|
if (stats.backwards_edges > 0)
|
||||||
tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d backwards edge", "%1$d backwards edges", stats.backwards_edges), stats.backwards_edges) + "\n";
|
tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d backwards edge", "%1$d backwards edges", stats.backwards_edges), stats.backwards_edges) + "\n";
|
||||||
|
|
||||||
if (is_windows10())
|
if (!stats.manifold()) {
|
||||||
tooltip += _L("Right button click the icon to fix STL through Netfabb");
|
tooltip += _L("Remaning errors") + ":\n";
|
||||||
|
tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d open edge", "%1$d open edges", stats.open_edges), stats.open_edges) + "\n";
|
||||||
|
}
|
||||||
|
|
||||||
return tooltip;
|
if (is_windows10() && !from_plater)
|
||||||
|
tooltip += "\n" + _L("Right button click the icon to fix STL through Netfabb");
|
||||||
|
|
||||||
|
return { tooltip, get_warning_icon_name(stats) };
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString ObjectList::get_mesh_errors_list()
|
std::pair<wxString, std::string> ObjectList::get_mesh_errors(bool from_plater /*= false*/)
|
||||||
{
|
{
|
||||||
if (!GetSelection())
|
if (!GetSelection())
|
||||||
return "";
|
return { "", "" };
|
||||||
|
|
||||||
int obj_idx, vol_idx;
|
int obj_idx, vol_idx;
|
||||||
get_selected_item_indexes(obj_idx, vol_idx);
|
get_selected_item_indexes(obj_idx, vol_idx);
|
||||||
|
|
||||||
return get_mesh_errors_list(obj_idx, vol_idx);
|
return get_mesh_errors(obj_idx, vol_idx, from_plater);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectList::set_tooltip_for_item(const wxPoint& pt)
|
void ObjectList::set_tooltip_for_item(const wxPoint& pt)
|
||||||
@ -459,7 +469,7 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt)
|
|||||||
{
|
{
|
||||||
int obj_idx, vol_idx;
|
int obj_idx, vol_idx;
|
||||||
get_selected_item_indexes(obj_idx, vol_idx, item);
|
get_selected_item_indexes(obj_idx, vol_idx, item);
|
||||||
tooltip = get_mesh_errors_list(obj_idx, vol_idx);
|
tooltip = get_mesh_errors(obj_idx, vol_idx).first;
|
||||||
}
|
}
|
||||||
|
|
||||||
GetMainWindow()->SetToolTip(tooltip);
|
GetMainWindow()->SetToolTip(tooltip);
|
||||||
@ -1775,8 +1785,12 @@ void ObjectList::del_subobject_item(wxDataViewItem& item)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// If last volume item with warning was deleted, unmark object item
|
// If last volume item with warning was deleted, unmark object item
|
||||||
if (type & itVolume && (*m_objects)[obj_idx]->get_mesh_errors_count() == 0)
|
if (type & itVolume) {
|
||||||
m_objects_model->DeleteWarningIcon(parent);
|
if (auto obj = object(obj_idx); obj->get_mesh_errors_count() == 0)
|
||||||
|
m_objects_model->DeleteWarningIcon(parent);
|
||||||
|
else
|
||||||
|
m_objects_model->AddWarningIcon(parent, get_warning_icon_name(obj->mesh().stats()));
|
||||||
|
}
|
||||||
|
|
||||||
m_objects_model->Delete(item);
|
m_objects_model->Delete(item);
|
||||||
update_info_items(obj_idx);
|
update_info_items(obj_idx);
|
||||||
@ -1985,7 +1999,7 @@ void ObjectList::split()
|
|||||||
for (const ModelVolume* volume : model_object->volumes) {
|
for (const ModelVolume* volume : model_object->volumes) {
|
||||||
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(parent, from_u8(volume->name),
|
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(parent, from_u8(volume->name),
|
||||||
volume->type(),// is_modifier() ? ModelVolumeType::PARAMETER_MODIFIER : ModelVolumeType::MODEL_PART,
|
volume->type(),// is_modifier() ? ModelVolumeType::PARAMETER_MODIFIER : ModelVolumeType::MODEL_PART,
|
||||||
volume->get_mesh_errors_count()>0,
|
get_warning_icon_name(volume->mesh().stats()),
|
||||||
volume->config.has("extruder") ? volume->config.extruder() : 0,
|
volume->config.has("extruder") ? volume->config.extruder() : 0,
|
||||||
false);
|
false);
|
||||||
// add settings to the part, if it has those
|
// add settings to the part, if it has those
|
||||||
@ -2484,7 +2498,7 @@ void ObjectList::part_selection_changed()
|
|||||||
if (item) {
|
if (item) {
|
||||||
// wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(item));
|
// wxGetApp().obj_manipul()->get_og()->set_value("object_name", m_objects_model->GetName(item));
|
||||||
wxGetApp().obj_manipul()->update_item_name(m_objects_model->GetName(item));
|
wxGetApp().obj_manipul()->update_item_name(m_objects_model->GetName(item));
|
||||||
wxGetApp().obj_manipul()->update_warning_icon_state(get_mesh_errors_list(obj_idx, volume_id));
|
wxGetApp().obj_manipul()->update_warning_icon_state(get_mesh_errors(obj_idx, volume_id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2627,7 +2641,7 @@ void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed)
|
|||||||
const wxString& item_name = from_u8(model_object->name);
|
const wxString& item_name = from_u8(model_object->name);
|
||||||
const auto item = m_objects_model->Add(item_name,
|
const auto item = m_objects_model->Add(item_name,
|
||||||
model_object->config.has("extruder") ? model_object->config.extruder() : 0,
|
model_object->config.has("extruder") ? model_object->config.extruder() : 0,
|
||||||
get_mesh_errors_count(obj_idx) > 0);
|
get_warning_icon_name(model_object->mesh().stats()));
|
||||||
|
|
||||||
update_info_items(obj_idx, nullptr, call_selection_changed);
|
update_info_items(obj_idx, nullptr, call_selection_changed);
|
||||||
|
|
||||||
@ -2637,7 +2651,7 @@ void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed)
|
|||||||
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(item,
|
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(item,
|
||||||
from_u8(volume->name),
|
from_u8(volume->name),
|
||||||
volume->type(),
|
volume->type(),
|
||||||
volume->get_mesh_errors_count()>0,
|
get_warning_icon_name(volume->mesh().stats()),
|
||||||
volume->config.has("extruder") ? volume->config.extruder() : 0,
|
volume->config.has("extruder") ? volume->config.extruder() : 0,
|
||||||
false);
|
false);
|
||||||
add_settings_item(vol_item, &volume->config.get());
|
add_settings_item(vol_item, &volume->config.get());
|
||||||
@ -2746,6 +2760,8 @@ void ObjectList::delete_from_model_and_list(const std::vector<ItemForDelete>& it
|
|||||||
// If last volume item with warning was deleted, unmark object item
|
// If last volume item with warning was deleted, unmark object item
|
||||||
if (obj->get_mesh_errors_count() == 0)
|
if (obj->get_mesh_errors_count() == 0)
|
||||||
m_objects_model->DeleteWarningIcon(parent);
|
m_objects_model->DeleteWarningIcon(parent);
|
||||||
|
else
|
||||||
|
m_objects_model->AddWarningIcon(parent, get_warning_icon_name(obj->mesh().stats()));
|
||||||
}
|
}
|
||||||
wxGetApp().plater()->canvas3D()->ensure_on_bed(item->obj_idx, printer_technology() != ptSLA);
|
wxGetApp().plater()->canvas3D()->ensure_on_bed(item->obj_idx, printer_technology() != ptSLA);
|
||||||
}
|
}
|
||||||
@ -4162,8 +4178,10 @@ void ObjectList::update_item_error_icon(const int obj_idx, const int vol_idx) co
|
|||||||
// unmark fixed item only
|
// unmark fixed item only
|
||||||
m_objects_model->DeleteWarningIcon(item);
|
m_objects_model->DeleteWarningIcon(item);
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
m_objects_model->AddWarningIcon(item);
|
auto obj = object(obj_idx);
|
||||||
|
m_objects_model->AddWarningIcon(item, get_warning_icon_name(vol_idx < 0 ? obj->mesh().stats() : obj->volumes[vol_idx]->mesh().stats()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectList::msw_rescale()
|
void ObjectList::msw_rescale()
|
||||||
@ -4294,7 +4312,7 @@ wxDataViewItemArray ObjectList::reorder_volumes_and_get_selection(int obj_idx, s
|
|||||||
for (const ModelVolume* volume : object->volumes) {
|
for (const ModelVolume* volume : object->volumes) {
|
||||||
wxDataViewItem vol_item = m_objects_model->AddVolumeChild(object_item, from_u8(volume->name),
|
wxDataViewItem vol_item = m_objects_model->AddVolumeChild(object_item, from_u8(volume->name),
|
||||||
volume->type(),
|
volume->type(),
|
||||||
volume->get_mesh_errors_count() > 0,
|
get_warning_icon_name(volume->mesh().stats()),
|
||||||
volume->config.has("extruder") ? volume->config.extruder() : 0,
|
volume->config.has("extruder") ? volume->config.extruder() : 0,
|
||||||
false);
|
false);
|
||||||
// add settings to the part, if it has those
|
// add settings to the part, if it has those
|
||||||
|
@ -210,12 +210,12 @@ public:
|
|||||||
void get_selection_indexes(std::vector<int>& obj_idxs, std::vector<int>& vol_idxs);
|
void get_selection_indexes(std::vector<int>& obj_idxs, std::vector<int>& vol_idxs);
|
||||||
// Get count of errors in the mesh
|
// Get count of errors in the mesh
|
||||||
int get_mesh_errors_count(const int obj_idx, const int vol_idx = -1) const;
|
int get_mesh_errors_count(const int obj_idx, const int vol_idx = -1) const;
|
||||||
/* Get list of errors in the mesh. Return value is a string, used for the tooltip
|
// Get list of errors in the mesh and name of the warning icon
|
||||||
* Function without parameters is for a call from Manipulation panel,
|
// Return value is a pair <Tooltip, warning_icon_name>, used for the tooltip and related warning icon
|
||||||
* when we don't know parameters of selected item
|
// Function without parameters is for a call from Manipulation panel,
|
||||||
*/
|
// when we don't know parameters of selected item
|
||||||
wxString get_mesh_errors_list(const int obj_idx, const int vol_idx = -1) const;
|
std::pair<wxString, std::string> get_mesh_errors(const int obj_idx, const int vol_idx = -1, bool from_plater = false) const;
|
||||||
wxString get_mesh_errors_list();
|
std::pair<wxString, std::string> get_mesh_errors(bool from_plater = false);
|
||||||
void set_tooltip_for_item(const wxPoint& pt);
|
void set_tooltip_for_item(const wxPoint& pt);
|
||||||
|
|
||||||
void selection_changed();
|
void selection_changed();
|
||||||
|
@ -132,7 +132,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
wxGetApp().obj_list()->fix_through_netfabb();
|
wxGetApp().obj_list()->fix_through_netfabb();
|
||||||
update_warning_icon_state(wxGetApp().obj_list()->get_mesh_errors_list());
|
update_warning_icon_state(wxGetApp().obj_list()->get_mesh_errors());
|
||||||
});
|
});
|
||||||
|
|
||||||
sizer->Add(m_fix_throught_netfab_bitmap);
|
sizer->Add(m_fix_throught_netfab_bitmap);
|
||||||
@ -776,8 +776,12 @@ void ObjectManipulation::update_item_name(const wxString& item_name)
|
|||||||
m_item_name->SetLabel(item_name);
|
m_item_name->SetLabel(item_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectManipulation::update_warning_icon_state(const wxString& tooltip)
|
void ObjectManipulation::update_warning_icon_state(const std::pair<wxString, std::string>& warning)
|
||||||
{
|
{
|
||||||
|
if (const std::string& warning_icon_name = warning.second;
|
||||||
|
!warning_icon_name.empty())
|
||||||
|
m_manifold_warning_bmp = ScalableBitmap(m_parent, warning_icon_name);
|
||||||
|
const wxString& tooltip = warning.first;
|
||||||
m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp());
|
m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp());
|
||||||
m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0,0) : m_manifold_warning_bmp.bmp().GetSize());
|
m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0,0) : m_manifold_warning_bmp.bmp().GetSize());
|
||||||
m_fix_throught_netfab_bitmap->SetToolTip(tooltip);
|
m_fix_throught_netfab_bitmap->SetToolTip(tooltip);
|
||||||
|
@ -194,7 +194,7 @@ public:
|
|||||||
#endif // __APPLE__
|
#endif // __APPLE__
|
||||||
|
|
||||||
void update_item_name(const wxString &item_name);
|
void update_item_name(const wxString &item_name);
|
||||||
void update_warning_icon_state(const wxString& tooltip);
|
void update_warning_icon_state(const std::pair<wxString, std::string>& warning);
|
||||||
void msw_rescale();
|
void msw_rescale();
|
||||||
void sys_color_changed();
|
void sys_color_changed();
|
||||||
void on_change(const std::string& opt_key, int axis, double new_value);
|
void on_change(const std::string& opt_key, int axis, double new_value);
|
||||||
|
@ -37,6 +37,7 @@ void ObjectDataViewModelNode::init_container()
|
|||||||
static constexpr char LayerRootIcon[] = "edit_layers_all";
|
static constexpr char LayerRootIcon[] = "edit_layers_all";
|
||||||
static constexpr char LayerIcon[] = "edit_layers_some";
|
static constexpr char LayerIcon[] = "edit_layers_some";
|
||||||
static constexpr char WarningIcon[] = "exclamation";
|
static constexpr char WarningIcon[] = "exclamation";
|
||||||
|
static constexpr char WarningManifoldIcon[] = "exclamation_manifold";
|
||||||
|
|
||||||
struct InfoItemAtributes {
|
struct InfoItemAtributes {
|
||||||
std::string name;
|
std::string name;
|
||||||
@ -57,13 +58,15 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* pare
|
|||||||
Slic3r::ModelVolumeType type,
|
Slic3r::ModelVolumeType type,
|
||||||
const wxBitmap& bmp,
|
const wxBitmap& bmp,
|
||||||
const wxString& extruder,
|
const wxString& extruder,
|
||||||
const int idx/* = -1*/) :
|
const int idx/* = -1*/,
|
||||||
|
const std::string& warning_icon_name /*= std::string*/) :
|
||||||
m_parent(parent),
|
m_parent(parent),
|
||||||
m_name(sub_obj_name),
|
m_name(sub_obj_name),
|
||||||
m_type(itVolume),
|
m_type(itVolume),
|
||||||
m_volume_type(type),
|
m_volume_type(type),
|
||||||
m_idx(idx),
|
m_idx(idx),
|
||||||
m_extruder(type == Slic3r::ModelVolumeType::MODEL_PART || type == Slic3r::ModelVolumeType::PARAMETER_MODIFIER ? extruder : "")
|
m_extruder(type == Slic3r::ModelVolumeType::MODEL_PART || type == Slic3r::ModelVolumeType::PARAMETER_MODIFIER ? extruder : ""),
|
||||||
|
m_warning_icon_name(warning_icon_name)
|
||||||
{
|
{
|
||||||
m_bmp = bmp;
|
m_bmp = bmp;
|
||||||
set_action_and_extruder_icons();
|
set_action_and_extruder_icons();
|
||||||
@ -170,6 +173,13 @@ void ObjectDataViewModelNode::set_printable_icon(PrintIndicator printable)
|
|||||||
create_scaled_bitmap(m_printable == piPrintable ? "eye_open.png" : "eye_closed.png");
|
create_scaled_bitmap(m_printable == piPrintable ? "eye_open.png" : "eye_closed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjectDataViewModelNode::set_warning_icon(const std::string& warning_icon_name)
|
||||||
|
{
|
||||||
|
m_warning_icon_name = warning_icon_name;
|
||||||
|
if (warning_icon_name.empty())
|
||||||
|
m_bmp = m_empty_bmp;
|
||||||
|
}
|
||||||
|
|
||||||
void ObjectDataViewModelNode::update_settings_digest_bitmaps()
|
void ObjectDataViewModelNode::update_settings_digest_bitmaps()
|
||||||
{
|
{
|
||||||
m_bmp = m_empty_bmp;
|
m_bmp = m_empty_bmp;
|
||||||
@ -316,6 +326,8 @@ ObjectDataViewModel::ObjectDataViewModel()
|
|||||||
|
|
||||||
m_volume_bmps = MenuFactory::get_volume_bitmaps();
|
m_volume_bmps = MenuFactory::get_volume_bitmaps();
|
||||||
m_warning_bmp = create_scaled_bitmap(WarningIcon);
|
m_warning_bmp = create_scaled_bitmap(WarningIcon);
|
||||||
|
m_warning_manifold_bmp = create_scaled_bitmap(WarningManifoldIcon);
|
||||||
|
|
||||||
for (auto item : INFO_ITEMS)
|
for (auto item : INFO_ITEMS)
|
||||||
m_info_bmps[item.first] = create_scaled_bitmap(item.second.bmp_name);
|
m_info_bmps[item.first] = create_scaled_bitmap(item.second.bmp_name);
|
||||||
}
|
}
|
||||||
@ -328,15 +340,19 @@ ObjectDataViewModel::~ObjectDataViewModel()
|
|||||||
m_bitmap_cache = nullptr;
|
m_bitmap_cache = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxBitmap& ObjectDataViewModel::GetWarningBitmap(const std::string& warning_icon_name)
|
||||||
|
{
|
||||||
|
return warning_icon_name.empty() ? m_empty_bmp : warning_icon_name == WarningIcon ? m_warning_bmp : m_warning_manifold_bmp;
|
||||||
|
}
|
||||||
|
|
||||||
wxDataViewItem ObjectDataViewModel::Add(const wxString &name,
|
wxDataViewItem ObjectDataViewModel::Add(const wxString &name,
|
||||||
const int extruder,
|
const int extruder,
|
||||||
const bool has_errors/* = false*/)
|
const std::string& warning_icon_name/* = std::string()*/ )
|
||||||
{
|
{
|
||||||
const wxString extruder_str = extruder == 0 ? _(L("default")) : wxString::Format("%d", extruder);
|
const wxString extruder_str = extruder == 0 ? _L("default") : wxString::Format("%d", extruder);
|
||||||
auto root = new ObjectDataViewModelNode(name, extruder_str);
|
auto root = new ObjectDataViewModelNode(name, extruder_str);
|
||||||
// Add error icon if detected auto-repaire
|
// Add warning icon if detected auto-repaire
|
||||||
if (has_errors)
|
root->SetWarningBitmap(GetWarningBitmap(warning_icon_name), warning_icon_name);
|
||||||
root->m_bmp = m_warning_bmp;
|
|
||||||
|
|
||||||
m_objects.push_back(root);
|
m_objects.push_back(root);
|
||||||
// notify control
|
// notify control
|
||||||
@ -350,7 +366,7 @@ wxDataViewItem ObjectDataViewModel::Add(const wxString &name,
|
|||||||
wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent_item,
|
wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent_item,
|
||||||
const wxString &name,
|
const wxString &name,
|
||||||
const Slic3r::ModelVolumeType volume_type,
|
const Slic3r::ModelVolumeType volume_type,
|
||||||
const bool has_errors/* = false*/,
|
const std::string& warning_icon_name/* = std::string()*/,
|
||||||
const int extruder/* = 0*/,
|
const int extruder/* = 0*/,
|
||||||
const bool create_frst_child/* = true*/)
|
const bool create_frst_child/* = true*/)
|
||||||
{
|
{
|
||||||
@ -364,12 +380,10 @@ wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent
|
|||||||
if (insert_position < 0)
|
if (insert_position < 0)
|
||||||
insert_position = get_root_idx(root, itInstanceRoot);
|
insert_position = get_root_idx(root, itInstanceRoot);
|
||||||
|
|
||||||
const bool obj_errors = root->m_bmp.IsOk();
|
|
||||||
|
|
||||||
if (create_frst_child && root->m_volumes_cnt == 0)
|
if (create_frst_child && root->m_volumes_cnt == 0)
|
||||||
{
|
{
|
||||||
const Slic3r::ModelVolumeType type = Slic3r::ModelVolumeType::MODEL_PART;
|
const Slic3r::ModelVolumeType type = Slic3r::ModelVolumeType::MODEL_PART;
|
||||||
const auto node = new ObjectDataViewModelNode(root, root->m_name, type, GetVolumeIcon(type, obj_errors), extruder_str, 0);
|
const auto node = new ObjectDataViewModelNode(root, root->m_name, type, GetVolumeIcon(type, root->m_warning_icon_name), extruder_str, 0, root->m_warning_icon_name);
|
||||||
|
|
||||||
insert_position < 0 ? root->Append(node) : root->Insert(node, insert_position);
|
insert_position < 0 ? root->Append(node) : root->Insert(node, insert_position);
|
||||||
// notify control
|
// notify control
|
||||||
@ -380,12 +394,13 @@ wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent
|
|||||||
if (insert_position >= 0) insert_position++;
|
if (insert_position >= 0) insert_position++;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto node = new ObjectDataViewModelNode(root, name, volume_type, GetVolumeIcon(volume_type, has_errors), extruder_str, root->m_volumes_cnt);
|
const auto node = new ObjectDataViewModelNode(root, name, volume_type, GetVolumeIcon(volume_type, warning_icon_name), extruder_str, root->m_volumes_cnt, warning_icon_name);
|
||||||
insert_position < 0 ? root->Append(node) : root->Insert(node, insert_position);
|
insert_position < 0 ? root->Append(node) : root->Insert(node, insert_position);
|
||||||
|
|
||||||
// if part with errors is added, but object wasn't marked, then mark it
|
// if part with errors is added, but object wasn't marked, then mark it
|
||||||
if (!obj_errors && has_errors)
|
if (!warning_icon_name.empty() && warning_icon_name != root->m_warning_icon_name &&
|
||||||
root->SetBitmap(m_warning_bmp);
|
(root->m_warning_icon_name.empty() || root->m_warning_icon_name == WarningManifoldIcon) )
|
||||||
|
root->SetWarningBitmap(GetWarningBitmap(warning_icon_name), warning_icon_name);
|
||||||
|
|
||||||
// notify control
|
// notify control
|
||||||
const wxDataViewItem child((void*)node);
|
const wxDataViewItem child((void*)node);
|
||||||
@ -1665,6 +1680,7 @@ void ObjectDataViewModel::Rescale()
|
|||||||
{
|
{
|
||||||
m_volume_bmps = MenuFactory::get_volume_bitmaps();
|
m_volume_bmps = MenuFactory::get_volume_bitmaps();
|
||||||
m_warning_bmp = create_scaled_bitmap(WarningIcon);
|
m_warning_bmp = create_scaled_bitmap(WarningIcon);
|
||||||
|
m_warning_manifold_bmp = create_scaled_bitmap(WarningManifoldIcon);
|
||||||
|
|
||||||
wxDataViewItemArray all_items;
|
wxDataViewItemArray all_items;
|
||||||
GetAllChildren(wxDataViewItem(0), all_items);
|
GetAllChildren(wxDataViewItem(0), all_items);
|
||||||
@ -1680,10 +1696,10 @@ void ObjectDataViewModel::Rescale()
|
|||||||
switch (node->m_type)
|
switch (node->m_type)
|
||||||
{
|
{
|
||||||
case itObject:
|
case itObject:
|
||||||
if (node->m_bmp.IsOk()) node->m_bmp = m_warning_bmp;
|
if (node->m_bmp.IsOk()) node->m_bmp = GetWarningBitmap(node->m_warning_icon_name);
|
||||||
break;
|
break;
|
||||||
case itVolume:
|
case itVolume:
|
||||||
node->m_bmp = GetVolumeIcon(node->m_volume_type, node->m_bmp.GetWidth() != node->m_bmp.GetHeight());
|
node->m_bmp = GetVolumeIcon(node->m_volume_type, node->m_warning_icon_name);
|
||||||
break;
|
break;
|
||||||
case itLayerRoot:
|
case itLayerRoot:
|
||||||
node->m_bmp = create_scaled_bitmap(LayerRootIcon);
|
node->m_bmp = create_scaled_bitmap(LayerRootIcon);
|
||||||
@ -1697,19 +1713,19 @@ void ObjectDataViewModel::Rescale()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wxBitmap ObjectDataViewModel::GetVolumeIcon(const Slic3r::ModelVolumeType vol_type, const bool is_marked/* = false*/)
|
wxBitmap ObjectDataViewModel::GetVolumeIcon(const Slic3r::ModelVolumeType vol_type, const std::string& warning_icon_name/* = std::string()*/)
|
||||||
{
|
{
|
||||||
if (!is_marked)
|
if (warning_icon_name.empty())
|
||||||
return m_volume_bmps[static_cast<int>(vol_type)];
|
return m_volume_bmps[static_cast<int>(vol_type)];
|
||||||
|
|
||||||
std::string scaled_bitmap_name = "warning" + std::to_string(static_cast<int>(vol_type));
|
std::string scaled_bitmap_name = warning_icon_name + std::to_string(static_cast<int>(vol_type));
|
||||||
scaled_bitmap_name += "-em" + std::to_string(Slic3r::GUI::wxGetApp().em_unit());
|
scaled_bitmap_name += "-em" + std::to_string(wxGetApp().em_unit()) + (wxGetApp().dark_mode() ? "-dm" : "-lm");
|
||||||
|
|
||||||
wxBitmap *bmp = m_bitmap_cache->find(scaled_bitmap_name);
|
wxBitmap *bmp = m_bitmap_cache->find(scaled_bitmap_name);
|
||||||
if (bmp == nullptr) {
|
if (bmp == nullptr) {
|
||||||
std::vector<wxBitmap> bmps;
|
std::vector<wxBitmap> bmps;
|
||||||
|
|
||||||
bmps.emplace_back(m_warning_bmp);
|
bmps.emplace_back(GetWarningBitmap(warning_icon_name));
|
||||||
bmps.emplace_back(m_volume_bmps[static_cast<int>(vol_type)]);
|
bmps.emplace_back(m_volume_bmps[static_cast<int>(vol_type)]);
|
||||||
|
|
||||||
bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps);
|
bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps);
|
||||||
@ -1718,20 +1734,20 @@ wxBitmap ObjectDataViewModel::GetVolumeIcon(const Slic3r::ModelVolumeType vol_ty
|
|||||||
return *bmp;
|
return *bmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectDataViewModel::AddWarningIcon(const wxDataViewItem& item)
|
void ObjectDataViewModel::AddWarningIcon(const wxDataViewItem& item, const std::string& warning_icon_name)
|
||||||
{
|
{
|
||||||
if (!item.IsOk())
|
if (!item.IsOk())
|
||||||
return;
|
return;
|
||||||
ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
|
ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
|
||||||
|
|
||||||
if (node->GetType() & itObject) {
|
if (node->GetType() & itObject) {
|
||||||
node->SetBitmap(m_warning_bmp);
|
node->SetWarningBitmap(GetWarningBitmap(warning_icon_name), warning_icon_name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node->GetType() & itVolume) {
|
if (node->GetType() & itVolume) {
|
||||||
node->SetBitmap(GetVolumeIcon(node->GetVolumeType(), true));
|
node->SetWarningBitmap(GetVolumeIcon(node->GetVolumeType(), warning_icon_name), warning_icon_name);
|
||||||
node->GetParent()->SetBitmap(m_warning_bmp);
|
node->GetParent()->SetWarningBitmap(GetWarningBitmap(warning_icon_name), warning_icon_name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1747,11 +1763,11 @@ void ObjectDataViewModel::DeleteWarningIcon(const wxDataViewItem& item, const bo
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (node->GetType() & itVolume) {
|
if (node->GetType() & itVolume) {
|
||||||
node->SetBitmap(m_volume_bmps[static_cast<int>(node->volume_type())]);
|
node->SetWarningBitmap(m_volume_bmps[static_cast<int>(node->volume_type())], "");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
node->SetBitmap(wxNullBitmap);
|
node->SetWarningBitmap(wxNullBitmap, "");
|
||||||
if (unmark_object)
|
if (unmark_object)
|
||||||
{
|
{
|
||||||
wxDataViewItemArray children;
|
wxDataViewItemArray children;
|
||||||
|
@ -78,6 +78,7 @@ class ObjectDataViewModelNode
|
|||||||
wxBitmap m_action_icon;
|
wxBitmap m_action_icon;
|
||||||
PrintIndicator m_printable {piUndef};
|
PrintIndicator m_printable {piUndef};
|
||||||
wxBitmap m_printable_icon;
|
wxBitmap m_printable_icon;
|
||||||
|
std::string m_warning_icon_name{ "" };
|
||||||
|
|
||||||
std::string m_action_icon_name = "";
|
std::string m_action_icon_name = "";
|
||||||
ModelVolumeType m_volume_type;
|
ModelVolumeType m_volume_type;
|
||||||
@ -100,7 +101,8 @@ public:
|
|||||||
Slic3r::ModelVolumeType type,
|
Slic3r::ModelVolumeType type,
|
||||||
const wxBitmap& bmp,
|
const wxBitmap& bmp,
|
||||||
const wxString& extruder,
|
const wxString& extruder,
|
||||||
const int idx = -1);
|
const int idx = -1,
|
||||||
|
const std::string& warning_icon_name = std::string());
|
||||||
|
|
||||||
ObjectDataViewModelNode(ObjectDataViewModelNode* parent,
|
ObjectDataViewModelNode(ObjectDataViewModelNode* parent,
|
||||||
const t_layer_height_range& layer_range,
|
const t_layer_height_range& layer_range,
|
||||||
@ -179,6 +181,7 @@ public:
|
|||||||
void SetVolumeType(ModelVolumeType type) { m_volume_type = type; }
|
void SetVolumeType(ModelVolumeType type) { m_volume_type = type; }
|
||||||
void SetBitmap(const wxBitmap &icon) { m_bmp = icon; }
|
void SetBitmap(const wxBitmap &icon) { m_bmp = icon; }
|
||||||
void SetExtruder(const wxString &extruder) { m_extruder = extruder; }
|
void SetExtruder(const wxString &extruder) { m_extruder = extruder; }
|
||||||
|
void SetWarningBitmap(const wxBitmap& icon, const std::string& warning_icon_name) { m_bmp = icon; m_warning_icon_name = warning_icon_name; }
|
||||||
const wxBitmap& GetBitmap() const { return m_bmp; }
|
const wxBitmap& GetBitmap() const { return m_bmp; }
|
||||||
const wxString& GetName() const { return m_name; }
|
const wxString& GetName() const { return m_name; }
|
||||||
ItemType GetType() const { return m_type; }
|
ItemType GetType() const { return m_type; }
|
||||||
@ -225,6 +228,8 @@ public:
|
|||||||
void set_extruder_icon();
|
void set_extruder_icon();
|
||||||
// Set printable icon for node
|
// Set printable icon for node
|
||||||
void set_printable_icon(PrintIndicator printable);
|
void set_printable_icon(PrintIndicator printable);
|
||||||
|
// Set warning icon for node
|
||||||
|
void set_warning_icon(const std::string& warning_icon);
|
||||||
|
|
||||||
void update_settings_digest_bitmaps();
|
void update_settings_digest_bitmaps();
|
||||||
bool update_settings_digest(const std::vector<std::string>& categories);
|
bool update_settings_digest(const std::vector<std::string>& categories);
|
||||||
@ -253,7 +258,9 @@ class ObjectDataViewModel :public wxDataViewModel
|
|||||||
std::vector<ObjectDataViewModelNode*> m_objects;
|
std::vector<ObjectDataViewModelNode*> m_objects;
|
||||||
std::vector<wxBitmap> m_volume_bmps;
|
std::vector<wxBitmap> m_volume_bmps;
|
||||||
std::map<InfoItemType, wxBitmap> m_info_bmps;
|
std::map<InfoItemType, wxBitmap> m_info_bmps;
|
||||||
|
wxBitmap m_empty_bmp;
|
||||||
wxBitmap m_warning_bmp;
|
wxBitmap m_warning_bmp;
|
||||||
|
wxBitmap m_warning_manifold_bmp;
|
||||||
|
|
||||||
wxDataViewCtrl* m_ctrl { nullptr };
|
wxDataViewCtrl* m_ctrl { nullptr };
|
||||||
|
|
||||||
@ -263,11 +270,11 @@ public:
|
|||||||
|
|
||||||
wxDataViewItem Add( const wxString &name,
|
wxDataViewItem Add( const wxString &name,
|
||||||
const int extruder,
|
const int extruder,
|
||||||
const bool has_errors = false);
|
const std::string& warning_icon_name = std::string());
|
||||||
wxDataViewItem AddVolumeChild( const wxDataViewItem &parent_item,
|
wxDataViewItem AddVolumeChild( const wxDataViewItem &parent_item,
|
||||||
const wxString &name,
|
const wxString &name,
|
||||||
const Slic3r::ModelVolumeType volume_type,
|
const Slic3r::ModelVolumeType volume_type,
|
||||||
const bool has_errors = false,
|
const std::string& warning_icon_name = std::string(),
|
||||||
const int extruder = 0,
|
const int extruder = 0,
|
||||||
const bool create_frst_child = true);
|
const bool create_frst_child = true);
|
||||||
wxDataViewItem AddSettingsChild(const wxDataViewItem &parent_item);
|
wxDataViewItem AddSettingsChild(const wxDataViewItem &parent_item);
|
||||||
@ -378,8 +385,8 @@ public:
|
|||||||
void Rescale();
|
void Rescale();
|
||||||
|
|
||||||
wxBitmap GetVolumeIcon(const Slic3r::ModelVolumeType vol_type,
|
wxBitmap GetVolumeIcon(const Slic3r::ModelVolumeType vol_type,
|
||||||
const bool is_marked = false);
|
const std::string& warning_icon_name = std::string());
|
||||||
void AddWarningIcon(const wxDataViewItem& item);
|
void AddWarningIcon(const wxDataViewItem& item, const std::string& warning_name);
|
||||||
void DeleteWarningIcon(const wxDataViewItem& item, const bool unmark_object = false);
|
void DeleteWarningIcon(const wxDataViewItem& item, const bool unmark_object = false);
|
||||||
t_layer_height_range GetLayerRangeByItem(const wxDataViewItem& item) const;
|
t_layer_height_range GetLayerRangeByItem(const wxDataViewItem& item) const;
|
||||||
|
|
||||||
@ -392,6 +399,8 @@ private:
|
|||||||
wxDataViewItem AddRoot(const wxDataViewItem& parent_item, const ItemType root_type);
|
wxDataViewItem AddRoot(const wxDataViewItem& parent_item, const ItemType root_type);
|
||||||
wxDataViewItem AddInstanceRoot(const wxDataViewItem& parent_item);
|
wxDataViewItem AddInstanceRoot(const wxDataViewItem& parent_item);
|
||||||
void AddAllChildren(const wxDataViewItem& parent);
|
void AddAllChildren(const wxDataViewItem& parent);
|
||||||
|
|
||||||
|
wxBitmap& GetWarningBitmap(const std::string& warning_icon_name);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -125,6 +125,7 @@ wxDEFINE_EVENT(EVT_EXPORT_BEGAN, wxCommandEvent);
|
|||||||
|
|
||||||
class ObjectInfo : public wxStaticBoxSizer
|
class ObjectInfo : public wxStaticBoxSizer
|
||||||
{
|
{
|
||||||
|
std::string m_warning_icon_name{ "exclamation" };
|
||||||
public:
|
public:
|
||||||
ObjectInfo(wxWindow *parent);
|
ObjectInfo(wxWindow *parent);
|
||||||
|
|
||||||
@ -142,6 +143,7 @@ public:
|
|||||||
bool showing_manifold_warning_icon;
|
bool showing_manifold_warning_icon;
|
||||||
void show_sizer(bool show);
|
void show_sizer(bool show);
|
||||||
void msw_rescale();
|
void msw_rescale();
|
||||||
|
void update_warning_icon(const std::string& warning_icon_name);
|
||||||
};
|
};
|
||||||
|
|
||||||
ObjectInfo::ObjectInfo(wxWindow *parent) :
|
ObjectInfo::ObjectInfo(wxWindow *parent) :
|
||||||
@ -175,7 +177,7 @@ ObjectInfo::ObjectInfo(wxWindow *parent) :
|
|||||||
info_manifold_text->SetFont(wxGetApp().small_font());
|
info_manifold_text->SetFont(wxGetApp().small_font());
|
||||||
info_manifold = new wxStaticText(parent, wxID_ANY, "");
|
info_manifold = new wxStaticText(parent, wxID_ANY, "");
|
||||||
info_manifold->SetFont(wxGetApp().small_font());
|
info_manifold->SetFont(wxGetApp().small_font());
|
||||||
manifold_warning_icon = new wxStaticBitmap(parent, wxID_ANY, create_scaled_bitmap("exclamation"));
|
manifold_warning_icon = new wxStaticBitmap(parent, wxID_ANY, create_scaled_bitmap(m_warning_icon_name));
|
||||||
auto *sizer_manifold = new wxBoxSizer(wxHORIZONTAL);
|
auto *sizer_manifold = new wxBoxSizer(wxHORIZONTAL);
|
||||||
sizer_manifold->Add(info_manifold_text, 0);
|
sizer_manifold->Add(info_manifold_text, 0);
|
||||||
sizer_manifold->Add(manifold_warning_icon, 0, wxLEFT, 2);
|
sizer_manifold->Add(manifold_warning_icon, 0, wxLEFT, 2);
|
||||||
@ -194,7 +196,15 @@ void ObjectInfo::show_sizer(bool show)
|
|||||||
|
|
||||||
void ObjectInfo::msw_rescale()
|
void ObjectInfo::msw_rescale()
|
||||||
{
|
{
|
||||||
manifold_warning_icon->SetBitmap(create_scaled_bitmap("exclamation"));
|
manifold_warning_icon->SetBitmap(create_scaled_bitmap(m_warning_icon_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ObjectInfo::update_warning_icon(const std::string& warning_icon_name)
|
||||||
|
{
|
||||||
|
if (warning_icon_name.empty())
|
||||||
|
return;
|
||||||
|
m_warning_icon_name = warning_icon_name;
|
||||||
|
manifold_warning_icon->SetBitmap(create_scaled_bitmap(m_warning_icon_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
enum SlicedInfoIdx
|
enum SlicedInfoIdx
|
||||||
@ -1129,30 +1139,19 @@ void Sidebar::show_info_sizer()
|
|||||||
p->object_info->info_size->SetLabel(wxString::Format("%.2f x %.2f x %.2f",size(0)*koef, size(1)*koef, size(2)*koef));
|
p->object_info->info_size->SetLabel(wxString::Format("%.2f x %.2f x %.2f",size(0)*koef, size(1)*koef, size(2)*koef));
|
||||||
p->object_info->info_materials->SetLabel(wxString::Format("%d", static_cast<int>(model_object->materials_count())));
|
p->object_info->info_materials->SetLabel(wxString::Format("%d", static_cast<int>(model_object->materials_count())));
|
||||||
|
|
||||||
const auto& stats = model_object->get_object_stl_stats();//model_object->volumes.front()->mesh.stl.stats;
|
const auto& stats = model_object->get_object_stl_stats();
|
||||||
p->object_info->info_volume->SetLabel(wxString::Format("%.2f", stats.volume*pow(koef,3)));
|
p->object_info->info_volume->SetLabel(wxString::Format("%.2f", stats.volume*pow(koef,3)));
|
||||||
p->object_info->info_facets->SetLabel(format_wxstr(_L_PLURAL("%1% (%2$d shell)", "%1% (%2$d shells)", stats.number_of_parts),
|
p->object_info->info_facets->SetLabel(format_wxstr(_L_PLURAL("%1% (%2$d shell)", "%1% (%2$d shells)", stats.number_of_parts),
|
||||||
static_cast<int>(model_object->facets_count()), stats.number_of_parts));
|
static_cast<int>(model_object->facets_count()), stats.number_of_parts));
|
||||||
|
|
||||||
int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed +
|
if (stats.repaired()) {
|
||||||
stats.facets_reversed + stats.backwards_edges;
|
int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + stats.facets_reversed + stats.backwards_edges;
|
||||||
if (errors > 0) {
|
p->object_info->info_manifold->SetLabel(format_wxstr(_L_PLURAL("Auto-repaired %1$d error", "Auto-repaired %1$d errors", errors), errors));
|
||||||
wxString tooltip = format_wxstr(_L_PLURAL("Auto-repaired %1$d error", "Auto-repaired %1$d errors", errors), errors);
|
|
||||||
p->object_info->info_manifold->SetLabel(tooltip);
|
|
||||||
|
|
||||||
tooltip += ":\n";
|
auto mesh_errors = obj_list()->get_mesh_errors(true);
|
||||||
if (stats.degenerate_facets > 0)
|
wxString tooltip = mesh_errors.first;
|
||||||
tooltip += format_wxstr(_L_PLURAL("%1$d degenerate facet", "%1$d degenerate facets", stats.degenerate_facets), stats.degenerate_facets) + ", ";
|
|
||||||
if (stats.edges_fixed > 0)
|
|
||||||
tooltip += format_wxstr(_L_PLURAL("%1$d edge fixed", "%1$d edges fixed", stats.edges_fixed), stats.edges_fixed) + ", ";
|
|
||||||
if (stats.facets_removed > 0)
|
|
||||||
tooltip += format_wxstr(_L_PLURAL("%1$d facet removed", "%1$d facets removed", stats.facets_removed), stats.facets_removed) + ", ";
|
|
||||||
if (stats.facets_reversed > 0)
|
|
||||||
tooltip += format_wxstr(_L_PLURAL("%1$d facet reversed", "%1$d facets reversed", stats.facets_reversed), stats.facets_reversed) + ", ";
|
|
||||||
if (stats.backwards_edges > 0)
|
|
||||||
tooltip += format_wxstr(_L_PLURAL("%1$d backwards edge", "%1$d backwards edges", stats.backwards_edges), stats.backwards_edges) + ", ";
|
|
||||||
tooltip.RemoveLast(2);//remove last coma
|
|
||||||
|
|
||||||
|
p->object_info->update_warning_icon(mesh_errors.second);
|
||||||
p->object_info->showing_manifold_warning_icon = true;
|
p->object_info->showing_manifold_warning_icon = true;
|
||||||
p->object_info->info_manifold->SetToolTip(tooltip);
|
p->object_info->info_manifold->SetToolTip(tooltip);
|
||||||
p->object_info->manifold_warning_icon->SetToolTip(tooltip);
|
p->object_info->manifold_warning_icon->SetToolTip(tooltip);
|
||||||
|
Loading…
Reference in New Issue
Block a user