ObjectList: Add "Text" marker only where it's needed

This commit is contained in:
YuSanka 2023-01-18 20:19:47 +01:00
parent e3af59b3ee
commit ecc3211c18
4 changed files with 67 additions and 16 deletions

View File

@ -794,6 +794,11 @@ bool ModelObject::is_mm_painted() const
return std::any_of(this->volumes.cbegin(), this->volumes.cend(), [](const ModelVolume *mv) { return mv->is_mm_painted(); }); return std::any_of(this->volumes.cbegin(), this->volumes.cend(), [](const ModelVolume *mv) { return mv->is_mm_painted(); });
} }
bool ModelObject::is_text() const
{
return this->volumes.size() == 1 && this->volumes[0]->is_text();
}
void ModelObject::sort_volumes(bool full_sort) void ModelObject::sort_volumes(bool full_sort)
{ {
// sort volumes inside the object to order "Model Part, Negative Volume, Modifier, Support Blocker and Support Enforcer. " // sort volumes inside the object to order "Model Part, Negative Volume, Modifier, Support Blocker and Support Enforcer. "

View File

@ -383,7 +383,9 @@ public:
bool is_seam_painted() const; bool is_seam_painted() const;
// Checks if any of object volume is painted using the multi-material painting gizmo. // Checks if any of object volume is painted using the multi-material painting gizmo.
bool is_mm_painted() const; bool is_mm_painted() const;
// Checks if object contains just one volume and it's a text
bool is_text() const;
ModelInstance* add_instance(); ModelInstance* add_instance();
ModelInstance* add_instance(const ModelInstance &instance); ModelInstance* add_instance(const ModelInstance &instance);
ModelInstance* add_instance(const Vec3d &offset, const Vec3d &scaling_factor, const Vec3d &rotation, const Vec3d &mirror); ModelInstance* add_instance(const Vec3d &offset, const Vec3d &scaling_factor, const Vec3d &rotation, const Vec3d &mirror);
@ -797,6 +799,7 @@ public:
bool is_support_enforcer() const { return m_type == ModelVolumeType::SUPPORT_ENFORCER; } bool is_support_enforcer() const { return m_type == ModelVolumeType::SUPPORT_ENFORCER; }
bool is_support_blocker() const { return m_type == ModelVolumeType::SUPPORT_BLOCKER; } 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_support_modifier() const { return m_type == ModelVolumeType::SUPPORT_BLOCKER || m_type == ModelVolumeType::SUPPORT_ENFORCER; }
bool is_text() const { return text_configuration.has_value(); }
t_model_material_id material_id() const { return m_material_id; } t_model_material_id material_id() const { return m_material_id; }
void reset_extra_facets(); void reset_extra_facets();
void apply_tolerance(); void apply_tolerance();

View File

@ -226,6 +226,21 @@ ObjectList::ObjectList(wxWindow* parent) :
wxDataViewItem item; wxDataViewItem item;
wxDataViewColumn* col; wxDataViewColumn* col;
this->HitTest(this->get_mouse_position_in_control(), item, col); this->HitTest(this->get_mouse_position_in_control(), item, col);
// if there is text item to editing, than edit just a name without Text marker
if (auto type = m_objects_model->GetItemType(item);
type & (itObject | itVolume) && col->GetModelColumn() == colName) {
if (ModelObject* obj = object(m_objects_model->GetObjectIdByItem(item))) {
if (type == itObject && obj->is_text())
m_objects_model->SetName(from_u8(obj->name), item);
else if (type == itVolume && obj->volumes[m_objects_model->GetVolumeIdByItem(item)]->is_text()) {
// we cant rename text parts
event.StopPropagation();
return;
}
}
}
this->EditItem(item, col); this->EditItem(item, col);
event.StopPropagation(); event.StopPropagation();
}); });
@ -640,6 +655,11 @@ void ObjectList::update_extruder_in_config(const wxDataViewItem& item)
wxGetApp().plater()->update(); wxGetApp().plater()->update();
} }
static wxString get_item_name(const std::string& name, const bool is_text_volume)
{
return (is_text_volume ? _L("Text") + " - " : "") + from_u8(name);
}
void ObjectList::update_name_in_model(const wxDataViewItem& item) const void ObjectList::update_name_in_model(const wxDataViewItem& item) const
{ {
const int obj_idx = m_objects_model->GetObjectIdByItem(item); const int obj_idx = m_objects_model->GetObjectIdByItem(item);
@ -652,8 +672,11 @@ void ObjectList::update_name_in_model(const wxDataViewItem& item) const
if (m_objects_model->GetItemType(item) & itObject) { if (m_objects_model->GetItemType(item) & itObject) {
obj->name = into_u8(m_objects_model->GetName(item)); 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 && !obj->volumes[0]->text_configuration.has_value()) if (obj->is_text()) {
obj->volumes[0]->name = obj->name; obj->volumes[0]->name = obj->name;
//update object name with text marker in ObjectList
m_objects_model->SetName(get_item_name(obj->name, true), item);
}
return; return;
} }
@ -662,28 +685,32 @@ void ObjectList::update_name_in_model(const wxDataViewItem& item) const
// Renaming of the text volume is suppressed // Renaming of the text volume is suppressed
// So, revert the name in object list // So, revert the name in object list
if (obj->volumes[volume_id]->text_configuration.has_value()) { if (obj->volumes[volume_id]->is_text()) {
m_objects_model->SetName(from_u8(obj->volumes[volume_id]->name), item); m_objects_model->SetName(get_item_name(obj->volumes[volume_id]->name, true), item);
return; return;
} }
obj->volumes[volume_id]->name = m_objects_model->GetName(item).ToUTF8().data(); obj->volumes[volume_id]->name = into_u8(m_objects_model->GetName(item));
} }
void ObjectList::update_name_in_list(int obj_idx, int vol_idx) const void ObjectList::update_name_in_list(int obj_idx, int vol_idx) const
{ {
if (obj_idx < 0) return; if (obj_idx < 0) return;
wxDataViewItem item = GetSelection(); wxDataViewItem item = GetSelection();
if (!item || !(m_objects_model->GetItemType(item) & (itVolume | itObject))) auto type = m_objects_model->GetItemType(item);
if (!item || !(type & (itVolume | itObject)))
return; return;
wxString new_name = from_u8(object(obj_idx)->volumes[vol_idx]->name); ModelObject* obj = object(obj_idx);
const bool is_text_volume = type == itVolume ? obj->volumes[vol_idx]->is_text() : obj->is_text();
const wxString new_name = get_item_name(object(obj_idx)->volumes[vol_idx]->name, is_text_volume);
if (new_name.IsEmpty() || m_objects_model->GetName(item) == new_name) if (new_name.IsEmpty() || m_objects_model->GetName(item) == new_name)
return; return;
m_objects_model->SetName(new_name, item); m_objects_model->SetName(new_name, item);
// if object has just one volume, rename object too // if object has just one volume, rename object too
if (ModelObject* obj = object(obj_idx); obj->volumes.size() == 1) if (obj->volumes.size() == 1)
obj->name = obj->volumes.front()->name; obj->name = obj->volumes.front()->name;
} }
@ -2089,13 +2116,13 @@ bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, con
object->delete_volume(idx); object->delete_volume(idx);
if (object->volumes.size() == 1) { if (object->volumes.size() == 1) {
wxDataViewItem obj_item = m_objects_model->GetItemById(obj_idx);
const auto last_volume = object->volumes[0]; const auto last_volume = object->volumes[0];
if (!last_volume->config.empty()) { if (!last_volume->config.empty()) {
object->config.apply(last_volume->config); object->config.apply(last_volume->config);
last_volume->config.reset(); last_volume->config.reset();
// update extruder color in ObjectList // update extruder color in ObjectList
wxDataViewItem obj_item = m_objects_model->GetItemById(obj_idx);
if (obj_item) { if (obj_item) {
wxString extruder = object->config.has("extruder") ? wxString::Format("%d", object->config.extruder()) : _L("default"); wxString extruder = object->config.has("extruder") ? wxString::Format("%d", object->config.extruder()) : _L("default");
m_objects_model->SetExtruder(extruder, obj_item); m_objects_model->SetExtruder(extruder, obj_item);
@ -2103,6 +2130,9 @@ bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, con
// add settings to the object, if it has them // add settings to the object, if it has them
add_settings_item(obj_item, &object->config.get()); add_settings_item(obj_item, &object->config.get());
} }
if (last_volume->is_text())
m_objects_model->SetName(get_item_name(/*last_volume*/object->name, true), obj_item);
} }
} }
else if (type == itInstance) { else if (type == itInstance) {
@ -3005,6 +3035,12 @@ wxDataViewItemArray ObjectList::add_volumes_to_object_in_list(size_t obj_idx, st
const ModelObject* object = (*m_objects)[obj_idx]; const ModelObject* object = (*m_objects)[obj_idx];
// add volumes to the object // add volumes to the object
if (can_add_volumes_to_object(object)) { if (can_add_volumes_to_object(object)) {
if (object->volumes.size() > 1) {
wxString obj_item_name = from_u8(object->name);
if (m_objects_model->GetName(object_item) != obj_item_name)
m_objects_model->SetName(obj_item_name, object_item);
}
int volume_idx{ -1 }; int volume_idx{ -1 };
for (const ModelVolume* volume : object->volumes) { for (const ModelVolume* volume : object->volumes) {
++volume_idx; ++volume_idx;
@ -3012,10 +3048,10 @@ wxDataViewItemArray ObjectList::add_volumes_to_object_in_list(size_t obj_idx, st
(printer_technology() == ptSLA && volume->type() == ModelVolumeType::PARAMETER_MODIFIER)) (printer_technology() == ptSLA && volume->type() == ModelVolumeType::PARAMETER_MODIFIER))
continue; continue;
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(object_item, const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(object_item,
from_u8(volume->name), get_item_name(volume->name, volume->is_text()),
volume_idx, volume_idx,
volume->type(), volume->type(),
volume->text_configuration.has_value(), volume->is_text(),
get_warning_icon_name(volume->mesh().stats()), get_warning_icon_name(volume->mesh().stats()),
extruder2str(volume->config.has("extruder") ? volume->config.extruder() : 0)); extruder2str(volume->config.has("extruder") ? volume->config.extruder() : 0));
add_settings_item(vol_item, &volume->config.get()); add_settings_item(vol_item, &volume->config.get());
@ -3033,7 +3069,7 @@ wxDataViewItemArray ObjectList::add_volumes_to_object_in_list(size_t obj_idx, st
void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed) void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed)
{ {
auto model_object = (*m_objects)[obj_idx]; auto model_object = (*m_objects)[obj_idx];
const wxString& item_name = from_u8(model_object->name); const wxString& item_name = get_item_name(model_object->name, model_object->is_text());
const auto item = m_objects_model->AddObject(item_name, const auto item = m_objects_model->AddObject(item_name,
extruder2str(model_object->config.has("extruder") ? model_object->config.extruder() : 0), extruder2str(model_object->config.has("extruder") ? model_object->config.extruder() : 0),
get_warning_icon_name(model_object->mesh().stats()), get_warning_icon_name(model_object->mesh().stats()),
@ -4560,11 +4596,18 @@ void ObjectList::split_instances()
void ObjectList::rename_item() void ObjectList::rename_item()
{ {
const wxDataViewItem item = GetSelection(); const wxDataViewItem item = GetSelection();
if (!item || !(m_objects_model->GetItemType(item) & (itVolume | itObject))) auto type = m_objects_model->GetItemType(item);
if (!item || !(type & (itVolume | itObject)))
return ; return ;
const wxString new_name = wxGetTextFromUser(_(L("Enter new name"))+":", _(L("Renaming")), wxString input_name = m_objects_model->GetName(item);
m_objects_model->GetName(item), this); if (ModelObject* obj = object(m_objects_model->GetObjectIdByItem(item))) {
// if there is text item to editing, than edit just a name without Text marker
if (type == itObject && obj->is_text())
input_name = from_u8(obj->name);
}
const wxString new_name = wxGetTextFromUser(_L("Enter new name")+":", _L("Renaming"), input_name, this);
if (new_name.IsEmpty()) if (new_name.IsEmpty())
return; return;

View File

@ -3664,7 +3664,7 @@ DataBase priv::create_emboss_data_base(const std::string &text, StyleManager& st
text_fixed = text; // copy text_fixed = text; // copy
std::replace(text_fixed.begin(), text_fixed.end(), '\n', ' '); std::replace(text_fixed.begin(), text_fixed.end(), '\n', ' ');
} }
return _u8L("Text") + " - " + ((contain_enter) ? text_fixed : text); return ((contain_enter) ? text_fixed : text);
}; };
auto create_configuration = [&]() -> TextConfiguration { auto create_configuration = [&]() -> TextConfiguration {