40#include <OpenVolumeMesh/Core/TopologyKernel.hh>
41#include <OpenVolumeMesh/Attribs/StatusAttrib.hh>
43namespace OpenVolumeMesh {
45StatusAttrib::StatusAttrib(TopologyKernel& _kernel) :
47v_status_(_kernel.request_vertex_property<OpenVolumeMeshStatus>(
"vertex_status")),
48e_status_(_kernel.request_edge_property<OpenVolumeMeshStatus>(
"edge_status")),
49he_status_(_kernel.request_halfedge_property<OpenVolumeMeshStatus>(
"halfedge_status")),
50f_status_(_kernel.request_face_property<OpenVolumeMeshStatus>(
"face_status")),
51hf_status_(_kernel.request_halfface_property<OpenVolumeMeshStatus>(
"halfface_status")),
52c_status_(_kernel.request_cell_property<OpenVolumeMeshStatus>(
"cell_status")),
53m_status_(_kernel.request_mesh_property<OpenVolumeMeshStatus>(
"mesh_status")) {
59StatusAttrib::~StatusAttrib() {
65void StatusAttrib::mark_higher_dim_entities() {
68 if(kernel_->has_vertex_bottom_up_incidences()) {
70 for(VertexIter v_it = kernel_->vertices_begin(); v_it != kernel_->vertices_end(); ++v_it) {
71 if(v_status_[*v_it].deleted()) {
72 for(VertexOHalfEdgeIter voh_it = kernel_->voh_iter(*v_it);
73 voh_it.valid(); ++voh_it) {
74 e_status_[kernel_->edge_handle(*voh_it)].set_deleted(
true);
80 for(EdgeIter e_it = kernel_->edges_begin(); e_it != kernel_->edges_end(); ++e_it) {
81 if(v_status_[kernel_->edge(*e_it).from_vertex()].deleted() ||
82 v_status_[kernel_->edge(*e_it).to_vertex()].deleted()) {
83 e_status_[*e_it].set_deleted(
true);
89 if(kernel_->has_edge_bottom_up_incidences()) {
91 for(EdgeIter e_it = kernel_->edges_begin(); e_it != kernel_->edges_end(); ++e_it) {
92 if(e_status_[*e_it].deleted()) {
93 for(HalfEdgeHalfFaceIter hehf_it = kernel_->hehf_iter(kernel_->halfedge_handle(*e_it, 0));
94 hehf_it.valid(); ++hehf_it) {
95 f_status_[kernel_->face_handle(*hehf_it)].set_deleted(
true);
101 for(FaceIter f_it = kernel_->faces_begin(); f_it != kernel_->faces_end(); ++f_it) {
103 const std::vector<HalfEdgeHandle>& hes = kernel_->face(*f_it).halfedges();
104 for(std::vector<HalfEdgeHandle>::const_iterator he_it = hes.begin(),
105 he_end = hes.end(); he_it != he_end; ++he_it) {
106 if(e_status_[kernel_->edge_handle(*he_it)].deleted()) {
107 f_status_[*f_it].set_deleted(
true);
115 if(kernel_->has_face_bottom_up_incidences()) {
117 for(FaceIter f_it = kernel_->faces_begin(); f_it != kernel_->faces_end(); ++f_it) {
118 if(f_status_[*f_it].deleted()) {
119 CellHandle c0 = kernel_->incident_cell(kernel_->halfface_handle(*f_it, 0));
120 CellHandle c1 = kernel_->incident_cell(kernel_->halfface_handle(*f_it, 1));
122 c_status_[c0].set_deleted(
true);
125 c_status_[c1].set_deleted(
true);
131 for(CellIter c_it = kernel_->cells_begin(); c_it != kernel_->cells_end(); ++c_it) {
133 const std::vector<HalfFaceHandle>& hfs = kernel_->cell(*c_it).halffaces();
134 for(std::vector<HalfFaceHandle>::const_iterator hf_it = hfs.begin(),
135 hf_end = hfs.end(); hf_it != hf_end; ++hf_it) {
136 if(f_status_[kernel_->face_handle(*hf_it)].deleted()) {
137 c_status_[*c_it].set_deleted(
true);
147void StatusAttrib::garbage_collection(
bool _preserveManifoldness) {
148 std::vector<VertexHandle*> vh_empty;
149 std::vector<HalfEdgeHandle*> hh_empty;
150 std::vector<HalfFaceHandle*> hfh_empty;
151 std::vector<CellHandle*> ch_empty;
153 garbage_collection(vh_empty, hh_empty, hfh_empty, ch_empty, _preserveManifoldness);