mirror of https://github.com/CGAL/cgal
integrated curvature vis to display property
still need to add the radius setting part
This commit is contained in:
parent
4b450a5948
commit
28efeb2056
|
|
@ -22,11 +22,13 @@
|
||||||
#include <CGAL/Polygon_mesh_processing/compute_normal.h>
|
#include <CGAL/Polygon_mesh_processing/compute_normal.h>
|
||||||
#include <CGAL/Polygon_mesh_processing/measure.h>
|
#include <CGAL/Polygon_mesh_processing/measure.h>
|
||||||
#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>
|
#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>
|
||||||
|
#include <CGAL/Polygon_mesh_processing/interpolated_corrected_curvatures.h>
|
||||||
|
|
||||||
#include <QAbstractItemView>
|
#include <QAbstractItemView>
|
||||||
#include <QAction>
|
#include <QAction>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
|
#include <QSlider>
|
||||||
#include <QColorDialog>
|
#include <QColorDialog>
|
||||||
#include <QInputDialog>
|
#include <QInputDialog>
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
|
|
@ -47,6 +49,8 @@
|
||||||
|
|
||||||
using namespace CGAL::Three;
|
using namespace CGAL::Three;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Viewer_interface* (&getActiveViewer)() = Three::activeViewer;
|
Viewer_interface* (&getActiveViewer)() = Three::activeViewer;
|
||||||
|
|
||||||
class DockWidget
|
class DockWidget
|
||||||
|
|
@ -99,6 +103,11 @@ private:
|
||||||
MAX_VALUE
|
MAX_VALUE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum CurvatureType {
|
||||||
|
MEAN_CURVATURE,
|
||||||
|
GAUSSIAN_CURVATURE
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool applicable(QAction*) const Q_DECL_OVERRIDE
|
bool applicable(QAction*) const Q_DECL_OVERRIDE
|
||||||
{
|
{
|
||||||
|
|
@ -238,6 +247,14 @@ private:
|
||||||
dock_widget->maxBox->setRange(0, 360);
|
dock_widget->maxBox->setRange(0, 360);
|
||||||
dock_widget->maxBox->setValue(0);
|
dock_widget->maxBox->setValue(0);
|
||||||
}
|
}
|
||||||
|
else if (property_name == "Interpolated Corrected Gaussian Curvature" ||
|
||||||
|
property_name == "Interpolated Corrected Mean Curvature")
|
||||||
|
{
|
||||||
|
dock_widget->minBox->setRange(-1000, 1000);
|
||||||
|
dock_widget->minBox->setValue(0);
|
||||||
|
dock_widget->maxBox->setRange(-1000, 1000);
|
||||||
|
dock_widget->maxBox->setValue(0);
|
||||||
|
}
|
||||||
else if(property_name == "Scaled Jacobian")
|
else if(property_name == "Scaled Jacobian")
|
||||||
{
|
{
|
||||||
dock_widget->minBox->setRange(-1000, 1000);
|
dock_widget->minBox->setRange(-1000, 1000);
|
||||||
|
|
@ -432,11 +449,15 @@ private:
|
||||||
dock_widget->propertyBox->addItems({"Smallest Angle Per Face",
|
dock_widget->propertyBox->addItems({"Smallest Angle Per Face",
|
||||||
"Largest Angle Per Face",
|
"Largest Angle Per Face",
|
||||||
"Scaled Jacobian",
|
"Scaled Jacobian",
|
||||||
"Face Area"});
|
"Face Area",
|
||||||
|
"Interpolated Corrected Mean Curvature",
|
||||||
|
"Interpolated Corrected Gaussian Curvature"});
|
||||||
property_simplex_types = { Property_simplex_type::FACE,
|
property_simplex_types = { Property_simplex_type::FACE,
|
||||||
Property_simplex_type::FACE,
|
Property_simplex_type::FACE,
|
||||||
Property_simplex_type::FACE,
|
Property_simplex_type::FACE,
|
||||||
Property_simplex_type::FACE };
|
Property_simplex_type::FACE,
|
||||||
|
Property_simplex_type::VERTEX,
|
||||||
|
Property_simplex_type::VERTEX };
|
||||||
detectSMScalarProperties(*(sm_item->face_graph()));
|
detectSMScalarProperties(*(sm_item->face_graph()));
|
||||||
}
|
}
|
||||||
else if(ps_item)
|
else if(ps_item)
|
||||||
|
|
@ -506,10 +527,15 @@ private:
|
||||||
{
|
{
|
||||||
CGAL_assertion(static_cast<std::size_t>(dock_widget->propertyBox->count()) == property_simplex_types.size());
|
CGAL_assertion(static_cast<std::size_t>(dock_widget->propertyBox->count()) == property_simplex_types.size());
|
||||||
|
|
||||||
|
const int property_index = dock_widget->propertyBox->currentIndex();
|
||||||
|
|
||||||
// leave it flat if it was, otherwise set to flat+edges
|
// leave it flat if it was, otherwise set to flat+edges
|
||||||
if(sm_item->renderingMode() != Flat && sm_item->renderingMode() != FlatPlusEdges)
|
if(sm_item->renderingMode() != Flat && sm_item->renderingMode() != FlatPlusEdges && property_simplex_types.at(property_index) == Property_simplex_type::FACE)
|
||||||
sm_item->setRenderingMode(FlatPlusEdges);
|
sm_item->setRenderingMode(FlatPlusEdges);
|
||||||
|
|
||||||
|
if(sm_item->renderingMode() != Gouraud && sm_item->renderingMode() != GouraudPlusEdges && property_simplex_types.at(property_index) == Property_simplex_type::VERTEX)
|
||||||
|
sm_item->setRenderingMode(GouraudPlusEdges);
|
||||||
|
|
||||||
const std::string& property_name = dock_widget->propertyBox->currentText().toStdString();
|
const std::string& property_name = dock_widget->propertyBox->currentText().toStdString();
|
||||||
if(property_name == "Smallest Angle Per Face")
|
if(property_name == "Smallest Angle Per Face")
|
||||||
{
|
{
|
||||||
|
|
@ -527,6 +553,14 @@ private:
|
||||||
{
|
{
|
||||||
displayArea(sm_item);
|
displayArea(sm_item);
|
||||||
}
|
}
|
||||||
|
else if(property_name == "Interpolated Corrected Mean Curvature")
|
||||||
|
{
|
||||||
|
displayCurvature(sm_item, MEAN_CURVATURE);
|
||||||
|
}
|
||||||
|
else if(property_name == "Interpolated Corrected Gaussian Curvature")
|
||||||
|
{
|
||||||
|
displayCurvature(sm_item, GAUSSIAN_CURVATURE);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const int property_index = dock_widget->propertyBox->currentIndex();
|
const int property_index = dock_widget->propertyBox->currentIndex();
|
||||||
|
|
@ -629,6 +663,8 @@ private:
|
||||||
removeDisplayPluginProperty(item, "f:display_plugin_largest_angle");
|
removeDisplayPluginProperty(item, "f:display_plugin_largest_angle");
|
||||||
removeDisplayPluginProperty(item, "f:display_plugin_scaled_jacobian");
|
removeDisplayPluginProperty(item, "f:display_plugin_scaled_jacobian");
|
||||||
removeDisplayPluginProperty(item, "f:display_plugin_area");
|
removeDisplayPluginProperty(item, "f:display_plugin_area");
|
||||||
|
removeDisplayPluginProperty(item, "f:display_plugin_mean_curvature");
|
||||||
|
removeDisplayPluginProperty(item, "f:display_plugin_gaussian_curvature");
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayExtremumAnglePerFace(Scene_surface_mesh_item* sm_item,
|
void displayExtremumAnglePerFace(Scene_surface_mesh_item* sm_item,
|
||||||
|
|
@ -809,6 +845,32 @@ private:
|
||||||
displaySMProperty<face_descriptor>("f:display_plugin_area", *sm);
|
displaySMProperty<face_descriptor>("f:display_plugin_area", *sm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void displayCurvature(Scene_surface_mesh_item* sm_item,
|
||||||
|
const CurvatureType curvature_type)
|
||||||
|
{
|
||||||
|
SMesh* sm = sm_item->face_graph();
|
||||||
|
if(sm == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
bool not_initialized;
|
||||||
|
std::string tied_string = (curvature_type == MEAN_CURVATURE) ?
|
||||||
|
"v:display_plugin_mean_curvature" : "v:display_plugin_gaussian_curvature";
|
||||||
|
|
||||||
|
SMesh::Property_map<vertex_descriptor, double> vcurvature;
|
||||||
|
std::tie(vcurvature, not_initialized) = sm->add_property_map<vertex_descriptor, double>(tied_string, 0);
|
||||||
|
|
||||||
|
if (curvature_type == MEAN_CURVATURE)
|
||||||
|
{
|
||||||
|
CGAL::Polygon_mesh_processing::interpolated_corrected_mean_curvature(*sm, vcurvature);
|
||||||
|
}
|
||||||
|
else if (curvature_type == GAUSSIAN_CURVATURE)
|
||||||
|
{
|
||||||
|
CGAL::Polygon_mesh_processing::interpolated_corrected_Gaussian_curvature(*sm, vcurvature);
|
||||||
|
}
|
||||||
|
|
||||||
|
displaySMProperty<vertex_descriptor>(tied_string, *sm);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<typename Functor>
|
template<typename Functor>
|
||||||
bool call_on_PS_property(const std::string& name,
|
bool call_on_PS_property(const std::string& name,
|
||||||
|
|
@ -964,6 +1026,10 @@ private:
|
||||||
zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_scaled_jacobian", extremum);
|
zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_scaled_jacobian", extremum);
|
||||||
else if(property_name == "Face Area")
|
else if(property_name == "Face Area")
|
||||||
zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_area", extremum);
|
zoomToSimplexWithPropertyExtremum(faces(mesh), mesh, "f:display_plugin_area", extremum);
|
||||||
|
else if(property_name == "Interpolated Corrected Mean Curvature")
|
||||||
|
zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, "v:display_plugin_mean_curvature", extremum);
|
||||||
|
else if(property_name == "Interpolated Corrected Gaussian Curvature")
|
||||||
|
zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, "v:display_plugin_gaussian_curvature", extremum);
|
||||||
else if(property_simplex_types.at(property_index) == Property_simplex_type::VERTEX)
|
else if(property_simplex_types.at(property_index) == Property_simplex_type::VERTEX)
|
||||||
zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, property_name, extremum);
|
zoomToSimplexWithPropertyExtremum(vertices(mesh), mesh, property_name, extremum);
|
||||||
else if(property_simplex_types.at(property_index) == Property_simplex_type::FACE)
|
else if(property_simplex_types.at(property_index) == Property_simplex_type::FACE)
|
||||||
|
|
@ -1298,7 +1364,10 @@ isSMPropertyScalar(const std::string& name,
|
||||||
if(name == "f:display_plugin_smallest_angle" ||
|
if(name == "f:display_plugin_smallest_angle" ||
|
||||||
name == "f:display_plugin_largest_angle" ||
|
name == "f:display_plugin_largest_angle" ||
|
||||||
name == "f:display_plugin_scaled_jacobian" ||
|
name == "f:display_plugin_scaled_jacobian" ||
|
||||||
name == "f:display_plugin_area")
|
name == "f:display_plugin_area" ||
|
||||||
|
name == "f:display_plugin_mean_curvature" ||
|
||||||
|
name == "f:display_plugin_gaussian_curvature")
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// the dispatch function does the filtering we want: if it founds a property
|
// the dispatch function does the filtering we want: if it founds a property
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue