From b2bf191cf654cf68d2de22277b0c5d428fc4ecc0 Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Wed, 15 Sep 2010 22:50:14 +0000 Subject: [PATCH] added transfer of selection from vertices to faces and back --- .../filter_select/meshselect.cpp | 62 +++++++++++++------ src/meshlabplugins/filter_select/meshselect.h | 2 + 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/meshlabplugins/filter_select/meshselect.cpp b/src/meshlabplugins/filter_select/meshselect.cpp index 809e0f4c5..98531b58a 100644 --- a/src/meshlabplugins/filter_select/meshselect.cpp +++ b/src/meshlabplugins/filter_select/meshselect.cpp @@ -39,6 +39,8 @@ SelectionFilterPlugin::SelectionFilterPlugin() FP_SELECT_DELETE_VERT << FP_SELECT_DELETE_FACE << FP_SELECT_DELETE_FACEVERT << + FP_SELECT_FACE_FROM_VERT << + FP_SELECT_VERT_FROM_FACE << FP_SELECT_ERODE << FP_SELECT_DILATE << FP_SELECT_BORDER << @@ -75,24 +77,25 @@ SelectionFilterPlugin::SelectionFilterPlugin() { switch(filter) { - case FP_SELECT_ALL : return QString("Select All"); - case FP_SELECT_NONE : return QString("Select None"); - case FP_SELECT_INVERT : return QString("Invert Selection"); - case FP_SELECT_DELETE_VERT : return QString("Delete Selected Vertices"); - case FP_SELECT_DELETE_FACE : return QString("Delete Selected Faces"); - case FP_SELECT_DELETE_FACEVERT : return QString("Delete Selected Faces and Vertices"); - case FP_SELECT_ERODE : return QString("Erode Selection"); - case FP_SELECT_DILATE : return QString("Dilate Selection"); - case FP_SELECT_BORDER: return QString("Select Border Faces"); - case FP_SELECT_BY_VERT_QUALITY : return QString("Select by Vertex Quality"); + case FP_SELECT_ALL : return QString("Select All"); + case FP_SELECT_NONE : return QString("Select None"); + case FP_SELECT_INVERT : return QString("Invert Selection"); + case FP_SELECT_DELETE_VERT : return QString("Delete Selected Vertices"); + case FP_SELECT_DELETE_FACE : return QString("Delete Selected Faces"); + case FP_SELECT_DELETE_FACEVERT : return QString("Delete Selected Faces and Vertices"); + case FP_SELECT_FACE_FROM_VERT : return QString("Select Faces from Vertices"); + case FP_SELECT_VERT_FROM_FACE : return QString("Select Vertices from Faces"); + case FP_SELECT_ERODE : return QString("Erode Selection"); + case FP_SELECT_DILATE : return QString("Dilate Selection"); + case FP_SELECT_BORDER: return QString("Select Border Faces"); + case FP_SELECT_BY_VERT_QUALITY : return QString("Select by Vertex Quality"); case FP_SELECT_BY_FACE_QUALITY : return QString("Select by Face Quality"); - case FP_SELECT_BY_RANGE: return QString("Select by Coord range"); - case FP_SELECT_BY_COLOR: return QString("Select Face by Vertex Color"); + case FP_SELECT_BY_RANGE: return QString("Select by Coord Range"); + case FP_SELECT_BY_COLOR: return QString("Select Face by Vertex Color"); case CP_SELFINTERSECT_SELECT: return QString("Self Intersecting Faces"); - case CP_SELECT_TEXBORDER: return QString("Select Vertex Texture Seams"); - case CP_SELECT_NON_MANIFOLD_FACE: return QString("Select non Manifold Edges "); - case CP_SELECT_NON_MANIFOLD_VERTEX: return QString("Select non Manifold Vertices"); - + case CP_SELECT_TEXBORDER: return QString("Select Vertex Texture Seams"); + case CP_SELECT_NON_MANIFOLD_FACE: return QString("Select non Manifold Edges "); + case CP_SELECT_NON_MANIFOLD_VERTEX: return QString("Select non Manifold Vertices"); } return QString("Unknown filter"); } @@ -105,6 +108,8 @@ SelectionFilterPlugin::SelectionFilterPlugin() case FP_SELECT_DELETE_FACE : return tr("Delete the current set of selected faces, vertices that remains unreferenced are not deleted."); case FP_SELECT_DELETE_FACEVERT : return tr("Delete the current set of selected faces and all the vertices surrounded by that faces."); case CP_SELFINTERSECT_SELECT: return tr("Select only self intersecting faces."); + case FP_SELECT_FACE_FROM_VERT : return QString("Select faces from selected vertices"); + case FP_SELECT_VERT_FROM_FACE : return QString("Select vertices from selected faces"); case FP_SELECT_ERODE : return tr("Erode (reduce) the current set of selected faces"); case FP_SELECT_INVERT : return tr("Invert the current set of selected faces"); case FP_SELECT_NONE : return tr("Clear the current set of selected faces"); @@ -127,6 +132,13 @@ void SelectionFilterPlugin::initParameterSet(QAction *action, MeshModel &m, Rich { switch(ID(action)) { + case FP_SELECT_FACE_FROM_VERT: + parlst.addParam(new RichBool("Inclusive", true, "Inclusive Sel.", "If true only the faces with all selected vertices are selected. Otherwise any face with at least one selected vertex will be selected.")); + break; + case FP_SELECT_VERT_FROM_FACE: + parlst.addParam(new RichBool("Inclusive", true, "Inclusive Sel.", "If true only the vertices with all the incident face selected are selected. Otherwise any vertex with at least one incident selected face will be selected.")); + break; + case FP_SELECT_BY_VERT_QUALITY: { std::pair minmax = tri::Stat::ComputePerVertexQualityMinMax(m.cm); @@ -215,10 +227,20 @@ bool SelectionFilterPlugin::applyFilter(QAction *action, MeshDocument &md, RichP tri::UpdateSelection::InvertVertex(m.cm); if (par.getBool("InvFaces")) tri::UpdateSelection::InvertFace(m.cm); break; - case FP_SELECT_ERODE : tri::UpdateSelection::VertexFromFaceStrict(m.cm); - tri::UpdateSelection::FaceFromVertexStrict(m.cm); + case FP_SELECT_VERT_FROM_FACE : + if(par.getBool("Inclusive")) + tri::UpdateSelection::VertexFromFaceStrict(m.cm); + else tri::UpdateSelection::VertexFromFaceLoose(m.cm); break; - case FP_SELECT_DILATE : tri::UpdateSelection::VertexFromFaceLoose(m.cm); + case FP_SELECT_FACE_FROM_VERT : + if(par.getBool("Inclusive")) + tri::UpdateSelection::FaceFromVertexStrict(m.cm); + else tri::UpdateSelection::FaceFromVertexLoose(m.cm); + break; + case FP_SELECT_ERODE : tri::UpdateSelection::VertexFromFaceStrict(m.cm); + tri::UpdateSelection::FaceFromVertexStrict(m.cm); + break; + case FP_SELECT_DILATE : tri::UpdateSelection::VertexFromFaceLoose(m.cm); tri::UpdateSelection::FaceFromVertexLoose(m.cm); break; case FP_SELECT_BORDER: tri::UpdateSelection::FaceFromBorderFlag(m.cm); @@ -356,6 +378,8 @@ int SelectionFilterPlugin::postCondition(QAction *action) const switch(ID(action)) { case FP_SELECT_ALL: + case FP_SELECT_FACE_FROM_VERT: + case FP_SELECT_VERT_FROM_FACE: case FP_SELECT_NONE: case FP_SELECT_INVERT: case FP_SELECT_ERODE: diff --git a/src/meshlabplugins/filter_select/meshselect.h b/src/meshlabplugins/filter_select/meshselect.h index 733c45983..05d53c3b9 100644 --- a/src/meshlabplugins/filter_select/meshselect.h +++ b/src/meshlabplugins/filter_select/meshselect.h @@ -42,6 +42,8 @@ class SelectionFilterPlugin : public QObject, public MeshFilterInterface FP_SELECT_ALL, FP_SELECT_NONE, FP_SELECT_INVERT, + FP_SELECT_FACE_FROM_VERT, + FP_SELECT_VERT_FROM_FACE, FP_SELECT_DELETE_VERT, FP_SELECT_DELETE_FACE, FP_SELECT_DELETE_FACEVERT,