Author: janehu Date: 2008-05-01 14:37:56 -0500 (Thu, 01 May 2008) New Revision: 1788 Modified: cgm/trunk/geom/OCC/OCCQueryEngine.cpp cgm/trunk/geom/OCC/OCCQueryEngine.hpp cgm/trunk/geom/OCC/OCCSurface.hpp Log: Made progress on clearing up coedges, so the bodies built correcty without any free-entities left, the delete code still need to be debugged, after deleting body, free-entities left. Modified: cgm/trunk/geom/OCC/OCCQueryEngine.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2008-04-30 18:36:10 UTC (rev 1787) +++ cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2008-05-01 19:37:56 UTC (rev 1788) @@ -1224,6 +1224,7 @@ OCCCoFace * coface = new OCCCoFace( occ_surface, shell, ( topo_face.Orientation()== TopAbs_FORWARD ? CUBIT_FORWARD : CUBIT_REVERSED)); cofaces.append(coface); + occ_surface->add_shell(shell); if(standalone) occ_surface->set_shell(shell); @@ -1411,12 +1412,12 @@ Surface* ref_face_ptr = CAST_TO(ref_entity_ptr, Surface); if (ref_face_ptr != NULL) { - if (remove_lower_entities) - return ( this->delete_solid_model_entities(ref_face_ptr) ); - CubitStatus stat = this->unhook_Surface_from_OCC(ref_face_ptr); - if(stat) - delete ref_face_ptr; - return stat; + if (remove_lower_entities) + return ( this->delete_solid_model_entities(ref_face_ptr) ); + CubitStatus stat = this->unhook_Surface_from_OCC(ref_face_ptr); + if(stat) + delete ref_face_ptr; + return stat; } // Curve @@ -1446,27 +1447,6 @@ } -CubitStatus -OCCQueryEngine::delete_solid_model_entities(TopologyBridge* tb) const -{ - BodySM* body = CAST_TO(tb, BodySM); - if(body) - return delete_solid_model_entities(body); - - Surface* surface = CAST_TO(tb, Surface); - if (surface) - return delete_solid_model_entities(surface); - - Curve* curve = CAST_TO(tb, Curve); - if (curve) - return delete_solid_model_entities(curve); - - Point* point = CAST_TO(tb, Point); - if(point) - return delete_solid_model_entities(point); - - return CUBIT_FAILURE; -} //------------------------------------------------------------------------- // Purpose : Delete a OCCBody and child entities. // @@ -1506,8 +1486,6 @@ return stat; } - CubitStatus stat = unhook_BodySM_from_OCC(bodysm); - DLIList<TopologyBridge*> children; DLIList<Lump*> lumps = occ_body->lumps(); DLIList<ShellSM*> shell_list; @@ -1531,15 +1509,18 @@ for(int k = 0; k < tb_surfaces.size(); k++) delete_solid_model_entities(CAST_TO(tb_surfaces.get_and_step(), Surface)); } - - for(int j = 0; j < shell_list.size(); j++) - delete shell_list.pop(); - delete lump; } + CubitStatus stat = unhook_BodySM_from_OCC(bodysm); + + for(int j = 0; j < shell_list.size(); j++) + delete shell_list.pop(); + + for(int i =0; i < lumps.size(); i++) + delete lumps.pop(); + + BodyList->remove(occ_body); delete bodysm; - BodyList->remove(CAST_TO(bodysm, OCCBody)); - return stat; } @@ -1682,6 +1663,32 @@ } //------------------------------------------------------------------------- +// Purpose : unhook a list of OCCCoFaces from their underlining OCC entity.// +// Special Notes : +// +// Creator : Jane Hu +// +// Creation Date : 12/12/07 +//------------------------------------------------------------------------- +CubitStatus +OCCQueryEngine::unhook_CoFaces_from_OCC( DLIList<OCCCoFace*> cofaces) const +{ + int size = cofaces.size(); + while(size > 0) + { + OCCCoFace* coface = cofaces.pop(); + + OCCShell* shell = coface->shell(); + shell->remove_coface(coface); + + delete coface; + + size = cofaces.size(); + } + return CUBIT_SUCCESS; +} + +//------------------------------------------------------------------------- // Purpose : Delete a OCCSurface and child entities. // // Special Notes : @@ -1731,6 +1738,8 @@ if(!face) return CUBIT_FAILURE; + unhook_cofaces_of_a_surface(fsurf); + //remove the entry from the map int k; if(OCCMap->IsBound(*face)) @@ -1740,12 +1749,10 @@ if(!OCCMap->UnBind(*face)) PRINT_WARNING("The OccSurface and TopoDS_Face pair is not in the map!"); - SurfaceList->remove((OCCSurface*)(OccToCGM->find(k))->second); - if(!OccToCGM->erase(k)) PRINT_WARNING("The OccSurface and TopoDS_Face pair is not in the map!"); } - + SurfaceList->remove(fsurf); delete face; TopoDS_Face Nullface; fsurf->set_TopoDS_Face(Nullface); @@ -1753,7 +1760,7 @@ } //------------------------------------------------------------------------- -// Purpose : Delete a OCCSurface and child entities. +// Purpose : Delete a OCCLoop and child entities. // // Special Notes : // @@ -1777,12 +1784,13 @@ OCCCoEdge* coedge = children.pop(); Curve* curve = coedge->curve(); curves.append(curve); + size = children.size(); } CubitStatus status = unhook_LoopSM_from_OCC(loopsm); if (status) { - WireList->remove(CAST_TO(loopsm, OCCLoop)); + WireList->remove(occ_loop); delete loopsm; } @@ -1813,46 +1821,6 @@ if(!wire) return CUBIT_FAILURE; - DLIList<OCCCoEdge*> children; - children = occ_loop->coedges(); - int size = children.size(); - while(size > 0) - { - OCCCoEdge* coedge = children.pop(); - Curve* curve = coedge->curve(); - OCCCurve *occ_curve = CAST_TO(curve, OCCCurve); - if (occ_curve == NULL) - continue; - - DLIList<OCCLoop*> loops; - - //remove all coedges corresponding to this curve from their loops. - loops = occ_curve->loops(); - for(int j = 0; j < loops.size(); j++) - { - OCCLoop* occ_loop = loops.get_and_step(); - OCCCoEdge* found_coedge = occ_loop->remove_coedge(coedge); - - if (found_coedge) - delete found_coedge; - - //there might be 2 coedges in the same loop that uses the same curve - //as in a scar curve situation - DLIList<OCCCoEdge*> coedges = occ_loop->coedges(); - for(int k =0; k < coedges.size(); k++) - { - found_coedge = coedges.get_and_step(); - if (CAST_TO(found_coedge->curve(), OCCCurve) == occ_curve) - { - occ_loop->remove_coedge(found_coedge); - children.remove(found_coedge); - delete found_coedge; - } - } - } - size = children.size(); - } - //remove the entry from the map int k; if(OCCMap->IsBound(*wire)) @@ -1873,6 +1841,35 @@ } //------------------------------------------------------------------------- +// Purpose : unhook a list of OCCCoEdges from their underlining OCC entity. +// +// Special Notes : +// +// Creator : Jane Hu +// +// Creation Date : 12/12/07 +//------------------------------------------------------------------------- +CubitStatus +OCCQueryEngine::unhook_CoEdges_from_OCC( DLIList<OCCCoEdge*> coedges) const +{ + int size = coedges.size(); + while(size > 0) + { + OCCCoEdge* coedge = coedges.pop(); + + LoopSM* loopsm = coedge->loop(); + OCCLoop* loop = CAST_TO(loopsm, OCCLoop); + assert(loop); + loop->remove_coedge(coedge); + + delete coedge; + + size = coedges.size(); + } + return CUBIT_SUCCESS; +} + +//------------------------------------------------------------------------- // Purpose : Delete a OCCCurve and child entities. // // Special Notes : @@ -1884,7 +1881,7 @@ CubitStatus OCCQueryEngine::delete_solid_model_entities( Curve* curve)const { - OCCCurve* fcurve = dynamic_cast<OCCCurve*>(curve); + OCCCurve* fcurve = CAST_TO(curve, OCCCurve); if (!fcurve ) return CUBIT_FAILURE; @@ -1899,7 +1896,7 @@ CubitStatus stat = unhook_Curve_from_OCC(curve); if (stat) { - CurveList->remove(CAST_TO(curve, OCCCurve)); + CurveList->remove(fcurve); delete curve; } return stat; @@ -1921,6 +1918,8 @@ if (!fcurve ) return CUBIT_FAILURE; + unhook_coedges_of_a_curve(fcurve); + fcurve->clean_loops(); TopoDS_Edge* edge = fcurve->get_TopoDS_Edge(); if (!edge) @@ -1935,11 +1934,11 @@ if(!OCCMap->UnBind(*edge)) PRINT_WARNING("The OccCurve and TopoDS_Edge pair is not in the map!"); - CurveList->remove((OCCCurve*)(OccToCGM->find(k))->second); + if(!OccToCGM->erase(k)) PRINT_WARNING("The OccCurve and TopoDS_Edge pair is not in the map!"); } - + CurveList->remove(fcurve); delete edge; TopoDS_Edge Nulledge; fcurve->set_TopoDS_Edge(Nulledge); @@ -2485,7 +2484,18 @@ { //delete the second TB corresponding to old_shape OccToCGM->erase(k); - delete_solid_model_entities( tb); + GeometryEntity* ge = CAST_TO(tb, GeometryEntity); + if(ge) + { + OCCSurface* surface = CAST_TO(ge, OCCSurface); + OCCCurve* curve = CAST_TO(ge, OCCCurve); + if (surface) + unhook_cofaces_of_a_surface(surface); + else if (curve) + unhook_coedges_of_a_curve(curve); + + delete_solid_model_entities( ge, CUBIT_FALSE ); + } } else @@ -2496,6 +2506,49 @@ return k; } +void OCCQueryEngine::unhook_cofaces_of_a_surface(OCCSurface* surface)const +{ + DLIList<OCCShell*> shells; + shells = surface->shells(); + DLIList<OCCCoFace*> cofaces; + for (int i = 0; i < shells.size(); i ++) + { + DLIList<OCCCoFace*> children ; + children = shells.get_and_step()->cofaces(); + for(int j = 0; j < children.size(); j++) + { + OCCCoFace* coface = children.get_and_step(); + if (coface->surface() == surface) + { + cofaces.append(coface); + break; + } + } + } + assert (cofaces.size() == shells.size()); + unhook_CoFaces_from_OCC(cofaces); +} +void OCCQueryEngine::unhook_coedges_of_a_curve(OCCCurve* curve)const +{ + DLIList<OCCLoop*> loops; + loops = curve->loops(); + DLIList<OCCCoEdge*> coedges; + for (int i = 0; i < loops.size(); i ++) + { + DLIList<OCCCoEdge *> children ; + children = loops.get_and_step()->coedges(); + for(int j = 0; j < children.size(); j++) + { + OCCCoEdge* coedge = children.get_and_step(); + if (coedge->curve() == curve) + { + coedges.append(coedge); + break; + } + } + } + unhook_CoEdges_from_OCC(coedges); +} void OCCQueryEngine::set_TopoDS_Shape(TopologyBridge* tb, TopoDS_Shape shape) { Modified: cgm/trunk/geom/OCC/OCCQueryEngine.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2008-04-30 18:36:10 UTC (rev 1787) +++ cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2008-05-01 19:37:56 UTC (rev 1788) @@ -72,6 +72,7 @@ class OCCLoop; class OCCSurface; class OCCBody; +class OCCCoFace; class OCCCoEdge; class OCCCurve; class OCCPoint; @@ -268,8 +269,12 @@ CubitStatus unhook_Lump_from_OCC( Lump* lump ) const; CubitStatus unhook_ShellSM_from_OCC( ShellSM* shell ) const; + CubitStatus unhook_CoEdges_from_OCC( DLIList<OCCCoEdge*> coedges) const; + CubitStatus unhook_CoFaces_from_OCC( DLIList<OCCCoFace*> cofaces) const; CubitStatus unhook_LoopSM_from_OCC( LoopSM* loopsm) const; CubitStatus delete_loop( LoopSM* loopsm)const; + void unhook_cofaces_of_a_surface(OCCSurface* surface)const; + void unhook_coedges_of_a_curve(OCCCurve* curve)const; public: virtual void delete_solid_model_entities(DLIList<BodySM*>& body_list) const; //- Deletes all solid model entities associated with the Bodies in @@ -277,7 +282,6 @@ virtual CubitStatus delete_solid_model_entities( GeometryEntity* ref_entity_ptr, bool remove_lower_entities) const; - CubitStatus delete_solid_model_entities(TopologyBridge* tb) const; virtual CubitStatus delete_solid_model_entities( BodySM* body_ptr ) const; virtual CubitStatus delete_solid_model_entities(Surface* surf_ptr)const; virtual CubitStatus delete_solid_model_entities( Curve* curve_ptr)const; Modified: cgm/trunk/geom/OCC/OCCSurface.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCSurface.hpp 2008-04-30 18:36:10 UTC (rev 1787) +++ cgm/trunk/geom/OCC/OCCSurface.hpp 2008-05-01 19:37:56 UTC (rev 1788) @@ -66,6 +66,11 @@ BRepAlgoAPI_BooleanOperation *op); + void add_shell(OCCShell* shell) { myShellList.append_unique(shell);} + DLIList<OCCShell*> shells() {return myShellList;} + void remove_shell(OCCShell* shell) {myShellList.remove(shell);} + void clean_shells(){myShellList.clean_out();} + virtual void append_simple_attribute_virt(CubitSimpleAttrib*); //R void //I @@ -422,6 +427,7 @@ TopoDS_Face *myTopoDSFace; + DLIList<OCCShell*> myShellList; //Following 3 members are only for sheeted body. OCCShell* myShell; OCCLump* myLump;
participants (1)
-
janehu@mcs.anl.gov