diff --git a/resources/icons/svg_modifier.svg b/resources/icons/svg_modifier.svg
new file mode 100644
index 0000000000..e67fc3fdd8
--- /dev/null
+++ b/resources/icons/svg_modifier.svg
@@ -0,0 +1,4 @@
+
diff --git a/resources/icons/svg_negative.svg b/resources/icons/svg_negative.svg
new file mode 100644
index 0000000000..5934d29c5c
--- /dev/null
+++ b/resources/icons/svg_negative.svg
@@ -0,0 +1,41 @@
+
+
diff --git a/resources/icons/svg_part.svg b/resources/icons/svg_part.svg
new file mode 100644
index 0000000000..3a00d766be
--- /dev/null
+++ b/resources/icons/svg_part.svg
@@ -0,0 +1,41 @@
+
+
diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp
index b8cb2b4912..5afd77883e 100644
--- a/src/libslic3r/Model.hpp
+++ b/src/libslic3r/Model.hpp
@@ -845,6 +845,7 @@ public:
bool is_support_blocker() const { return m_type == ModelVolumeType::SUPPORT_BLOCKER; }
bool is_support_modifier() const { return m_type == ModelVolumeType::SUPPORT_BLOCKER || m_type == ModelVolumeType::SUPPORT_ENFORCER; }
bool is_text() const { return text_configuration.has_value(); }
+ bool is_svg() const { return emboss_shape.has_value() && !text_configuration.has_value(); }
bool is_the_only_one_part() const; // behave like an object
t_model_material_id material_id() const { return m_material_id; }
void reset_extra_facets();
diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp
index 525a4a24d8..b438da6a2a 100644
--- a/src/slic3r/GUI/GUI_Factories.cpp
+++ b/src/slic3r/GUI/GUI_Factories.cpp
@@ -175,6 +175,12 @@ static const constexpr std::array, 3> TEXT
{L("Add negative text"), "add_text_negative" }, // ~ModelVolumeType::NEGATIVE_VOLUME
{L("Add text modifier"), "add_text_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER
}};
+// Note: id accords to type of the sub-object (adding volume), so sequence of the menu items is important
+static const constexpr std::array, 3> SVG_VOLUME_ICONS{{
+ {L("Add svg part"), "svg_part"}, // ~ModelVolumeType::MODEL_PART
+ {L("Add negative svg"), "svg_negative"}, // ~ModelVolumeType::NEGATIVE_VOLUME
+ {L("Add svg modifier"), "svg_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER
+}};
static Plater* plater()
{
@@ -446,7 +452,7 @@ std::vector MenuFactory::get_volume_bitmaps()
{
std::vector volume_bmps;
volume_bmps.reserve(ADD_VOLUME_MENU_ITEMS.size());
- for (auto item : ADD_VOLUME_MENU_ITEMS)
+ for (const auto& item : ADD_VOLUME_MENU_ITEMS)
volume_bmps.push_back(get_bmp_bundle(item.second));
return volume_bmps;
}
@@ -455,7 +461,16 @@ std::vector MenuFactory::get_text_volume_bitmaps()
{
std::vector volume_bmps;
volume_bmps.reserve(TEXT_VOLUME_ICONS.size());
- for (auto item : TEXT_VOLUME_ICONS)
+ for (const auto& item : TEXT_VOLUME_ICONS)
+ volume_bmps.push_back(get_bmp_bundle(item.second));
+ return volume_bmps;
+}
+
+std::vector MenuFactory::get_svg_volume_bitmaps()
+{
+ std::vector volume_bmps;
+ volume_bmps.reserve(SVG_VOLUME_ICONS.size());
+ for (const auto &item : SVG_VOLUME_ICONS)
volume_bmps.push_back(get_bmp_bundle(item.second));
return volume_bmps;
}
diff --git a/src/slic3r/GUI/GUI_Factories.hpp b/src/slic3r/GUI/GUI_Factories.hpp
index d09345a9d1..8dfbb22507 100644
--- a/src/slic3r/GUI/GUI_Factories.hpp
+++ b/src/slic3r/GUI/GUI_Factories.hpp
@@ -39,6 +39,7 @@ class MenuFactory
public:
static std::vector get_volume_bitmaps();
static std::vector get_text_volume_bitmaps();
+ static std::vector get_svg_volume_bitmaps();
MenuFactory();
~MenuFactory() = default;
diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp
index a960bd5463..9988d53b37 100644
--- a/src/slic3r/GUI/GUI_ObjectList.cpp
+++ b/src/slic3r/GUI/GUI_ObjectList.cpp
@@ -3054,6 +3054,7 @@ wxDataViewItemArray ObjectList::add_volumes_to_object_in_list(size_t obj_idx, st
volume_idx,
volume->type(),
volume->is_text(),
+ volume->is_svg(),
get_warning_icon_name(volume->mesh().stats()),
extruder2str(volume->config.has("extruder") ? volume->config.extruder() : 0));
add_settings_item(vol_item, &volume->config.get());
diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp
index f8981cf706..babbbc0d7c 100644
--- a/src/slic3r/GUI/ObjectDataViewModel.cpp
+++ b/src/slic3r/GUI/ObjectDataViewModel.cpp
@@ -80,6 +80,7 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* pare
const wxString& sub_obj_name,
Slic3r::ModelVolumeType type,
const bool is_text_volume,
+ const bool is_svg_volume,
const wxString& extruder,
const int idx/* = -1*/) :
m_parent(parent),
@@ -87,6 +88,7 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* pare
m_type(itVolume),
m_volume_type(type),
m_is_text_volume(is_text_volume),
+ m_is_svg_volume(is_svg_volume),
m_idx(idx),
m_extruder(type == Slic3r::ModelVolumeType::MODEL_PART || type == Slic3r::ModelVolumeType::PARAMETER_MODIFIER ? extruder : "")
{
@@ -338,6 +340,7 @@ ObjectDataViewModel::ObjectDataViewModel()
{
m_volume_bmps = MenuFactory::get_volume_bitmaps();
m_text_volume_bmps = MenuFactory::get_text_volume_bitmaps();
+ m_svg_volume_bmps = MenuFactory::get_svg_volume_bitmaps();
m_warning_bmp = *get_bmp_bundle(WarningIcon);
m_warning_manifold_bmp = *get_bmp_bundle(WarningManifoldIcon);
m_lock_bmp = *get_bmp_bundle(LockIcon);
@@ -360,7 +363,10 @@ void ObjectDataViewModel::UpdateBitmapForNode(ObjectDataViewModelNode* node)
bool is_volume_node = vol_type >= 0;
if (!node->has_warning_icon() && !node->has_lock()) {
- node->SetBitmap(is_volume_node ? (node->is_text_volume() ? *m_text_volume_bmps.at(vol_type) : *m_volume_bmps.at(vol_type)) : m_empty_bmp);
+ node->SetBitmap(is_volume_node ? (
+ node->is_text_volume() ? *m_text_volume_bmps.at(vol_type) :
+ node->is_svg_volume() ? *m_svg_volume_bmps.at(vol_type) :
+ *m_volume_bmps.at(vol_type)) : m_empty_bmp);
return;
}
@@ -381,7 +387,10 @@ void ObjectDataViewModel::UpdateBitmapForNode(ObjectDataViewModelNode* node)
if (node->has_lock())
bmps.emplace_back(&m_lock_bmp);
if (is_volume_node)
- bmps.emplace_back(node->is_text_volume() ? m_text_volume_bmps[vol_type] : m_volume_bmps[vol_type]);
+ bmps.emplace_back(
+ node->is_text_volume() ? m_text_volume_bmps[vol_type] :
+ node->is_svg_volume() ? m_svg_volume_bmps[vol_type] :
+ m_volume_bmps[vol_type]);
bmp = m_bitmap_cache->insert_bndl(scaled_bitmap_name, bmps);
}
@@ -418,6 +427,7 @@ wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent
const int volume_idx,
const Slic3r::ModelVolumeType volume_type,
const bool is_text_volume,
+ const bool is_svg_volume,
const std::string& warning_icon_name,
const wxString& extruder)
{
@@ -429,7 +439,7 @@ wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent
if (insert_position < 0)
insert_position = get_root_idx(root, itInstanceRoot);
- const auto node = new ObjectDataViewModelNode(root, name, volume_type, is_text_volume, extruder, volume_idx);
+ const auto node = new ObjectDataViewModelNode(root, name, volume_type, is_text_volume, is_svg_volume, extruder, volume_idx);
UpdateBitmapForNode(node, warning_icon_name, root->has_lock() && volume_type < ModelVolumeType::PARAMETER_MODIFIER);
insert_position < 0 ? root->Append(node) : root->Insert(node, insert_position);
@@ -1688,6 +1698,7 @@ void ObjectDataViewModel::UpdateBitmaps()
{
m_volume_bmps = MenuFactory::get_volume_bitmaps();
m_text_volume_bmps = MenuFactory::get_text_volume_bitmaps();
+ m_svg_volume_bmps = MenuFactory::get_svg_volume_bitmaps();
m_warning_bmp = *get_bmp_bundle(WarningIcon);
m_warning_manifold_bmp = *get_bmp_bundle(WarningManifoldIcon);
m_lock_bmp = *get_bmp_bundle(LockIcon);
diff --git a/src/slic3r/GUI/ObjectDataViewModel.hpp b/src/slic3r/GUI/ObjectDataViewModel.hpp
index 9d95ec4aaa..b366abe51e 100644
--- a/src/slic3r/GUI/ObjectDataViewModel.hpp
+++ b/src/slic3r/GUI/ObjectDataViewModel.hpp
@@ -89,6 +89,7 @@ class ObjectDataViewModelNode
std::string m_action_icon_name = "";
ModelVolumeType m_volume_type{ -1 };
bool m_is_text_volume{ false };
+ bool m_is_svg_volume{false};
InfoItemType m_info_item_type {InfoItemType::Undef};
public:
@@ -107,6 +108,7 @@ public:
const wxString& sub_obj_name,
Slic3r::ModelVolumeType type,
const bool is_text_volume,
+ const bool is_svg_volume,
const wxString& extruder,
const int idx = -1 );
@@ -242,6 +244,7 @@ public:
bool update_settings_digest(const std::vector& categories);
int volume_type() const { return int(m_volume_type); }
bool is_text_volume() const { return m_is_text_volume; }
+ bool is_svg_volume() const { return m_is_svg_volume; }
void sys_color_changed();
#ifndef NDEBUG
@@ -268,7 +271,8 @@ class ObjectDataViewModel :public wxDataViewModel
{
std::vector m_objects;
std::vector m_volume_bmps;
- std::vector m_text_volume_bmps;
+ std::vector m_text_volume_bmps;
+ std::vector m_svg_volume_bmps;
std::map m_info_bmps;
wxBitmapBundle m_empty_bmp;
wxBitmapBundle m_warning_bmp;
@@ -290,6 +294,7 @@ public:
const int volume_idx,
const Slic3r::ModelVolumeType volume_type,
const bool is_text_volume,
+ const bool is_svg_volume,
const std::string& warning_icon_name,
const wxString& extruder);
wxDataViewItem AddSettingsChild(const wxDataViewItem &parent_item);