Measuring: Improved visualization

This commit is contained in:
Lukas Matena 2022-07-07 12:30:26 +02:00 committed by enricoturri1966
parent 70ea995f4a
commit 0e372b8eb2
2 changed files with 34 additions and 21 deletions

View File

@ -149,12 +149,15 @@ void GLGizmoMeasure::on_render()
++m_currently_shown_plane; ++m_currently_shown_plane;
m_currently_shown_plane = std::clamp(m_currently_shown_plane, 0, std::max(0, int(m_planes.size())-1)); m_currently_shown_plane = std::clamp(m_currently_shown_plane, 0, std::max(0, int(m_planes.size())-1));
m_imgui->text(std::to_string(m_currently_shown_plane)); m_imgui->text(std::to_string(m_currently_shown_plane));
m_imgui->checkbox(wxString("Show all"), m_show_all); m_imgui->checkbox(wxString("Show all"), m_show_all_planes);
m_imgui->checkbox(wxString("Show points"), m_show_points);
m_imgui->checkbox(wxString("Show edges"), m_show_edges);
m_imgui->checkbox(wxString("Show circles"), m_show_circles);
m_imgui->end(); m_imgui->end();
int i = m_show_all ? 0 : m_currently_shown_plane; int i = m_show_all_planes ? 0 : m_currently_shown_plane;
for (int i = 0; i < (int)m_planes.size(); ++i) { for (; i < (int)m_planes.size(); ++i) {
// Render all the borders. // Render all the borders.
for (int j=0; j<(int)m_planes[i].vbos.size(); ++j) { for (int j=0; j<(int)m_planes[i].vbos.size(); ++j) {
m_planes[i].vbos[j].set_color(j == m_hover_id ? DEFAULT_HOVER_PLANE_COLOR : DEFAULT_PLANE_COLOR); m_planes[i].vbos[j].set_color(j == m_hover_id ? DEFAULT_HOVER_PLANE_COLOR : DEFAULT_PLANE_COLOR);
@ -165,7 +168,7 @@ void GLGizmoMeasure::on_render()
// Render features: // Render features:
for (const SurfaceFeature& feature : m_planes[i].surface_features) { for (const SurfaceFeature& feature : m_planes[i].surface_features) {
Transform3d view_feature_matrix = view_model_matrix * Transform3d(Eigen::Translation3d(feature.pos)); Transform3d view_feature_matrix = view_model_matrix * Transform3d(Eigen::Translation3d(feature.pos));
if (feature.type == SurfaceFeature::Line) { if (m_show_edges && feature.type == SurfaceFeature::Line) {
auto q = Eigen::Quaternion<double>::FromTwoVectors(Vec3d::UnitZ(), feature.endpoint - feature.pos); auto q = Eigen::Quaternion<double>::FromTwoVectors(Vec3d::UnitZ(), feature.endpoint - feature.pos);
view_feature_matrix *= q; view_feature_matrix *= q;
view_feature_matrix.scale(Vec3d(0.3, 0.3, (feature.endpoint - feature.pos).norm())); view_feature_matrix.scale(Vec3d(0.3, 0.3, (feature.endpoint - feature.pos).norm()));
@ -174,19 +177,21 @@ void GLGizmoMeasure::on_render()
m_vbo_cylinder.render(); m_vbo_cylinder.render();
} }
view_feature_matrix = view_model_matrix * Transform3d(Eigen::Translation3d(feature.pos)); if (m_show_points && feature.type == SurfaceFeature::Line || m_show_circles && feature.type == SurfaceFeature::Circle) {
view_feature_matrix.scale(0.5); view_feature_matrix = view_model_matrix * Transform3d(Eigen::Translation3d(feature.pos));
shader->set_uniform("view_model_matrix", view_feature_matrix); view_feature_matrix.scale(0.5);
m_vbo_sphere.set_color(feature.type == SurfaceFeature::Line shader->set_uniform("view_model_matrix", view_feature_matrix);
? ColorRGBA(1.f, 0.f, 0.f, 1.f) m_vbo_sphere.set_color(feature.type == SurfaceFeature::Line
: ColorRGBA(0.f, 1.f, 0.f, 1.f)); ? ColorRGBA(1.f, 0.f, 0.f, 1.f)
m_vbo_sphere.render(); : ColorRGBA(0.f, 1.f, 0.f, 1.f));
m_vbo_sphere.render();
}
shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("view_model_matrix", view_model_matrix);
} }
if (! m_show_all) if (! m_show_all_planes)
break; break;
} }
} }
@ -268,7 +273,7 @@ void GLGizmoMeasure::extract_features(GLGizmoMeasure::PlaneData& plane)
plane.surface_features.clear(); plane.surface_features.clear();
const Vec3d& normal = plane.normal; const Vec3d& normal = plane.normal;
const double edge_threshold = 10. * (M_PI/180.); const double edge_threshold = 25. * (M_PI/180.);
@ -276,9 +281,10 @@ void GLGizmoMeasure::extract_features(GLGizmoMeasure::PlaneData& plane)
assert(border.size() > 1); assert(border.size() > 1);
assert(! border.front().isApprox(border.back())); assert(! border.front().isApprox(border.back()));
double last_angle = 0.; double last_angle = 0.;
size_t first_idx = 0; int first_idx = 0;
bool circle = false;
for (size_t i=0; i<border.size(); ++i) { for (int i=0; i<int(border.size()); ++i) {
const Vec3d& v2 = (i == 0 ? border[0] - border[border.size()-1] const Vec3d& v2 = (i == 0 ? border[0] - border[border.size()-1]
: border[i] - border[i-1]); : border[i] - border[i-1]);
const Vec3d& v1 = i == border.size()-1 ? border[0] - border.back() const Vec3d& v1 = i == border.size()-1 ? border[0] - border.back()
@ -287,10 +293,12 @@ void GLGizmoMeasure::extract_features(GLGizmoMeasure::PlaneData& plane)
if (angle < -M_PI/2.) if (angle < -M_PI/2.)
angle += M_PI; angle += M_PI;
std::cout << (180./M_PI) * angle << std::endl; std::cout << (180./M_PI) * angle << std::endl;
if (i != 0) { if (i != 0) {
// This is not the first corner. // This is not the first corner.
if (std::abs(angle) > edge_threshold || i == border.size() - 1) { bool same_as_last = Slic3r::is_approx(angle, last_angle);
if (std::abs(angle) > edge_threshold || (! same_as_last && circle) || i == border.size() - 1) {
// Current feature ended. Save it and remember current point as beginning of the next. // Current feature ended. Save it and remember current point as beginning of the next.
bool is_line = (i == first_idx + 1); bool is_line = (i == first_idx + 1);
plane.surface_features.emplace_back(SurfaceFeature{ plane.surface_features.emplace_back(SurfaceFeature{
@ -300,11 +308,13 @@ void GLGizmoMeasure::extract_features(GLGizmoMeasure::PlaneData& plane)
0. // FIXME 0. // FIXME
}); });
first_idx = i; first_idx = i;
} else if (Slic3r::is_approx(angle, last_angle)) { circle = false;
} else if (same_as_last && ! circle) {
// possibly a segment of a circle // possibly a segment of a circle
} else { first_idx = std::max(i-2, 0);
circle = true;
} else if (! circle) {
first_idx = i; first_idx = i;
} }
} }
last_angle = angle; last_angle = angle;

View File

@ -24,7 +24,10 @@ class GLGizmoMeasure : public GLGizmoBase
private: private:
int m_currently_shown_plane = 0; int m_currently_shown_plane = 0;
bool m_show_all = false; bool m_show_all_planes = false;
bool m_show_points = true;
bool m_show_edges = true;
bool m_show_circles = true;
GLModel m_vbo_sphere; GLModel m_vbo_sphere;
GLModel m_vbo_cylinder; GLModel m_vbo_cylinder;