mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-14 04:05:52 +08:00
ObjectList: Allow to add the TextVolume as a lonely child to the object
This commit is contained in:
parent
1c7e5dae92
commit
44b8e09e4e
@ -1014,10 +1014,6 @@ void MenuFactory::append_immutable_part_menu_items(wxMenu* menu)
|
|||||||
{
|
{
|
||||||
append_menu_items_mirror(menu);
|
append_menu_items_mirror(menu);
|
||||||
|
|
||||||
append_menu_item(menu, wxID_ANY, _L("Split"), _L("Split the selected object into individual parts"),
|
|
||||||
[](wxCommandEvent&) { plater()->split_volume(); }, "split_parts_SMALL", nullptr,
|
|
||||||
[]() { return plater()->can_split(false); }, m_parent);
|
|
||||||
|
|
||||||
menu->AppendSeparator();
|
menu->AppendSeparator();
|
||||||
append_menu_item_change_type(menu);
|
append_menu_item_change_type(menu);
|
||||||
}
|
}
|
||||||
@ -1041,19 +1037,19 @@ void MenuFactory::create_part_menu()
|
|||||||
append_menu_item_fix_through_netfabb(menu);
|
append_menu_item_fix_through_netfabb(menu);
|
||||||
append_menu_item_simplify(menu);
|
append_menu_item_simplify(menu);
|
||||||
|
|
||||||
|
append_menu_item(menu, wxID_ANY, _L("Split"), _L("Split the selected object into individual parts"),
|
||||||
|
[](wxCommandEvent&) { plater()->split_volume(); }, "split_parts_SMALL", nullptr,
|
||||||
|
[]() { return plater()->can_split(false); }, m_parent);
|
||||||
|
|
||||||
append_immutable_part_menu_items(menu);
|
append_immutable_part_menu_items(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MenuFactory::create_text_part_menu()
|
void MenuFactory::create_text_part_menu()
|
||||||
{
|
{
|
||||||
wxMenu* menu = &m_text_part_menu;
|
wxMenu* menu = &m_text_part_menu;
|
||||||
#ifdef __WXOSX__
|
|
||||||
append_menu_items_osx(menu);
|
|
||||||
#endif // __WXOSX__
|
|
||||||
append_menu_item_edit_text(menu);
|
|
||||||
menu->AppendSeparator();
|
|
||||||
append_menu_item_delete(menu);
|
append_menu_item_delete(menu);
|
||||||
// menu->AppendSeparator();
|
append_menu_item_edit_text(menu);
|
||||||
|
|
||||||
append_immutable_part_menu_items(menu);
|
append_immutable_part_menu_items(menu);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "libslic3r/libslic3r.h"
|
#include "libslic3r/libslic3r.h"
|
||||||
#include "libslic3r/PresetBundle.hpp"
|
#include "libslic3r/PresetBundle.hpp"
|
||||||
|
#include "libslic3r/TextConfiguration.hpp"
|
||||||
#include "GUI_ObjectList.hpp"
|
#include "GUI_ObjectList.hpp"
|
||||||
#include "GUI_Factories.hpp"
|
#include "GUI_Factories.hpp"
|
||||||
#include "GUI_ObjectManipulation.hpp"
|
#include "GUI_ObjectManipulation.hpp"
|
||||||
@ -631,14 +632,22 @@ void ObjectList::update_name_in_model(const wxDataViewItem& item) const
|
|||||||
|
|
||||||
ModelObject* obj = object(obj_idx);
|
ModelObject* obj = object(obj_idx);
|
||||||
if (m_objects_model->GetItemType(item) & itObject) {
|
if (m_objects_model->GetItemType(item) & itObject) {
|
||||||
obj->name = m_objects_model->GetName(item).ToUTF8().data();
|
obj->name = into_u8(m_objects_model->GetName(item));
|
||||||
// if object has just one volume, rename this volume too
|
// if object has just one volume, rename this volume too
|
||||||
if (obj->volumes.size() == 1)
|
if (obj->volumes.size() == 1 && !obj->volumes[0]->text_configuration.has_value())
|
||||||
obj->volumes[0]->name = obj->name;
|
obj->volumes[0]->name = obj->name;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (volume_id < 0) return;
|
if (volume_id < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Renaming of the text volume is suppressed
|
||||||
|
// So, revert the name in object list
|
||||||
|
if (obj->volumes[volume_id]->text_configuration.has_value()) {
|
||||||
|
m_objects_model->SetName(from_u8(obj->volumes[volume_id]->name), item);
|
||||||
|
return;
|
||||||
|
}
|
||||||
obj->volumes[volume_id]->name = m_objects_model->GetName(item).ToUTF8().data();
|
obj->volumes[volume_id]->name = m_objects_model->GetName(item).ToUTF8().data();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1741,7 +1750,7 @@ void ObjectList::load_shape_object_from_gallery(const wxArrayString& input_files
|
|||||||
wxGetApp().mainframe->update_title();
|
wxGetApp().mainframe->update_title();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectList::load_mesh_object(const TriangleMesh &mesh, const wxString &name, bool center)
|
void ObjectList::load_mesh_object(const TriangleMesh &mesh, const wxString &name, bool center, TextConfiguration* text_config/* = nullptr*/)
|
||||||
{
|
{
|
||||||
// Add mesh to model as a new object
|
// Add mesh to model as a new object
|
||||||
Model& model = wxGetApp().plater()->model();
|
Model& model = wxGetApp().plater()->model();
|
||||||
@ -1759,6 +1768,8 @@ void ObjectList::load_mesh_object(const TriangleMesh &mesh, const wxString &name
|
|||||||
ModelVolume* new_volume = new_object->add_volume(mesh);
|
ModelVolume* new_volume = new_object->add_volume(mesh);
|
||||||
new_object->sort_volumes(wxGetApp().app_config->get("order_volumes") == "1");
|
new_object->sort_volumes(wxGetApp().app_config->get("order_volumes") == "1");
|
||||||
new_volume->name = into_u8(name);
|
new_volume->name = into_u8(name);
|
||||||
|
if (text_config)
|
||||||
|
new_volume->text_configuration = *text_config;
|
||||||
// set a default extruder value, since user can't add it manually
|
// set a default extruder value, since user can't add it manually
|
||||||
new_volume->config.set_key_value("extruder", new ConfigOptionInt(0));
|
new_volume->config.set_key_value("extruder", new ConfigOptionInt(0));
|
||||||
new_object->invalidate_bounding_box();
|
new_object->invalidate_bounding_box();
|
||||||
@ -2680,7 +2691,8 @@ void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed)
|
|||||||
update_info_items(obj_idx, nullptr, call_selection_changed);
|
update_info_items(obj_idx, nullptr, call_selection_changed);
|
||||||
|
|
||||||
// add volumes to the object
|
// add volumes to the object
|
||||||
if (model_object->volumes.size() > 1) {
|
if (model_object->volumes.size() > 1 ||
|
||||||
|
model_object->volumes[0]->text_configuration.has_value()) {
|
||||||
for (const ModelVolume* volume : model_object->volumes) {
|
for (const ModelVolume* volume : model_object->volumes) {
|
||||||
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),
|
||||||
|
@ -27,6 +27,7 @@ class ModelConfig;
|
|||||||
class ModelObject;
|
class ModelObject;
|
||||||
class ModelVolume;
|
class ModelVolume;
|
||||||
class TriangleMesh;
|
class TriangleMesh;
|
||||||
|
struct TextConfiguration;
|
||||||
enum class ModelVolumeType : int;
|
enum class ModelVolumeType : int;
|
||||||
|
|
||||||
// FIXME: broken build on mac os because of this is missing:
|
// FIXME: broken build on mac os because of this is missing:
|
||||||
@ -256,7 +257,7 @@ public:
|
|||||||
void load_shape_object(const std::string &type_name);
|
void load_shape_object(const std::string &type_name);
|
||||||
void load_shape_object_from_gallery();
|
void load_shape_object_from_gallery();
|
||||||
void load_shape_object_from_gallery(const wxArrayString& input_files);
|
void load_shape_object_from_gallery(const wxArrayString& input_files);
|
||||||
void load_mesh_object(const TriangleMesh &mesh, const wxString &name, bool center = true);
|
void load_mesh_object(const TriangleMesh &mesh, const wxString &name, bool center = true, TextConfiguration* text_config = nullptr);
|
||||||
void del_object(const int obj_idx);
|
void del_object(const int obj_idx);
|
||||||
void del_subobject_item(wxDataViewItem& item);
|
void del_subobject_item(wxDataViewItem& item);
|
||||||
void del_settings_from_config(const wxDataViewItem& parent_item);
|
void del_settings_from_config(const wxDataViewItem& parent_item);
|
||||||
|
@ -445,12 +445,10 @@ bool GLGizmoEmboss::add_volume(const std::string &name, indexed_triangle_set &it
|
|||||||
// decide to add as volume or new object
|
// decide to add as volume or new object
|
||||||
const Selection &selection = m_parent.get_selection();
|
const Selection &selection = m_parent.get_selection();
|
||||||
if (selection.is_empty() || selection.get_object_idx() < 0) {
|
if (selection.is_empty() || selection.get_object_idx() < 0) {
|
||||||
|
TextConfiguration text_configuration = create_configuration();
|
||||||
// create new object
|
// create new object
|
||||||
app.obj_list()->load_mesh_object(tm, name);
|
app.obj_list()->load_mesh_object(tm, name, true, &text_configuration);
|
||||||
app.mainframe->update_title();
|
app.mainframe->update_title();
|
||||||
// get new created volume
|
|
||||||
m_volume = app.obj_list()->objects()->back()->volumes.front();
|
|
||||||
m_volume->text_configuration = create_configuration();
|
|
||||||
|
|
||||||
// load mesh cause close gizmo, soo I open it again
|
// load mesh cause close gizmo, soo I open it again
|
||||||
m_parent.get_gizmos_manager().open_gizmo(GLGizmosManager::EType::Emboss);
|
m_parent.get_gizmos_manager().open_gizmo(GLGizmosManager::EType::Emboss);
|
||||||
|
@ -751,8 +751,12 @@ wxDataViewItem ObjectDataViewModel::Delete(const wxDataViewItem &item)
|
|||||||
// get index of the last VolumeItem in CildrenList
|
// get index of the last VolumeItem in CildrenList
|
||||||
size_t vol_idx = GetItemIndexForFirstVolume(node_parent);
|
size_t vol_idx = GetItemIndexForFirstVolume(node_parent);
|
||||||
|
|
||||||
// delete this last volume
|
|
||||||
ObjectDataViewModelNode *last_child_node = node_parent->GetNthChild(vol_idx);
|
ObjectDataViewModelNode *last_child_node = node_parent->GetNthChild(vol_idx);
|
||||||
|
// if last volume is text then don't delete it
|
||||||
|
if (last_child_node->is_text_volume())
|
||||||
|
return parent;
|
||||||
|
|
||||||
|
// delete this last volume
|
||||||
DeleteSettings(wxDataViewItem(last_child_node));
|
DeleteSettings(wxDataViewItem(last_child_node));
|
||||||
node_parent->GetChildren().Remove(last_child_node);
|
node_parent->GetChildren().Remove(last_child_node);
|
||||||
node_parent->m_volumes_cnt = 0;
|
node_parent->m_volumes_cnt = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user