43 #include "MeshObjectSelectionPlugin.hh" 46 #include <OpenMesh/Core/Geometry/MathDefs.hh> 56 template<
typename MeshT>
62 typename MeshT::VertexIter v_it, v_end=_mesh->vertices_end();
64 for(v_it=_mesh->vertices_begin(); v_it!=v_end; ++v_it) {
65 if(_mesh->status(*v_it).selected()) {
66 _mesh->delete_vertex(*v_it);
73 typename MeshT::EdgeIter e_it, e_end(_mesh->edges_end());
75 for(e_it=_mesh->edges_begin(); e_it!=e_end; ++e_it) {
76 if(_mesh->status(*e_it).selected()) {
77 _mesh->delete_edge(*e_it);
84 typename MeshT::FaceIter f_it, f_end(_mesh->faces_end());
86 for(f_it=_mesh->faces_begin(); f_it!=f_end; ++f_it) {
87 if(_mesh->status(*f_it).selected()) {
88 _mesh->delete_face(*f_it);
94 _mesh->garbage_collection();
105 template<
typename MeshType>
109 typename MeshType::FaceIter f_it, f_end=_mesh->faces_end();
110 typename MeshType::FaceVertexIter fv_it;
111 typename MeshType::VertexHandle v0, v1, v2;
113 for(f_it=_mesh->faces_begin(); f_it!=f_end; ++f_it) {
114 fv_it = _mesh->fv_iter(*f_it);
119 const bool a =(_mesh->status(v0).is_bit_set(AREA)|| _mesh->status(v1).is_bit_set(AREA)|| _mesh->status(v2).is_bit_set(AREA));
120 bool h =(_mesh->status(v0).is_bit_set(HANDLEAREA)&&
121 _mesh->status(v1).is_bit_set(HANDLEAREA)&&
122 _mesh->status(v2).is_bit_set(HANDLEAREA));
125 if(_mesh->status(v0).is_bit_set(HANDLEAREA)||
126 _mesh->status(v1).is_bit_set(HANDLEAREA)||
127 _mesh->status(v2).is_bit_set(HANDLEAREA))
130 _mesh->status(*f_it).change_bit(AREA , a);
131 _mesh->status(*f_it).change_bit(HANDLEAREA, h);
145 template<
class MeshT>
148 typename MeshT::FaceHandle fh = _mesh->face_handle(_fh);
156 typename MeshT::FaceVertexIter fv_it(*_mesh, fh);
157 typename MeshT::VertexHandle closest = *fv_it;
158 typename MeshT::Scalar shortest_distance =(_mesh->point(closest)- _hit_point).sqrnorm();
161 if((_mesh->point(*fv_it)- _hit_point).sqrnorm()<shortest_distance) {
162 shortest_distance =(_mesh->point(*fv_it)- _hit_point).sqrnorm();
168 }
while( fv_it.is_valid() );
170 _mesh->status(closest).set_selected(!_mesh->status(closest).selected());
172 if(_mesh->status(closest).selected())
173 emit scriptInfo(
"selectVertices(ObjectId(" + QString::number(_objectId) +
") , [" + QString::number(closest.idx())+
"])");
175 emit scriptInfo(
"unselectVertices(ObjectId(" + QString::number(_objectId) +
") , [" + QString::number(closest.idx())+
"])");
182 typename MeshT::FaceHalfedgeIter fhe_it(*_mesh, fh);
184 typename MeshT::HalfedgeHandle closest(-1);
185 typename MeshT::Scalar closest_dist(-1);
187 typename MeshT::Point pp =(
typename MeshT::Point)_hit_point;
189 for(; fhe_it.is_valid(); ++fhe_it) {
194 typename MeshT::Point lp0 = _mesh->point(_mesh->to_vertex_handle (*fhe_it));
195 typename MeshT::Point lp1 = _mesh->point(_mesh->from_vertex_handle(*fhe_it));
199 if(dist_new <closest_dist || closest_dist == -1) {
202 closest_dist = dist_new;
207 typename MeshT::EdgeHandle closest_eh = _mesh->edge_handle(closest);
209 if(_primitiveType & edgeType_) {
211 _mesh->status(closest_eh).set_selected(!_mesh->status(closest_eh).selected());
213 if(_mesh->status(closest_eh).selected())
214 emit scriptInfo(
"selectEdges(ObjectId(" + QString::number(_objectId) +
") , [" + QString::number(closest_eh.idx())+
"])");
216 emit scriptInfo(
"unselectEdges(ObjectId(" + QString::number(_objectId) +
") , [" + QString::number(closest_eh.idx())+
"])");
219 _mesh->status(closest).set_selected(!_mesh->status(closest).selected());
221 if(_mesh->status(closest).selected())
222 emit scriptInfo(
"selectHalfedges(ObjectId(" + QString::number(_objectId) +
") , [" + QString::number(closest.idx())+
"])");
224 emit scriptInfo(
"unselectHalfedges(ObjectId(" + QString::number(_objectId) +
") , [" + QString::number(closest.idx())+
"])");
231 _mesh->status(fh).set_selected(!_mesh->status(fh).selected());
233 if(_mesh->status(fh).selected())
234 emit scriptInfo(
"selectFaces(ObjectId(" + QString::number(_objectId) +
") , [" + QString::number(fh.idx())+
"])");
236 emit scriptInfo(
"unselectFaces(ObjectId(" + QString::number(_objectId) +
") , [" + QString::number(fh.idx())+
"])");
253 template <
class MeshT>
257 typename MeshT::Point _hitpoint,
259 PrimitiveType _primitiveType,
263 const float sqr_radius = _radius * _radius;
266 const bool sel = !_deselection;
269 std::set< typename MeshT::FaceHandle > visited;
271 typename MeshT::FaceHandle hitface = _mesh->face_handle(_target_idx);
273 if(!hitface.is_valid())
276 visited.insert(hitface);
279 std::vector<typename MeshT::FaceHandle> face_handles;
280 face_handles.reserve(50);
281 face_handles.push_back(hitface);
285 while(!face_handles.empty()) {
286 typename MeshT::FaceHandle fh = face_handles.back();
288 face_handles.pop_back();
292 unsigned int fVertices = 0;
295 std::vector<typename MeshT::EdgeHandle> edge_handles;
297 for(
typename MeshT::FaceHalfedgeIter fh_it(*_mesh,fh); fh_it.is_valid(); ++fh_it) {
299 const typename MeshT::VertexHandle vh = _mesh->from_vertex_handle(*fh_it);
301 if((_mesh->point(vh) - _hitpoint).sqrnorm() <= sqr_radius) {
305 _mesh->status(vh).set_selected(sel);
308 if((_mesh->point(_mesh->to_vertex_handle(*fh_it))- _hitpoint).sqrnorm()<= sqr_radius)
309 edge_handles.push_back(_mesh->edge_handle(*fh_it));
320 for(
size_t i=0; i < edge_handles.size(); i++) {
322 if(!_mesh->has_face_normals() || std::abs(_mesh->calc_dihedral_angle_fast(edge_handles[i])) >=
dihedral_angle_threshold_)
324 _mesh->status( _mesh->halfedge_handle(edge_handles[i],0) ).set_selected(sel) ;
325 _mesh->status( _mesh->halfedge_handle(edge_handles[i],1) ).set_selected(sel) ;
328 if (_primitiveType & edgeType_)
329 if(!_mesh->has_face_normals() || std::abs(_mesh->calc_dihedral_angle_fast(edge_handles[i])) >=
dihedral_angle_threshold_)
330 _mesh->status(edge_handles[i]).set_selected(sel);
338 if( _mesh->valence(fh ) == fVertices) {
339 _mesh->status(fh).set_selected(sel);
347 for(
typename MeshT::FaceFaceIter ff_it(*_mesh,fh); ff_it.is_valid(); ++ff_it) {
348 if ( visited.count(*ff_it) == 0 )
349 face_handles.push_back(*ff_it);
373 emit updatedObject(_objectId, update);
389 template<
class MeshT>
391 PrimitiveType _primitiveType,
bool _deselection) {
396 typename MeshT::VertexIter v_it, v_end(_mesh->vertices_end());
397 for(v_it=_mesh->vertices_begin(); v_it!=v_end; ++v_it)
398 _mesh->status(*v_it).set_tagged(
false);
401 for(v_it=_mesh->vertices_begin(); v_it!=v_end; ++v_it) {
403 proj = _state.
project(_mesh->point(*v_it));
405 if(_region->contains(QPoint((
int)proj[0], _state.
context_height()- (int)proj[1]))) {
407 _mesh->status(*v_it).set_tagged(
true);
410 _mesh->status(*v_it).set_selected(!_deselection);
417 typename MeshT::EdgeIter e_it, e_end(_mesh->edges_end());
418 for(e_it=_mesh->edges_begin(); e_it!=e_end; ++e_it) {
420 if(_mesh->status(_mesh->to_vertex_handle(_mesh->halfedge_handle(*e_it, 0))).tagged()||
421 _mesh->status(_mesh->to_vertex_handle(_mesh->halfedge_handle(*e_it, 1))).tagged()) {
423 if(_primitiveType & edgeType_)
425 _mesh->status(*e_it).set_selected(!_deselection);
427 if(_primitiveType & halfedgeType_)
430 _mesh->status(_mesh->halfedge_handle(*e_it,0)).set_selected(!_deselection);
431 _mesh->status(_mesh->halfedge_handle(*e_it,1)).set_selected(!_deselection);
438 typename MeshT::FaceIter f_it, f_end(_mesh->faces_end());
439 for(f_it=_mesh->faces_begin(); f_it!=f_end; ++f_it) {
442 for(
typename MeshT::FaceVertexIter fv_it(*_mesh,*f_it); fv_it.is_valid(); ++fv_it)
443 if(_mesh->status(*fv_it).tagged())
447 _mesh->status(*f_it).set_selected(!_deselection);
453 if(_primitiveType & edgeType_)
455 if(_primitiveType & halfedgeType_)
457 if(_primitiveType & faceType_)
472 template<
class MeshT>
475 typename MeshT::VertexHandle vh = _mesh->vertex_handle(_vh);
479 typename MeshT::VertexHandle vhBound = MeshNavigation::findClosestBoundary(_mesh , vh);
480 if(vhBound.is_valid()) {
484 if(!_mesh->get_property_handle(visited,
"Visited Vertices"))
485 _mesh->add_property(visited,
"Visited Vertices");
487 typename MeshT::VertexIter v_it, v_end = _mesh->vertices_end();
488 for(v_it = _mesh->vertices_begin(); v_it != v_end; ++v_it)
489 _mesh->property(visited, *v_it)=
false;
491 std::stack<typename MeshT::VertexHandle> stack;
494 while(!stack.empty()) {
496 typename MeshT::VertexHandle vh = stack.top();
499 if(_mesh->property(visited,vh))
503 for(
typename MeshT::VertexOHalfedgeIter voh_it(*_mesh,vh); voh_it.is_valid(); ++voh_it) {
505 if(_mesh->is_boundary(_mesh->edge_handle(*voh_it))) {
507 stack.push(_mesh->to_vertex_handle(*voh_it));
510 _mesh->status(_mesh->edge_handle(*voh_it)).set_selected(!_deselection);
513 typename MeshT::HalfedgeHandle heh = *voh_it;
514 if(!_mesh->is_boundary(heh))heh = _mesh->opposite_halfedge_handle(heh);
515 _mesh->status(heh).set_selected(!_deselection);
520 typename MeshT::FaceHandle f1 = _mesh->face_handle(*voh_it);
521 typename MeshT::FaceHandle f2 = _mesh->face_handle(_mesh->opposite_halfedge_handle(*voh_it));
522 if(f1.is_valid())_mesh->status(f1).set_selected(!_deselection);
523 if(f2.is_valid())_mesh->status(f2).set_selected(!_deselection);
527 _mesh->property(visited,vh)=
true;
530 _mesh->status(vh).set_selected(!_deselection);
532 _mesh->remove_property(visited);
536 emit log(
LOGERR, tr(
"Unable to find boundary."));
539 emit log(
LOGERR, tr(
"Invalid vertex handle."));
554 template<
class MeshT>
556 MeshT* _mesh,
int _objectId, uint _fh,
double _maxAngle,
557 PrimitiveType _primitiveTypes,
bool _deselection) {
560 typename MeshT::FaceIter f_it, f_end(_mesh->faces_end());
561 for (f_it=_mesh->faces_begin(); f_it!=f_end; ++f_it)
562 _mesh->status(*f_it).set_tagged(
false);
564 std::vector<typename MeshT::FaceHandle> face_handles;
567 typename MeshT::FaceHandle hitFace =
typename MeshT::FaceHandle(_fh);
568 face_handles.reserve(50);
569 face_handles.push_back(hitFace);
570 _mesh->status(hitFace).set_tagged(
true);
572 typename MeshT::Point n1 = _mesh->normal(hitFace);
574 double maxAngle = OpenMesh::deg_to_rad(_maxAngle);
576 while (!face_handles.empty()) {
577 typename MeshT::FaceHandle fh = face_handles.back();
578 face_handles.pop_back();
580 for (
typename MeshT::FaceFaceIter ff_it(*_mesh,fh) ; ff_it.is_valid() ; ++ff_it) {
583 if (_mesh->status(*ff_it).tagged())
586 typename MeshT::Point n2 = _mesh->normal(*ff_it);
588 double angle = acos(n1 | n2);
590 if (angle <= maxAngle) {
591 _mesh->status(*ff_it).set_tagged(
true);
592 face_handles.push_back(*ff_it);
598 for (f_it=_mesh->faces_begin(); f_it!=f_end; ++f_it) {
599 if (_mesh->status(*f_it).tagged()) {
602 for (
typename MeshT::FaceVertexIter fv_it(*_mesh,*f_it) ; fv_it.is_valid(); ++fv_it)
603 _mesh->status(*fv_it).set_selected(!_deselection);
607 for (
typename MeshT::FaceEdgeIter fe_it(*_mesh,*f_it) ; fe_it.is_valid(); ++fe_it)
608 _mesh->status(*fe_it).set_selected(!_deselection);
612 for (
typename MeshT::FaceHalfedgeIter fhe_it(*_mesh,*f_it) ; fhe_it.is_valid(); ++fhe_it)
613 _mesh->status(*fhe_it).set_selected(!_deselection);
617 _mesh->status(*f_it).set_selected(!_deselection);
643 template<
class MeshT>
645 MeshT* _mesh,
int _objectId, uint _fh,
ACG::Vec3d& _hit_point,
646 PrimitiveType _primitiveType) {
648 typename MeshT::FaceHandle fh = _mesh->face_handle(_fh);
657 _mesh->add_property(visited);
659 typename MeshT::VertexIter v_it;
660 typename MeshT::VertexIter v_end = _mesh->vertices_end();
663 for (v_it = _mesh->vertices_begin(); v_it != v_end; ++v_it)
664 _mesh->property(visited, *v_it) =
false;
667 typename MeshT::VertexHandle current = *(_mesh->fv_iter(fh));
668 if(!current.is_valid())
671 std::set<typename MeshT::VertexHandle> unprocessed;
672 unprocessed.insert(current);
674 while( !unprocessed.empty() ) {
677 current = *unprocessed.begin();
678 _mesh->status(current).set_selected(!(_mesh->status(current)).selected());
679 _mesh->property(visited, current) =
true;
680 unprocessed.erase(current);
683 for(
typename MeshT::VertexVertexIter vv_it = _mesh->vv_iter(current); vv_it.is_valid(); ++vv_it) {
684 if(_mesh->property(visited, *vv_it) ==
true)
continue;
685 unprocessed.insert(*vv_it);
690 _mesh->remove_property(visited);
697 _mesh->add_property(visited);
699 typename MeshT::FaceIter f_it;
700 typename MeshT::FaceIter f_end = _mesh->faces_end();
703 for (f_it = _mesh->faces_begin(); f_it != f_end; ++f_it)
704 _mesh->property(visited, *f_it) =
false;
707 typename MeshT::FaceHandle current = fh;
709 std::set<typename MeshT::FaceHandle> unprocessed;
710 unprocessed.insert(current);
712 typename MeshT::EdgeHandle firstEdge = *(_mesh->fe_iter(fh));
713 if(!firstEdge.is_valid())
return;
714 bool selected = _mesh->status(firstEdge).selected();
716 while( !unprocessed.empty() ) {
719 current = *unprocessed.begin();
720 for(
typename MeshT::FaceHalfedgeIter fh_it = _mesh->fh_iter(current); fh_it.is_valid(); ++fh_it) {
721 if(_primitiveType & halfedgeType_) {
722 _mesh->status(*fh_it).set_selected(!(_mesh->status(*fh_it)).selected());
724 if(_primitiveType & edgeType_) {
725 _mesh->status(_mesh->edge_handle(*fh_it)).set_selected(!selected);
729 _mesh->property(visited, current) =
true;
730 unprocessed.erase(current);
733 for(
typename MeshT::FaceFaceIter ff_it = _mesh->ff_iter(current); ff_it.is_valid(); ++ff_it) {
734 if(_mesh->property(visited, *ff_it) ==
true)
continue;
735 unprocessed.insert(*ff_it);
740 _mesh->remove_property(visited);
747 _mesh->add_property(visited);
749 typename MeshT::FaceIter f_it;
750 typename MeshT::FaceIter f_end = _mesh->faces_end();
753 for (f_it = _mesh->faces_begin(); f_it != f_end; ++f_it)
754 _mesh->property(visited, *f_it) =
false;
757 typename MeshT::FaceHandle current = fh;
759 std::set<typename MeshT::FaceHandle> unprocessed;
760 unprocessed.insert(current);
762 while( !unprocessed.empty() ) {
765 current = *unprocessed.begin();
766 _mesh->status(current).set_selected(!(_mesh->status(current)).selected());
767 _mesh->property(visited, current) =
true;
768 unprocessed.erase(current);
771 for(
typename MeshT::FaceFaceIter ff_it = _mesh->ff_iter(current); ff_it.is_valid(); ++ff_it) {
772 if(_mesh->property(visited, *ff_it) ==
true)
continue;
773 unprocessed.insert(*ff_it);
778 _mesh->remove_property(visited);
780 if(_primitiveType & vertexType_)
782 if(_primitiveType & edgeType_)
784 if(_primitiveType & halfedgeType_)
786 if(_primitiveType & faceType_)
801 template<
typename MeshT >
803 PrimitiveType _primitiveTypes,
817 typename MeshT::VertexIter v_it, v_end=_mesh->vertices_end();
820 if ( !_mesh->has_vertex_colors() )
821 _mesh->request_vertex_colors();
823 for (v_it=_mesh->vertices_begin(); v_it!=v_end; ++v_it)
824 if ( _mesh->status(*v_it).selected() )
825 _mesh->set_color(*v_it, color);
829 typename MeshT::FaceIter f_it, f_end( _mesh->faces_end() );
832 if ( !_mesh->has_face_colors() )
833 _mesh->request_face_colors();
835 for (f_it=_mesh->faces_begin(); f_it!=f_end; ++f_it)
836 if ( _mesh->status(*f_it).selected() )
837 _mesh->set_color(*f_it, color);
841 typename MeshT::EdgeIter e_it, e_end( _mesh->edges_end() );
844 if ( !_mesh->has_edge_colors() )
845 _mesh->request_edge_colors();
847 for (e_it=_mesh->edges_begin(); e_it!=e_end; ++e_it)
848 if ( _mesh->status(*e_it).selected() )
849 _mesh->set_color(*e_it, color);
853 typename MeshT::HalfedgeIter h_it, h_end( _mesh->halfedges_end() );
856 if ( !_mesh->has_halfedge_colors() )
857 _mesh->request_halfedge_colors();
859 for (h_it=_mesh->halfedges_begin(); h_it!=h_end; ++h_it)
860 if ( _mesh->status(*h_it).selected() )
861 _mesh->set_color(*h_it, color);
875 template<
class MeshT>
881 _mesh.add_property(copyHandle,
"copyHandle Property");
884 typename MeshT::VertexIter v_it, v_end = _mesh.vertices_end();
885 for (v_it = _mesh.vertices_begin(); v_it != v_end; ++v_it) {
891 copy = _mesh.status(*v_it).selected();
894 for (
typename MeshT::VertexOHalfedgeIter voh_it(_mesh, *v_it); voh_it.is_valid(); ++voh_it)
895 if (_mesh.status(_mesh.edge_handle(*voh_it)).selected()) {
901 for (
typename MeshT::VertexFaceIter vf_it(_mesh, *v_it); vf_it.is_valid(); ++vf_it)
902 if (_mesh.status(*vf_it).selected()) {
910 _mesh.property(copyHandle, *v_it) = _newMesh.add_vertex(_mesh.point(*v_it));
912 _mesh.property(copyHandle, *v_it) =
typename MeshT::VertexHandle(-1);
918 typename MeshT::FaceIter f_it, f_end = _mesh.faces_end();
919 for (f_it = _mesh.faces_begin(); f_it != f_end; ++f_it) {
921 std::vector<typename MeshT::VertexHandle> v;
925 for (
typename MeshT::FaceVertexIter fv_it(_mesh, *f_it); fv_it.is_valid(); ++fv_it)
926 if (_mesh.property(copyHandle, *fv_it).is_valid())
927 v.push_back(_mesh.property(copyHandle, *fv_it));
934 _newMesh.add_face(v);
937 _newMesh.update_normals();
939 _mesh.remove_property(copyHandle);
943 template<
class MeshT>
948 typename MeshT::VertexIter v_it, v_end = _mesh->vertices_end();
949 for (v_it = _mesh->vertices_begin(); v_it != v_end; ++v_it) {
950 const typename MeshT::Point p = _mesh->point(*v_it);
954 if (_component.contains(
"x",Qt::CaseInsensitive) ) {
955 select = (p[0] > _value);
956 }
else if (_component.contains(
"y",Qt::CaseInsensitive) ) {
957 select = (p[1] > _value);
958 }
else if (_component.contains(
"z",Qt::CaseInsensitive) ) {
959 select = (p[2] > _value);
961 emit log(
LOGERR,tr(
"selectVerticesByValue, undefined component ") + _component );
970 if ( ! _mesh->status(*v_it).selected() )
971 _mesh->status(*v_it).set_selected(select);
const UpdateType UPDATE_SELECTION_VERTICES(UpdateTypeSet(1)<< 5)
Vertex selection has changed.
SelectionInterface::PrimitiveType faceType_
Handle to selection environment.
void update_regions(MeshT *_mesh)
Update face selection to correspond to the vertex selection.
VectorT< float, 4 > Vec4f
SelectionInterface::PrimitiveType vertexType_
Primitive type handles:
bool volumeSelection(MeshT *_mesh, int _objectId, ACG::GLState &_state, QRegion *_region, PrimitiveType _primitiveTypes, bool _deselection)
Surface volume selection tool.
int context_height() const
get gl context height
void createMeshFromSelection(MeshT &_mesh, MeshT &_newMesh, PrimitiveType _primitiveType)
Create a new mesh from the selection.
bool deleteSelection(MeshT *_mesh, PrimitiveType _primitiveType)
Delete all selected elements of a mesh.
Add colors to mesh item (vertices/faces/edges)
void colorizeSelection(MeshT *_mesh, PrimitiveType _primitiveTypes, int _red, int _green, int _blue, int _alpha)
Colorize the selection.
void selectVerticesByValue(int _objectId, QString _component, bool _greater, double _value)
Select vertices by their value.
Functions for getting information about a mesh.
void closestBoundarySelection(MeshT *_mesh, int _vh, PrimitiveType _primitiveTypes, bool _deselection)
Select all entities that are incident to closest boundary.
Vec::value_type distPointLineSquared(const Vec &_p, const Vec &_v0, const Vec &_v1, Vec *_min_v)
squared distance from point _p to line segment (_v0,_v1)
void toggleMeshSelection(int _objectId, MeshT *_mesh, uint _fh, ACG::Vec3d &_hit_point, PrimitiveType _primitiveType)
Toggle mesh selection.
const UpdateType UPDATE_NONE(UpdateTypeSet(0))
Empty update for empty initialization of update type.
SelectionInterface::PrimitiveType edgeType_
Handle to selection environment.
void update_dihedral_angle_threshold_from_ui()
set dihedral angle threshold for edge selection
Vec3d project(const Vec3d &_point) const
project point in world coordinates to window coordinates
void componentsMeshSelection(MeshT *_mesh, int _objectId, uint _fh, ACG::Vec3d &_hit_point, PrimitiveType _primitiveType)
Connected component mesh selection.
VectorT< unsigned char, 4 > Vec4uc
const UpdateType UPDATE_SELECTION_HALFEDGES(UpdateTypeSet(1)<< 7)
Halfedge selection has changed.
void floodFillSelection(MeshT *_mesh, int _objectId, uint _fh, double _maxAngle, PrimitiveType _primitiveTypes, bool _deselection)
Select all entities that are connected (and do not exceed the maximum dihedral angle) ...
void paintSphereSelection(MeshT *_mesh, int _objectId, int _target_idx, typename MeshT::Point _hitpoint, double _radius, PrimitiveType _primitiveTypes, bool _deselection)
Use the event to paint selection with a sphere.
const UpdateType UPDATE_SELECTION_EDGES(UpdateTypeSet(1)<< 6)
Edge selection has changed.
const UpdateType UPDATE_SELECTION_FACES(UpdateTypeSet(1)<< 8)
Face selection has changed.
double dihedral_angle_threshold_
Handle to selection environment.
SelectionInterface::PrimitiveType halfedgeType_
Handle to selection environment.