Undo/redo in FDM supports gizmo
This commit is contained in:
parent
0c84a0b696
commit
272de22055
@ -411,6 +411,11 @@ public:
|
||||
return timestamp == other.get_timestamp();
|
||||
}
|
||||
|
||||
template<class Archive> void serialize(Archive &ar)
|
||||
{
|
||||
ar(m_data);
|
||||
}
|
||||
|
||||
private:
|
||||
std::map<int, FacetSupportType> m_data;
|
||||
|
||||
@ -613,7 +618,8 @@ private:
|
||||
}
|
||||
template<class Archive> void load(Archive &ar) {
|
||||
bool has_convex_hull;
|
||||
ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull);
|
||||
ar(name, source, m_mesh, m_type, m_material_id, m_transformation,
|
||||
m_is_splittable, has_convex_hull, m_supported_facets);
|
||||
cereal::load_by_value(ar, config);
|
||||
assert(m_mesh);
|
||||
if (has_convex_hull) {
|
||||
@ -626,7 +632,8 @@ private:
|
||||
}
|
||||
template<class Archive> void save(Archive &ar) const {
|
||||
bool has_convex_hull = m_convex_hull.get() != nullptr;
|
||||
ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull);
|
||||
ar(name, source, m_mesh, m_type, m_material_id, m_transformation,
|
||||
m_is_splittable, has_convex_hull, m_supported_facets);
|
||||
cereal::save_by_value(ar, config);
|
||||
if (has_convex_hull)
|
||||
cereal::save_optional(ar, m_convex_hull);
|
||||
|
@ -58,10 +58,10 @@ void GLGizmoFdmSupports::set_fdm_support_data(ModelObject* model_object, const S
|
||||
return;
|
||||
|
||||
if (mo && selection.is_from_single_instance()
|
||||
&& (mo != m_old_mo || mo->volumes.size() != m_old_volumes_size))
|
||||
&& (mo->id() != m_old_mo_id || mo->volumes.size() != m_old_volumes_size))
|
||||
{
|
||||
update_mesh();
|
||||
m_old_mo = mo;
|
||||
update_from_model_object();
|
||||
m_old_mo_id = mo->id();
|
||||
m_old_volumes_size = mo->volumes.size();
|
||||
}
|
||||
}
|
||||
@ -177,14 +177,21 @@ void GLGizmoFdmSupports::render_cursor_circle() const
|
||||
}
|
||||
|
||||
|
||||
void GLGizmoFdmSupports::on_render_for_picking() const
|
||||
void GLGizmoFdmSupports::update_model_object() const
|
||||
{
|
||||
|
||||
ModelObject* mo = m_c->selection_info()->model_object();
|
||||
int idx = -1;
|
||||
for (ModelVolume* mv : mo->volumes) {
|
||||
++idx;
|
||||
if (! mv->is_model_part())
|
||||
continue;
|
||||
for (int i=0; i<int(m_selected_facets[idx].size()); ++i)
|
||||
mv->m_supported_facets.set_facet(i, m_selected_facets[idx][i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void GLGizmoFdmSupports::update_mesh()
|
||||
void GLGizmoFdmSupports::update_from_model_object()
|
||||
{
|
||||
wxBusyCursor wait;
|
||||
|
||||
@ -193,7 +200,6 @@ void GLGizmoFdmSupports::update_mesh()
|
||||
for (const ModelVolume* mv : mo->volumes)
|
||||
if (mv->is_model_part())
|
||||
++num_of_volumes;
|
||||
|
||||
m_selected_facets.resize(num_of_volumes);
|
||||
m_neighbors.resize(num_of_volumes);
|
||||
m_ivas.clear();
|
||||
@ -469,19 +475,16 @@ bool GLGizmoFdmSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
|
||||
|
||||
if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::RightUp)
|
||||
&& m_button_down != Button::None) {
|
||||
// Take snapshot and update ModelVolume data.
|
||||
wxString action_name = shift_down
|
||||
? _L("Remove selection")
|
||||
: (m_button_down == Button::Left
|
||||
? _L("Add supports")
|
||||
: _L("Block supports"));
|
||||
Plater::TakeSnapshot(wxGetApp().plater(), action_name);
|
||||
update_model_object();
|
||||
|
||||
m_button_down = Button::None;
|
||||
|
||||
// Synchronize gizmo with ModelVolume data.
|
||||
ModelObject* mo = m_c->selection_info()->model_object();
|
||||
int idx = -1;
|
||||
for (ModelVolume* mv : mo->volumes) {
|
||||
++idx;
|
||||
if (! mv->is_model_part())
|
||||
continue;
|
||||
for (int i=0; i<int(m_selected_facets[idx].size()); ++i)
|
||||
mv->m_supported_facets.set_facet(i, m_selected_facets[idx][i]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -666,12 +669,22 @@ void GLGizmoFdmSupports::on_set_state()
|
||||
return;
|
||||
|
||||
if (m_state == On && m_old_state != On) { // the gizmo was just turned on
|
||||
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("FDM gizmo turned on")));
|
||||
{
|
||||
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("FDM gizmo turned on")));
|
||||
}
|
||||
if (! m_parent.get_gizmos_manager().is_serializing()) {
|
||||
wxGetApp().CallAfter([]() {
|
||||
wxGetApp().plater()->enter_gizmos_stack();
|
||||
});
|
||||
}
|
||||
}
|
||||
if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off
|
||||
// we are actually shutting down
|
||||
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("FDM gizmo turned off")));
|
||||
m_old_mo = nullptr;
|
||||
wxGetApp().plater()->leave_gizmos_stack();
|
||||
{
|
||||
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("FDM gizmo turned off")));
|
||||
}
|
||||
m_old_mo_id = -1;
|
||||
m_ivas.clear();
|
||||
m_neighbors.clear();
|
||||
m_selected_facets.clear();
|
||||
@ -696,7 +709,7 @@ void GLGizmoFdmSupports::on_stop_dragging()
|
||||
|
||||
void GLGizmoFdmSupports::on_load(cereal::BinaryInputArchive& ar)
|
||||
{
|
||||
|
||||
update_from_model_object();
|
||||
}
|
||||
|
||||
|
||||
|
@ -19,7 +19,7 @@ enum class SLAGizmoEventType : unsigned char;
|
||||
class GLGizmoFdmSupports : public GLGizmoBase
|
||||
{
|
||||
private:
|
||||
const ModelObject* m_old_mo = nullptr;
|
||||
ObjectID m_old_mo_id;
|
||||
size_t m_old_volumes_size = 0;
|
||||
|
||||
GLUquadricObj* m_quadric;
|
||||
@ -53,11 +53,13 @@ public:
|
||||
private:
|
||||
bool on_init() override;
|
||||
void on_render() const override;
|
||||
void on_render_for_picking() const override;
|
||||
void on_render_for_picking() const override {}
|
||||
|
||||
void render_triangles(const Selection& selection) const;
|
||||
void render_cursor_circle() const;
|
||||
void update_mesh();
|
||||
|
||||
void update_model_object() const;
|
||||
void update_from_model_object();
|
||||
|
||||
bool is_mesh_point_clipped(const Vec3d& point) const;
|
||||
|
||||
|
@ -371,15 +371,6 @@ void GLGizmosManager::set_sla_support_data(ModelObject* model_object)
|
||||
|| wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA)
|
||||
return;
|
||||
|
||||
/*m_common_gizmos_data->update_from_backend(m_parent, model_object);
|
||||
|
||||
auto* gizmo_supports = dynamic_cast<GLGizmoSlaSupports*>(m_gizmos[SlaSupports].get());
|
||||
|
||||
|
||||
// note: sla support gizmo takes care of updating the common data.
|
||||
// following lines are thus dependent
|
||||
//gizmo_supports->set_sla_support_data(model_object, m_parent.get_selection());
|
||||
*/
|
||||
auto* gizmo_hollow = dynamic_cast<GLGizmoHollow*>(m_gizmos[Hollow].get());
|
||||
auto* gizmo_supports = dynamic_cast<GLGizmoSlaSupports*>(m_gizmos[SlaSupports].get());
|
||||
gizmo_hollow->set_sla_support_data(model_object, m_parent.get_selection());
|
||||
|
@ -139,6 +139,11 @@ public:
|
||||
EType new_current = m_current;
|
||||
m_current = old_current;
|
||||
|
||||
// Update common data. They should be updated when activate_gizmo is
|
||||
// called, so it can be used in on_set_state which is called from there.
|
||||
if (new_current != Undefined)
|
||||
m_common_gizmos_data->update(m_gizmos[new_current]->get_requirements());
|
||||
|
||||
// activate_gizmo call sets m_current and calls set_state for the gizmo
|
||||
// it does nothing in case the gizmo is already activated
|
||||
// it can safely be called for Undefined gizmo
|
||||
@ -167,6 +172,7 @@ public:
|
||||
|
||||
void refresh_on_off_state();
|
||||
void reset_all_states();
|
||||
bool is_serializing() const { return m_serializing; }
|
||||
|
||||
void set_hover_id(int id);
|
||||
void enable_grabber(EType type, unsigned int id, bool enable);
|
||||
|
Loading…
Reference in New Issue
Block a user