Author: janehu Date: 2008-04-24 14:55:06 -0500 (Thu, 24 Apr 2008) New Revision: 1777 Modified: cgm/trunk/geom/OCC/OCCBody.hpp cgm/trunk/geom/OCC/OCCModifyEngine.cpp Log: bug fixed in unite surfaces or build solid out of surfaces, after it's done, there are still some free ref_edges and refvertices left, debugging on it. Modified: cgm/trunk/geom/OCC/OCCBody.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCBody.hpp 2008-04-24 18:08:03 UTC (rev 1776) +++ cgm/trunk/geom/OCC/OCCBody.hpp 2008-04-24 19:55:06 UTC (rev 1777) @@ -182,6 +182,8 @@ return (OCCSurface*) NULL;} void set_sheet_surface(OCCSurface* surface); + virtual CubitBoolean is_sheet_body(){return IsSheetBody;} + protected: private: Modified: cgm/trunk/geom/OCC/OCCModifyEngine.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2008-04-24 18:08:03 UTC (rev 1776) +++ cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2008-04-24 19:55:06 UTC (rev 1777) @@ -1515,6 +1515,7 @@ DLIList<BodySM*>& surf_bodies, BodySM*& new_body) const { + new_body = NULL; if (surf_bodies.size()==0) return CUBIT_SUCCESS; @@ -1563,64 +1564,77 @@ if (surf_bodies.size() < 2) return CUBIT_SUCCESS; - DLIList<TopoDS_Face*> faces_to_stitch; - DLIList<OCCSurface*> surfaces; + DLIList<TopoDS_Shape*> faces_to_stitch; for (int i = 0; i < surf_bodies.size(); i++) { BodySM * tool_body = surf_bodies.get_and_step(); OCCBody* occ_body = CAST_TO(tool_body, OCCBody); OCCSurface* surface = occ_body->my_sheet_surface(); OCCShell* shell = occ_body->shell(); - if (surface == NULL) + if (surface == NULL && shell == NULL) { PRINT_ERROR("Can't stitch non-sheet bodySM's. \n"); return CUBIT_FAILURE; } - surfaces.append(surface); delete occ_body; - delete surface->my_shell(); - delete surface->my_lump(); - surface->set_shell(NULL); - surface->set_lump(NULL); - surface->set_body(NULL); - TopoDS_Face* topods_face = surface->get_TopoDS_Face(); - if (topods_face != NULL) - faces_to_stitch.append(topods_face); + if (surface) + { + delete surface->my_shell(); + delete surface->my_lump(); + surface->set_shell(NULL); + surface->set_lump(NULL); + surface->set_body(NULL); + + TopoDS_Face* topods_face = surface->get_TopoDS_Face(); + if (topods_face != NULL) + faces_to_stitch.append(topods_face); + } + else + { + delete shell->my_lump(); + shell->set_body(NULL); + shell->set_lump(NULL); + TopoDS_Shell* topods_shell = shell->get_TopoDS_Shell(); + if(topods_shell) + faces_to_stitch.append(topods_shell); + } } faces_to_stitch.reset(); surf_bodies.reset(); TopoDS_Shape* first_face = faces_to_stitch.pop(); - TopoDS_Face* second_face = NULL; + TopoDS_Shape* second_face = NULL; for( int i = faces_to_stitch.size()-1; i >= 0; i --) { second_face = faces_to_stitch[i]; BRepAlgoAPI_Fuse fuser(*second_face, *first_face); - OCCSurface* surface = surfaces[i]; - surface->update_OCC_entity(NULL, &fuser); + TopoDS_Shape new_shape ; - TopTools_IndexedMapOfShape M; - TopExp::MapShapes(*first_face, TopAbs_FACE, M); - for(int ii=1; ii<=M.Extent(); ii++) + for(int j = 0; j < 2; j++) { - TopoDS_Face face = TopoDS::Face(M(ii)); - TopTools_ListOfShape shapes; - shapes.Assign(fuser.Modified(face)); - if (shapes.Extent() > 0) - { - new_shape = shapes.First(); - OCCSurface::update_OCC_entity(face, TopoDS::Face(new_shape), &fuser); + TopTools_IndexedMapOfShape M; + if(j == 0) + TopExp::MapShapes(*second_face, TopAbs_FACE, M); + else + TopExp::MapShapes(*first_face, TopAbs_FACE, M); + for(int ii=1; ii<=M.Extent(); ii++) + { + TopoDS_Face face = TopoDS::Face(M(ii)); + TopTools_ListOfShape shapes; + shapes.Assign(fuser.Modified(face)); + if (shapes.Extent() > 0) + { + new_shape = shapes.First(); + OCCSurface::update_OCC_entity(face, TopoDS::Face(new_shape), &fuser); + } + //else + // OCCSurface::update_OCC_entity(face, face, &fuser); } - else - OCCSurface::update_OCC_entity(face, face, &fuser); - } + } + fuse = fuser.Shape(); - TopExp_Explorer Ex_edge; - TopoDS_Edge edge; - for (Ex_edge.Init(fuse,TopAbs_EDGE); Ex_edge.More(); Ex_edge.Next()) - edge = TopoDS::Edge(Ex_edge.Current()); first_face = &fuse; } @@ -2355,11 +2369,6 @@ CubitStatus success = CUBIT_SUCCESS; OCCBody* occ_body = NULL; DLIList<TopoDS_Shape*> shape_list; - // pass in keep_old to the delete_owner_attrib flag; if we're not keeping - // old bodies, we want to keep the owner attrib, so we can pick up entities - // that didn't change - bool delete_attribs = - (GeometryModifyTool::instance()->get_new_ids() || keep_old); for(int i = 0; i <from_body_list.size(); i++) { @@ -3037,43 +3046,11 @@ { //keep_old and heal are ignored, always delete old. //all surfaces should be stand along surface bodies or shell bodies' surface - DLIList<BodySM*> body_list; - for(int i = 0; i < ref_face_list.size(); i++) - { - OCCSurface* occ_surface = CAST_TO(ref_face_list.get_and_step(), OCCSurface); - if (occ_surface == NULL) - { - PRINT_ERROR("Cannot create an OCC lump from the given surfaces.\n" - "Possible incompatible geometry engines.\n"); - return CUBIT_FAILURE; - } - OCCBody* occ_body = occ_surface->my_body(); - if(occ_body && occ_body->my_sheet_surface() == NULL) - { - PRINT_ERROR("Cannot create an OCC lump from the given surfaces.\n" - "The surfaces are not free.\n"); - return CUBIT_FAILURE; - } - else if(!occ_body) - { - OCCShell* shell = occ_surface->my_shell(); - if(!shell) - { - PRINT_ERROR("This is a bug, please report it. \n"); - return CUBIT_FAILURE; - } - occ_body = shell->my_body(); - } - body_list.append_unique(occ_body); - } - - BodySM* new_body = NULL; - CubitStatus stat = stitch_surfs(body_list,new_body); - if (!new_body) - new_bodies = body_list; - else - new_bodies.append(new_body); + Lump* lump = make_Lump(ref_face_list); + if (!lump) + return CUBIT_FAILURE; + new_bodies.append(CAST_TO(lump, OCCLump)->get_body()); return CUBIT_SUCCESS; }
participants (1)
-
janehu@mcs.anl.gov