mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-12 09:17:52 -06:00
TriangleSelector: 'Select by angle' and 'reset selection' functions fixed
This commit is contained in:
parent
6baff45759
commit
0756a7e4b3
4 changed files with 31 additions and 78 deletions
|
@ -132,6 +132,15 @@ bool TriangleSelector::select_triangle(int facet_idx, FacetSupportType type, boo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void TriangleSelector::set_facet(int facet_idx, FacetSupportType state)
|
||||||
|
{
|
||||||
|
assert(facet_idx < m_orig_size_indices);
|
||||||
|
undivide_triangle(facet_idx);
|
||||||
|
assert(! m_triangles[facet_idx].is_split());
|
||||||
|
m_triangles[facet_idx].set_state(state);
|
||||||
|
}
|
||||||
|
|
||||||
void TriangleSelector::split_triangle(int facet_idx)
|
void TriangleSelector::split_triangle(int facet_idx)
|
||||||
{
|
{
|
||||||
if (m_triangles[facet_idx].is_split()) {
|
if (m_triangles[facet_idx].is_split()) {
|
||||||
|
|
|
@ -32,6 +32,9 @@ public:
|
||||||
FacetSupportType new_state); // enforcer or blocker?
|
FacetSupportType new_state); // enforcer or blocker?
|
||||||
|
|
||||||
|
|
||||||
|
// Set facet of the mesh to a given state. Only works for original triangles.
|
||||||
|
void set_facet(int facet_idx, FacetSupportType state);
|
||||||
|
|
||||||
// Clear everything and make the tree empty.
|
// Clear everything and make the tree empty.
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ bool GLGizmoFdmSupports::on_init()
|
||||||
m_desc["block"] = _L("Block supports");
|
m_desc["block"] = _L("Block supports");
|
||||||
m_desc["remove_caption"] = _L("Shift + Left mouse button") + ": ";
|
m_desc["remove_caption"] = _L("Shift + Left mouse button") + ": ";
|
||||||
m_desc["remove"] = _L("Remove selection");
|
m_desc["remove"] = _L("Remove selection");
|
||||||
m_desc["remove_all"] = _L("Remove all");
|
m_desc["remove_all"] = _L("Remove all selection");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -207,9 +207,9 @@ void GLGizmoFdmSupports::update_model_object() const
|
||||||
ModelObject* mo = m_c->selection_info()->model_object();
|
ModelObject* mo = m_c->selection_info()->model_object();
|
||||||
int idx = -1;
|
int idx = -1;
|
||||||
for (ModelVolume* mv : mo->volumes) {
|
for (ModelVolume* mv : mo->volumes) {
|
||||||
++idx;
|
|
||||||
if (! mv->is_model_part())
|
if (! mv->is_model_part())
|
||||||
continue;
|
continue;
|
||||||
|
++idx;
|
||||||
mv->m_supported_facets.set(*m_triangle_selectors[idx].get());
|
mv->m_supported_facets.set(*m_triangle_selectors[idx].get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -433,63 +433,9 @@ bool GLGizmoFdmSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*void GLGizmoFdmSupports::update_vertex_buffers(const TriangleMesh* mesh,
|
|
||||||
int mesh_id,
|
void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool block)
|
||||||
FacetSupportType type,
|
|
||||||
const std::vector<size_t>* new_facets)
|
|
||||||
{
|
{
|
||||||
//std::vector<GLIndexedVertexArray>& ivas = m_ivas[mesh_id][type == FacetSupportType::ENFORCER ? 0 : 1];
|
|
||||||
|
|
||||||
// lambda to push facet into vertex buffer
|
|
||||||
auto push_facet = [this, &mesh, &mesh_id](size_t idx, GLIndexedVertexArray& iva) {
|
|
||||||
for (int i=0; i<3; ++i)
|
|
||||||
iva.push_geometry(
|
|
||||||
mesh->its.vertices[mesh->its.indices[idx](i)].cast<double>(),
|
|
||||||
m_c->raycaster()->raycasters()[mesh_id]->get_triangle_normal(idx).cast<double>()
|
|
||||||
);
|
|
||||||
size_t num = iva.triangle_indices_size;
|
|
||||||
iva.push_triangle(num, num+1, num+2);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//if (ivas.size() == MaxVertexBuffers || ! new_facets) {
|
|
||||||
// If there are too many or they should be regenerated, make one large
|
|
||||||
// GLVertexBufferArray.
|
|
||||||
//ivas.clear(); // destructors release geometry
|
|
||||||
//ivas.push_back(GLIndexedVertexArray());
|
|
||||||
|
|
||||||
m_iva.release_geometry();
|
|
||||||
m_iva.clear();
|
|
||||||
|
|
||||||
bool pushed = false;
|
|
||||||
for (size_t facet_idx=0; facet_idx<m_selected_facets[mesh_id].size(); ++facet_idx) {
|
|
||||||
if (m_selected_facets[mesh_id][facet_idx] == type) {
|
|
||||||
push_facet(facet_idx, m_iva);
|
|
||||||
pushed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (pushed)
|
|
||||||
m_iva.finalize_geometry(true);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// we are only appending - let's make new vertex array and let the old ones live
|
|
||||||
ivas.push_back(GLIndexedVertexArray());
|
|
||||||
for (size_t facet_idx : *new_facets)
|
|
||||||
push_facet(facet_idx, ivas.back());
|
|
||||||
|
|
||||||
if (! new_facets->empty())
|
|
||||||
ivas.back().finalize_geometry(true);
|
|
||||||
else
|
|
||||||
ivas.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool overwrite, bool block)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
/*
|
|
||||||
float threshold = (M_PI/180.)*threshold_deg;
|
float threshold = (M_PI/180.)*threshold_deg;
|
||||||
const Selection& selection = m_parent.get_selection();
|
const Selection& selection = m_parent.get_selection();
|
||||||
const ModelObject* mo = m_c->selection_info()->model_object();
|
const ModelObject* mo = m_c->selection_info()->model_object();
|
||||||
|
@ -512,13 +458,12 @@ void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool overwr
|
||||||
int idx = -1;
|
int idx = -1;
|
||||||
for (const stl_facet& facet : mv->mesh().stl.facet_start) {
|
for (const stl_facet& facet : mv->mesh().stl.facet_start) {
|
||||||
++idx;
|
++idx;
|
||||||
if (facet.normal.dot(down) > dot_limit && (overwrite || m_selected_facets[mesh_id][idx] == FacetSupportType::NONE))
|
if (facet.normal.dot(down) > dot_limit)
|
||||||
m_selected_facets[mesh_id][idx] = block
|
m_triangle_selectors[mesh_id]->set_facet(idx,
|
||||||
|
block
|
||||||
? FacetSupportType::BLOCKER
|
? FacetSupportType::BLOCKER
|
||||||
: FacetSupportType::ENFORCER;
|
: FacetSupportType::ENFORCER);
|
||||||
}
|
}
|
||||||
update_vertex_buffers(&mv->mesh(), mesh_id, FacetSupportType::ENFORCER);
|
|
||||||
update_vertex_buffers(&mv->mesh(), mesh_id, FacetSupportType::BLOCKER);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
activate_internal_undo_redo_stack(true);
|
activate_internal_undo_redo_stack(true);
|
||||||
|
@ -528,7 +473,6 @@ void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool overwr
|
||||||
update_model_object();
|
update_model_object();
|
||||||
m_parent.set_as_dirty();
|
m_parent.set_as_dirty();
|
||||||
m_setting_angle = false;
|
m_setting_angle = false;
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -584,18 +528,17 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
if (m_imgui->button(m_desc.at("remove_all"))) {
|
if (m_imgui->button(m_desc.at("remove_all"))) {
|
||||||
/*ModelObject* mo = m_c->selection_info()->model_object();
|
Plater::TakeSnapshot(wxGetApp().plater(), wxString(_L("Reset selection")));
|
||||||
|
ModelObject* mo = m_c->selection_info()->model_object();
|
||||||
int idx = -1;
|
int idx = -1;
|
||||||
for (ModelVolume* mv : mo->volumes) {
|
for (ModelVolume* mv : mo->volumes) {
|
||||||
++idx;
|
|
||||||
if (mv->is_model_part()) {
|
if (mv->is_model_part()) {
|
||||||
m_selected_facets[idx].assign(m_selected_facets[idx].size(), FacetSupportType::NONE);
|
++idx;
|
||||||
mv->m_supported_facets.clear();
|
m_triangle_selectors[idx]->reset();
|
||||||
update_vertex_buffers(&mv->mesh(), idx, FacetSupportType::ENFORCER);
|
|
||||||
update_vertex_buffers(&mv->mesh(), idx, FacetSupportType::BLOCKER);
|
|
||||||
m_parent.set_as_dirty();
|
|
||||||
}
|
}
|
||||||
}*/
|
}
|
||||||
|
update_model_object();
|
||||||
|
m_parent.set_as_dirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
const float max_tooltip_width = ImGui::GetFontSize() * 20.0f;
|
const float max_tooltip_width = ImGui::GetFontSize() * 20.0f;
|
||||||
|
@ -651,12 +594,11 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (m_imgui->slider_float("", &m_angle_threshold_deg, 0.f, 90.f, "%.f"))
|
if (m_imgui->slider_float("", &m_angle_threshold_deg, 0.f, 90.f, "%.f"))
|
||||||
m_parent.set_slope_range({90.f - m_angle_threshold_deg, 90.f - m_angle_threshold_deg});
|
m_parent.set_slope_range({90.f - m_angle_threshold_deg, 90.f - m_angle_threshold_deg});
|
||||||
m_imgui->checkbox(wxString("Overwrite already selected facets"), m_overwrite_selected);
|
|
||||||
if (m_imgui->button("Enforce"))
|
if (m_imgui->button("Enforce"))
|
||||||
select_facets_by_angle(m_angle_threshold_deg, m_overwrite_selected, false);
|
select_facets_by_angle(m_angle_threshold_deg, false);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (m_imgui->button("Block"))
|
if (m_imgui->button("Block"))
|
||||||
select_facets_by_angle(m_angle_threshold_deg, m_overwrite_selected, true);
|
select_facets_by_angle(m_angle_threshold_deg, true);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (m_imgui->button("Cancel"))
|
if (m_imgui->button("Cancel"))
|
||||||
m_setting_angle = false;
|
m_setting_angle = false;
|
||||||
|
|
|
@ -82,8 +82,7 @@ private:
|
||||||
void update_from_model_object();
|
void update_from_model_object();
|
||||||
void activate_internal_undo_redo_stack(bool activate);
|
void activate_internal_undo_redo_stack(bool activate);
|
||||||
|
|
||||||
void select_facets_by_angle(float threshold, bool overwrite, bool block);
|
void select_facets_by_angle(float threshold, bool block);
|
||||||
bool m_overwrite_selected = false;
|
|
||||||
float m_angle_threshold_deg = 45.f;
|
float m_angle_threshold_deg = 45.f;
|
||||||
|
|
||||||
bool is_mesh_point_clipped(const Vec3d& point) const;
|
bool is_mesh_point_clipped(const Vec3d& point) const;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue