r1643 - cgm/trunk/geom/OCC
Author: janehu Date: 2008-03-12 13:45:10 -0500 (Wed, 12 Mar 2008) New Revision: 1643 Modified: cgm/trunk/geom/OCC/OCCBody.cpp cgm/trunk/geom/OCC/OCCBody.hpp cgm/trunk/geom/OCC/OCCLump.cpp cgm/trunk/geom/OCC/OCCLump.hpp cgm/trunk/geom/OCC/OCCModifyEngine.cpp cgm/trunk/geom/OCC/OCCQueryEngine.cpp cgm/trunk/geom/OCC/OCCQueryEngine.hpp cgm/trunk/geom/OCC/OCCShell.hpp Log: Added shell body for stitch operation, still has problems dealing with existing surfaces used for stitching, working on that. Modified: cgm/trunk/geom/OCC/OCCBody.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCBody.cpp 2008-03-12 18:04:16 UTC (rev 1642) +++ cgm/trunk/geom/OCC/OCCBody.cpp 2008-03-12 18:45:10 UTC (rev 1643) @@ -60,11 +60,12 @@ // //------------------------------------------------------------------------- OCCBody::OCCBody(TopoDS_CompSolid *theShape, CubitBoolean isSheetBody, - OCCSurface* surface) + OCCSurface* surface, OCCShell* shell) { myTopoDSShape = theShape; IsSheetBody = isSheetBody; mySheetSurface = surface; + myShell = shell; update_bounding_box(); } @@ -157,6 +158,12 @@ aBRepTrsf.Perform(*face); OCCQueryEngine::instance()->update_entity_shape(mySheetSurface, aBRepTrsf); } + else if(myShell) + { + TopoDS_Shell* shell = myShell->get_TopoDS_Shell(); + aBRepTrsf.Perform(*shell); + myShell->update_OCC_entity(aBRepTrsf); + } else { aBRepTrsf.Perform(*myTopoDSShape); @@ -194,6 +201,12 @@ aBRepTrsf.Perform(*face); OCCQueryEngine::instance()->update_entity_shape(mySheetSurface, aBRepTrsf); } + else if(myShell) + { + TopoDS_Shell* shell = myShell->get_TopoDS_Shell(); + aBRepTrsf.Perform(*shell); + myShell->update_OCC_entity(aBRepTrsf); + } else { aBRepTrsf.Perform(*myTopoDSShape); @@ -225,6 +238,12 @@ aBRepTrsf.Perform(*face); OCCQueryEngine::instance()->update_entity_shape(mySheetSurface, aBRepTrsf); } + else if(myShell) + { + TopoDS_Shell* shell = myShell->get_TopoDS_Shell(); + aBRepTrsf.Perform(*shell); + myShell->update_OCC_entity(aBRepTrsf); + } else { aBRepTrsf.Perform(*myTopoDSShape); @@ -276,6 +295,12 @@ aBRepTrsf.Perform(*face); OCCQueryEngine::instance()->update_entity_shape(mySheetSurface, aBRepTrsf); } + else if(myShell) + { + TopoDS_Shell* shell = myShell->get_TopoDS_Shell(); + aBRepTrsf.Perform(*shell); + myShell->update_OCC_entity(aBRepTrsf); + } else { aBRepTrsf.Perform(*myTopoDSShape); @@ -296,7 +321,7 @@ //---------------------------------------------------------------- CubitStatus OCCBody::update_OCC_entity( BRepBuilderAPI_Transform &aBRepTrsf) { - if(IsSheetBody) + if(IsSheetBody || myShell) return CUBIT_FAILURE; TopoDS_Shape shape = aBRepTrsf.Shape(); @@ -347,6 +372,8 @@ TopoDS_Shape shape; if(IsSheetBody) shape = *(mySheetSurface->get_TopoDS_Face()); + else if(myShell) + shape = *(myShell->get_TopoDS_Shell()); else shape=*myTopoDSShape; @@ -383,6 +410,12 @@ return; } + if (myShell) + { + lumps.append(myShell->my_lump()); + return; + } + TopTools_IndexedMapOfShape M; TopExp::MapShapes(*myTopoDSShape, TopAbs_SOLID, M); int ii; @@ -405,7 +438,7 @@ CubitStatus OCCBody::mass_properties( CubitVector& centroid, double& volume ) { - if(IsSheetBody) + if(IsSheetBody || myShell) return CUBIT_FAILURE; GProp_GProps myProps; BRepGProp::VolumeProperties(*myTopoDSShape, myProps); @@ -427,7 +460,7 @@ //------------------------------------------------------------------------- CubitPointContainment OCCBody::point_containment( const CubitVector &point ) { - if(IsSheetBody) + if(IsSheetBody || myShell) return CUBIT_PNT_UNKNOWN; CubitPointContainment pc_value; @@ -464,8 +497,14 @@ surfaces.append(mySheetSurface); return; } + + TopoDS_Shape shape; + if (myShell) + shape = *(myShell->get_TopoDS_Shell()); + else + shape = *myTopoDSShape; TopTools_IndexedMapOfShape M; - TopExp::MapShapes(*myTopoDSShape, TopAbs_FACE, M); + TopExp::MapShapes(shape, TopAbs_FACE, M); int ii; for (ii=1; ii<=M.Extent(); ii++) { TopologyBridge *surface = OCCQueryEngine::instance()->occ_to_cgm(M(ii)); @@ -490,6 +529,8 @@ TopoDS_Shape shape; if(IsSheetBody) shape = *(mySheetSurface->get_TopoDS_Face()); + else if(myShell) + shape = *(myShell->get_TopoDS_Shell()); else shape = *myTopoDSShape; @@ -519,6 +560,8 @@ TopoDS_Shape shape; if(IsSheetBody) shape = *(mySheetSurface->get_TopoDS_Face()); + else if(myShell) + shape = *(myShell->get_TopoDS_Shell()); else shape = *myTopoDSShape; Modified: cgm/trunk/geom/OCC/OCCBody.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCBody.hpp 2008-03-12 18:04:16 UTC (rev 1642) +++ cgm/trunk/geom/OCC/OCCBody.hpp 2008-03-12 18:45:10 UTC (rev 1643) @@ -47,11 +47,14 @@ public: OCCBody(TopoDS_CompSolid *theShape, CubitBoolean isSheetBody = CUBIT_FALSE, - OCCSurface* surface = NULL); + OCCSurface* surface = NULL, OCCShell* shell = NULL); OCCBody(DLIList<Lump*>& my_lumps); void lumps(DLIList<Lump*>& my_lumps); //add lump list to myLumps DLIList<Lump*> lumps(){return myLumps;} + + void shell(OCCShell* shell) {myShell = shell;} + OCCShell* shell() {return myShell;} virtual ~OCCBody() ; //- The destructor. @@ -190,7 +193,9 @@ CubitBoolean IsSheetBody; - OCCSurface* mySheetSurface; + OCCSurface* mySheetSurface; //one surface body + + OCCShell* myShell; //shell only body }; Modified: cgm/trunk/geom/OCC/OCCLump.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCLump.cpp 2008-03-12 18:04:16 UTC (rev 1642) +++ cgm/trunk/geom/OCC/OCCLump.cpp 2008-03-12 18:45:10 UTC (rev 1643) @@ -64,10 +64,11 @@ // Special Notes : // //------------------------------------------------------------------------- -OCCLump::OCCLump(TopoDS_Solid *theSolid, OCCSurface* surface) +OCCLump::OCCLump(TopoDS_Solid *theSolid, OCCSurface* surface, OCCShell* shell) { myTopoDSSolid = theSolid; mySheetSurface = surface; + myShell = shell; } OCCLump::~OCCLump() @@ -85,7 +86,7 @@ CubitStatus OCCLump::mass_properties( CubitVector& centroid, double& volume ) { - if (mySheetSurface) + if (mySheetSurface || myShell) return CUBIT_FAILURE; GProp_GProps myProps; @@ -177,6 +178,8 @@ TopoDS_Shape shape; if(mySheetSurface) shape = *(mySheetSurface->get_TopoDS_Face()); + else if(myShell) + shape = *(myShell->get_TopoDS_Shell()); else shape =*myTopoDSSolid; @@ -215,7 +218,7 @@ //------------------------------------------------------------------------- double OCCLump::measure() { - if(mySheetSurface) + if(mySheetSurface || myShell) return 0.0; GProp_GProps myProps; BRepGProp::VolumeProperties(*myTopoDSSolid, myProps); @@ -226,6 +229,8 @@ { if(mySheetSurface) bodies.append(mySheetSurface->my_body()); + else if (myShell) + bodies.append(myShell->my_body()); else bodies.append(myBodyPtr); } @@ -237,6 +242,11 @@ shellsms.append(mySheetSurface->my_shell()); return; } + else if(myShell) + { + shellsms.append(myShell); + return; + } TopTools_IndexedMapOfShape M; TopExp::MapShapes(*myTopoDSSolid, TopAbs_SHELL, M); int ii; @@ -250,7 +260,7 @@ CubitPointContainment OCCLump::point_containment( const CubitVector &point ) { - if (mySheetSurface) + if (mySheetSurface || myShell) return CUBIT_PNT_UNKNOWN; BOP_SolidClassifier ps; @@ -283,7 +293,7 @@ //---------------------------------------------------------------- CubitStatus OCCLump::update_OCC_entity( BRepBuilderAPI_Transform &aBRepTrsf) { - if(mySheetSurface) + if(mySheetSurface || myShell) return CUBIT_FAILURE; TopoDS_Shape shape = aBRepTrsf.ModifiedShape(*get_TopoDS_Solid()); Modified: cgm/trunk/geom/OCC/OCCLump.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCLump.hpp 2008-03-12 18:04:16 UTC (rev 1642) +++ cgm/trunk/geom/OCC/OCCLump.hpp 2008-03-12 18:45:10 UTC (rev 1643) @@ -44,7 +44,8 @@ { public: - OCCLump(TopoDS_Solid *theSolid, OCCSurface* surface = NULL); + OCCLump(TopoDS_Solid *theSolid, OCCSurface* surface = NULL, + OCCShell* shell = NULL); virtual ~OCCLump(); //- The destructor @@ -161,6 +162,7 @@ //List of OCCAttrib*'s instead of CubitSimpleAttribs OCCSurface *mySheetSurface; + OCCShell * myShell; } ; Modified: cgm/trunk/geom/OCC/OCCModifyEngine.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2008-03-12 18:04:16 UTC (rev 1642) +++ cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2008-03-12 18:45:10 UTC (rev 1643) @@ -45,6 +45,7 @@ #include "BRepBuilderAPI_MakeEdge.hxx" #include "BRepAdaptor_Surface.hxx" #include "BRepBuilderAPI_MakeFace.hxx" +#include "BRepBuilderAPI_Sewing.hxx" #include "BRepBuilderAPI_Copy.hxx" #include "BRep_Tool.hxx" #include "BRep_Builder.hxx" @@ -1415,7 +1416,7 @@ //=============================================================================== // Function : stitch_surfs // Member Type: PUBLIC -// Description: Unite surfs into one surface sheet body +// Description: stitch all surfs and try to make a closed solid out of them. // Author : Jane Hu // Date : 03/08 //=============================================================================== @@ -1436,7 +1437,7 @@ DLIList<TopoDS_Face*> faces_to_stitch; for (int i = 0; i < surf_bodies.size(); i++) { - BodySM * tool_body = surf_bodies.get(); + BodySM * tool_body = surf_bodies.get_and_step(); OCCBody* occ_body = CAST_TO(tool_body, OCCBody); OCCSurface* surface = occ_body->my_sheet_surface(); if (surface == NULL) @@ -1449,58 +1450,43 @@ faces_to_stitch.append(topods_face); } - TopoDS_Face* first_face = faces_to_stitch.get(); + TopoDS_Shape* first_face = faces_to_stitch.get(); TopoDS_Face* second_face = NULL; - TopoDS_Face* new_face = NULL ; - CubitBoolean disconnected = CUBIT_FALSE; - TopoDS_Shape fusion; - int count = 0; - for(int i = 0; i < faces_to_stitch.size(); i++) + TopoDS_Shape fuse; + for(int i = 1; i < faces_to_stitch.size(); i++) { - if (count > 0) - first_face = new_face; - - for(int j = i + 1; j < faces_to_stitch.size(); j++) - { - second_face = faces_to_stitch[j]; - BRepAlgoAPI_Fuse fuse(*first_face, *second_face); - if (fuse.ErrorStatus() != 0 && fuse.ErrorStatus() != 1) - { - PRINT_ERROR("Can't operate fusion for given surfaces. \n"); - return CUBIT_FAILURE; - } - else if (fuse.ErrorStatus() == 1) - { - //The Object is created but Nothing is Done - disconnected = CUBIT_TRUE; - continue; - } + second_face = faces_to_stitch[i]; + fuse = BRepAlgoAPI_Fuse(*first_face, *second_face); + first_face = &fuse; + } - //fused into one face - fusion = fuse.Shape1(); - if (count > 0) - delete new_face; - new_face = new TopoDS_Face(TopoDS::Face(fusion)); - faces_to_stitch.remove(second_face); - disconnected = CUBIT_FALSE; - i--; - count++; - break; - } - if (disconnected) - { - //Can't make a body out of disconnected faces - PRINT_ERROR("Can't create one BodySM out of disconnected surfaces. \n"); - if(new_face != NULL) - delete new_face; - return CUBIT_FAILURE; - } + TopExp_Explorer Ex; + int count_face = 0; + int count_shell = 0; + for (Ex.Init(fuse, TopAbs_FACE, TopAbs_SHELL); Ex.More(); Ex.Next()) + count_face++; + for (Ex.Init(fuse, TopAbs_SHELL, TopAbs_SOLID); Ex.More(); Ex.Next()) + count_shell++; + + if (count_face != 1 && count_shell != 1) + { + PRINT_ERROR("Can't stitch all surfaces into one BodySM's. \n"); + return CUBIT_FAILURE; } + + DLIList<TopologyBridge*> tbs = OCCQueryEngine::instance()-> + populate_topology_bridge(fuse); + OCCBody* body = CAST_TO(tbs.get(), OCCBody); + if (body) + stitched_body = body ; - Surface* surface = OCCQueryEngine::instance()-> - populate_topology_bridge(*new_face, CUBIT_TRUE); + else + { + OCCSurface* face = CAST_TO(tbs.get(), OCCSurface); + if(face) + stitched_body = face->my_body(); + } - stitched_body = CAST_TO(surface, OCCSurface)->my_body(); //delete all original surfaces OCCQueryEngine::instance()->delete_solid_model_entities(surf_bodies); return CUBIT_SUCCESS; Modified: cgm/trunk/geom/OCC/OCCQueryEngine.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2008-03-12 18:04:16 UTC (rev 1642) +++ cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2008-03-12 18:45:10 UTC (rev 1643) @@ -141,7 +141,6 @@ OccToCGM = new std::map<int, TopologyBridge*>; BodyList = new DLIList<OCCBody*>; - ShellList = new DLIList<OCCShell*>; WireList = new DLIList<OCCLoop*>; SurfaceList = new DLIList<OCCSurface*>; CurveList = new DLIList<OCCCurve*>; @@ -158,7 +157,6 @@ delete OCCMap; delete OccToCGM; while( BodyList->size() ) delete BodyList->pop(); - delete[] ShellList; delete[] WireList; delete[] SurfaceList; delete[] CurveList; @@ -939,15 +937,20 @@ OCCBody* body = OCC_bodies.get_and_step(); TopoDS_CompSolid *shape = body->get_TopoDS_Shape(); - if (shape == NULL) //sheet body + if (shape == NULL) //sheet body or shell body { OCCSurface* surface = body->my_sheet_surface(); - if (surface == NULL) + OCCShell* shell = body->shell(); + if (surface == NULL && shell == NULL) { + PRINT_ERROR( "Wrong body structure. Internal ERROR\n" ); continue; } - B.Add(Co,*(surface->get_TopoDS_Face())); + if(surface) + B.Add(Co,*(surface->get_TopoDS_Face())); + else + B.Add(Co,*(shell->get_TopoDS_Shell())); continue; } @@ -969,13 +972,6 @@ } } - //Add standalone shells to export BRep file - for (i = 0; i < ShellList->size(); i++) - { - TopoDS_Shell *shell = ShellList->get_and_step()->get_TopoDS_Shell(); - B.Add(Co, *shell); - } - for (i = 0; i < OCC_surfaces.size(); i++) { TopoDS_Face *face = OCC_surfaces.get_and_step()->get_TopoDS_Face(); @@ -1079,7 +1075,11 @@ } for (Ex.Init(aShape, TopAbs_SHELL, TopAbs_SOLID); Ex.More(); Ex.Next()) - populate_topology_bridge(TopoDS::Shell(Ex.Current()), CUBIT_TRUE); + { + OCCShell* shell = + populate_topology_bridge(TopoDS::Shell(Ex.Current()), CUBIT_TRUE); + tblist.append(shell->my_body()); + } for (Ex.Init(aShape, TopAbs_FACE, TopAbs_SHELL); Ex.More(); Ex.Next()) tblist.append(populate_topology_bridge(TopoDS::Face(Ex.Current()),CUBIT_TRUE)); @@ -1183,8 +1183,10 @@ (TopologyBridge*)shell)); if(standalone) { - build_body = CUBIT_TRUE; - ShellList->append(shell); + OCCLump* lump = new OCCLump(NULL, NULL, shell); + OCCBody* body = new OCCBody(NULL, CUBIT_FALSE, NULL, shell); + shell->set_body(body); + shell->set_lump(lump); } } else @@ -1423,6 +1425,14 @@ return delete_solid_model_entities(occ_surface); } + OCCShell* occ_shell = occ_body->shell(); + if(occ_shell) + { + delete occ_shell->my_body(); + delete occ_shell->my_lump(); + return unhook_ShellSM_from_OCC(occ_shell); + } + DLIList<Lump*> lumps = occ_body->lumps(); for(int i =0; i < lumps.size(); i++) { @@ -1566,7 +1576,6 @@ Surface* surface = CAST_TO(children.get_and_step(), Surface); delete_solid_model_entities(surface); } - ShellList->remove(CAST_TO(shell, OCCShell)); delete Shell; delete shell; return CUBIT_SUCCESS; Modified: cgm/trunk/geom/OCC/OCCQueryEngine.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2008-03-12 18:04:16 UTC (rev 1642) +++ cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2008-03-12 18:45:10 UTC (rev 1643) @@ -346,7 +346,6 @@ Point* populate_topology_bridge(TopoDS_Vertex aShape); DLIList<OCCBody*> *BodyList ; - DLIList<OCCShell*> *ShellList; //standalone shell list DLIList<OCCSurface*> *SurfaceList ; DLIList<OCCLoop*> *WireList; //standalone wire list DLIList<OCCCurve*> *CurveList ; Modified: cgm/trunk/geom/OCC/OCCShell.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCShell.hpp 2008-03-12 18:04:16 UTC (rev 1642) +++ cgm/trunk/geom/OCC/OCCShell.hpp 2008-03-12 18:45:10 UTC (rev 1643) @@ -50,6 +50,11 @@ TopoDS_Shell* get_TopoDS_Shell() {return myTopoDSShell;} void set_TopoDS_Shell(TopoDS_Shell shell){*myTopoDSShell = shell;} + OCCLump* my_lump() {return myLump;} + OCCBody* my_body() {return myBody;} + void set_lump(OCCLump* lump) {myLump = lump;} + void set_body(OCCBody* body) {myBody = body;} + virtual GeometryQueryEngine* get_geometry_query_engine() const; //R GeometryQueryEngine* @@ -107,6 +112,8 @@ private: TopoDS_Shell *myTopoDSShell; OCCSurface* mySheetSurface; + OCCLump* myLump; + OCCBody* myBody; };
participants (1)
-
janehu@mcs.anl.gov