Author: janehu Date: 2008-04-30 13:36:10 -0500 (Wed, 30 Apr 2008) New Revision: 1787 Modified: cgm/trunk/geom/OCC/OCCCurve.cpp cgm/trunk/geom/OCC/OCCLoop.cpp cgm/trunk/geom/OCC/OCCLump.cpp cgm/trunk/geom/OCC/OCCPoint.cpp cgm/trunk/geom/OCC/OCCQueryEngine.cpp cgm/trunk/geom/OCC/OCCQueryEngine.hpp cgm/trunk/geom/OCC/OCCShell.cpp cgm/trunk/geom/OCC/OCCSurface.cpp Log: Reviewed with Jason and now think that CoEdge hasn't been cleaned out correctly so it still has free ref edges. will update and check on it tomorrow. Modified: cgm/trunk/geom/OCC/OCCCurve.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCCurve.cpp 2008-04-30 15:42:51 UTC (rev 1786) +++ cgm/trunk/geom/OCC/OCCCurve.cpp 2008-04-30 18:36:10 UTC (rev 1787) @@ -918,13 +918,15 @@ shapes.Assign(op->Modified(*get_TopoDS_Edge())); if(shapes.Extent()) shape = shapes.First(); + else if (op->IsDeleted(*get_TopoDS_Edge())) + ; else return ; } - TopoDS_Edge curve = TopoDS::Edge(shape); + TopoDS_Edge curve; + if(!shape.IsNull()) + curve = TopoDS::Edge(shape); - OCCQueryEngine::instance()->update_OCC_map(*myTopoDSEdge, curve); - //set the vertices DLIList<TopologyBridge*> vertices; get_children_virt(vertices); @@ -936,7 +938,7 @@ point->update_OCC_entity(aBRepTrsf, op); } myMarked = 1; - set_TopoDS_Edge(curve); + OCCQueryEngine::instance()->update_OCC_map(*myTopoDSEdge, curve); } //=============================================================================== Modified: cgm/trunk/geom/OCC/OCCLoop.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCLoop.cpp 2008-04-30 15:42:51 UTC (rev 1786) +++ cgm/trunk/geom/OCC/OCCLoop.cpp 2008-04-30 18:36:10 UTC (rev 1787) @@ -238,22 +238,23 @@ shapes.Assign(op->Modified(*get_TopoDS_Wire())); if(shapes.Extent()) shape = shapes.First(); + else if (op->IsDeleted(*get_TopoDS_Wire())) + ; else need_update = CUBIT_FALSE; } - TopoDS_Wire loop; - if (need_update) - { - loop = TopoDS::Wire(shape); - OCCQueryEngine::instance()->update_OCC_map(*myTopoDSWire, loop); - } + //set the curves for (int i = 1; i <= myCoEdgeList.size(); i++) { OCCCurve *curve = CAST_TO(myCoEdgeList.get_and_step()->curve(), OCCCurve); curve->update_OCC_entity(aBRepTrsf, op); } + TopoDS_Wire loop; if (need_update) - set_TopoDS_Wire(loop); + { + loop = TopoDS::Wire(shape); + OCCQueryEngine::instance()->update_OCC_map(*myTopoDSWire, loop); + } } Modified: cgm/trunk/geom/OCC/OCCLump.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCLump.cpp 2008-04-30 15:42:51 UTC (rev 1786) +++ cgm/trunk/geom/OCC/OCCLump.cpp 2008-04-30 18:36:10 UTC (rev 1787) @@ -315,13 +315,16 @@ shapes.Assign(op->Modified(*get_TopoDS_Solid())); if(shapes.Extent() > 0) shape = shapes.First(); + else if(op->IsDeleted(*get_TopoDS_Solid())) + ; else return CUBIT_SUCCESS; } - TopoDS_Solid solid = TopoDS::Solid(shape); + + TopoDS_Solid solid; + if(!op->IsDeleted(*get_TopoDS_Solid())) + solid = TopoDS::Solid(shape); - OCCQueryEngine::instance()->update_OCC_map(*myTopoDSSolid, solid); - //set the lumps DLIList<TopologyBridge *> shells; this->get_children_virt(shells); @@ -330,6 +333,7 @@ OCCShell *shell = CAST_TO(shells.get_and_step(), OCCShell); shell->update_OCC_entity(aBRepTrsf, op); } - set_TopoDS_Solid(solid); + OCCQueryEngine::instance()->update_OCC_map(*myTopoDSSolid, solid); + } Modified: cgm/trunk/geom/OCC/OCCPoint.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCPoint.cpp 2008-04-30 15:42:51 UTC (rev 1786) +++ cgm/trunk/geom/OCC/OCCPoint.cpp 2008-04-30 18:36:10 UTC (rev 1787) @@ -278,10 +278,14 @@ shapes.Assign(op->Modified(*get_TopoDS_Vertex())); if(shapes.Extent()) shape = shapes.First(); + else if(op->IsDeleted(*get_TopoDS_Vertex())) + ; else return ; } - TopoDS_Vertex vertex = TopoDS::Vertex(shape); + TopoDS_Vertex vertex; + if(!shape.IsNull()) + vertex = TopoDS::Vertex(shape); OCCQueryEngine::instance()->update_OCC_map(*myTopoDSVertex, vertex); Modified: cgm/trunk/geom/OCC/OCCQueryEngine.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2008-04-30 15:42:51 UTC (rev 1786) +++ cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2008-04-30 18:36:10 UTC (rev 1787) @@ -2471,23 +2471,61 @@ OCCMap->UnBind(old_shape); + std::map<int, TopologyBridge*>::iterator it = OccToCGM->find(k); + TopologyBridge* tb = NULL; + if (it != OccToCGM->end()) + tb = (*it).second; + + else + assert(0); + if ((!new_shape.IsNull() && !old_shape.IsSame(new_shape)&& OCCMap->IsBound(new_shape))|| new_shape.IsNull()) //already has a TB built on new_shape { //delete the second TB corresponding to old_shape - std::map<int, TopologyBridge*>::iterator it = OccToCGM->find(k); - TopologyBridge* tb = NULL; - if (it != OccToCGM->end()) - { - OccToCGM->erase(k); - tb = (*it).second; - delete_solid_model_entities( tb); - } + OccToCGM->erase(k); + delete_solid_model_entities( tb); } else + { OCCMap->Bind(new_shape, k); + set_TopoDS_Shape(tb, new_shape); + } return k; } + +void OCCQueryEngine::set_TopoDS_Shape(TopologyBridge* tb, + TopoDS_Shape shape) +{ + BodySM* body = CAST_TO(tb, BodySM); + if(body) + return CAST_TO(body, OCCBody)->set_TopoDS_Shape(TopoDS::CompSolid(shape)); + + Lump* lump = CAST_TO(tb, Lump); + if(lump) + return CAST_TO(lump, OCCLump)->set_TopoDS_Solid(TopoDS::Solid(shape)); + + ShellSM* shell = CAST_TO(tb, ShellSM); + if(shell) + return CAST_TO(shell, OCCShell)->set_TopoDS_Shell(TopoDS::Shell(shape)); + + Surface* surface = CAST_TO(tb, Surface); + if (surface) + return CAST_TO(surface, OCCSurface)->set_TopoDS_Face(TopoDS::Face(shape)); + + LoopSM* loop = CAST_TO(tb, LoopSM); + if(loop) + return CAST_TO(loop, OCCLoop)->set_TopoDS_Wire(TopoDS::Wire(shape)); + + Curve* curve = CAST_TO(tb, Curve); + if (curve) + return CAST_TO(curve, OCCCurve)->set_TopoDS_Edge(TopoDS::Edge(shape)); + + Point* point = CAST_TO(tb, Point); + if(point) + return CAST_TO(point, OCCPoint)->set_TopoDS_Vertex(TopoDS::Vertex(shape)); + +} //EOF Modified: cgm/trunk/geom/OCC/OCCQueryEngine.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2008-04-30 15:42:51 UTC (rev 1786) +++ cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2008-04-30 18:36:10 UTC (rev 1787) @@ -310,6 +310,7 @@ BRepBuilderAPI_Transform* aTranf, BRepAlgoAPI_BooleanOperation *op = NULL); + void set_TopoDS_Shape(TopologyBridge* tb, TopoDS_Shape new_shape); CubitStatus translate( BodySM* body, const CubitVector& offset ); CubitStatus rotate ( BodySM* body, const CubitVector& axis, double angle ); CubitStatus scale ( BodySM* body, double factor ); Modified: cgm/trunk/geom/OCC/OCCShell.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCShell.cpp 2008-04-30 15:42:51 UTC (rev 1786) +++ cgm/trunk/geom/OCC/OCCShell.cpp 2008-04-30 18:36:10 UTC (rev 1787) @@ -218,13 +218,15 @@ shapes.Assign(op->Modified(*get_TopoDS_Shell())); if (shapes.Extent()) shape = shapes.First(); + else if(op->IsDeleted(*get_TopoDS_Shell())) + ; else return CUBIT_SUCCESS; } - TopoDS_Shell shell = TopoDS::Shell(shape); + TopoDS_Shell shell; + if (!shape.IsNull()) + shell = TopoDS::Shell(shape); - OCCQueryEngine::instance()->update_OCC_map(*myTopoDSShell, shell); - //set the surfaces DLIList<TopologyBridge *> surfaces; this->get_children_virt(surfaces); @@ -233,7 +235,7 @@ OCCSurface *surface = CAST_TO(surfaces.get_and_step(), OCCSurface); surface->update_OCC_entity(aBRepTrsf, op); } - set_TopoDS_Shell(shell); + OCCQueryEngine::instance()->update_OCC_map(*myTopoDSShell, shell); return CUBIT_SUCCESS; } Modified: cgm/trunk/geom/OCC/OCCSurface.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCSurface.cpp 2008-04-30 15:42:51 UTC (rev 1786) +++ cgm/trunk/geom/OCC/OCCSurface.cpp 2008-04-30 18:36:10 UTC (rev 1787) @@ -784,17 +784,18 @@ shapes.Assign(op->Modified(*get_TopoDS_Face())); if (shapes.Extent() > 0) shape = shapes.First(); + else if(op->IsDeleted(*get_TopoDS_Face())) + ; else return CUBIT_SUCCESS; } TopoDS_Face surface; - surface = TopoDS::Face(shape); + if(!shape.IsNull()) + surface = TopoDS::Face(shape); if (aBRepTrsf) { - OCCQueryEngine::instance()->update_OCC_map(*myTopoDSFace, surface); - //set the loops DLIList<OCCLoop *> loops; this->get_loops(loops); @@ -803,7 +804,7 @@ OCCLoop *loop = loops.get_and_step(); loop->update_OCC_entity(aBRepTrsf, op); } - set_TopoDS_Face(surface); + OCCQueryEngine::instance()->update_OCC_map(*myTopoDSFace, surface); } else if(op) @@ -821,17 +822,16 @@ TopoDS_Face& new_surface, BRepAlgoAPI_BooleanOperation *op) { - OCCQueryEngine::instance()->update_OCC_map(old_surface, new_surface); - //set the Wires TopTools_IndexedMapOfShape M; - TopoDS_Shape shape; + TopoDS_Shape shape, shape_edge, shape_vertex; TopExp::MapShapes(old_surface, TopAbs_WIRE, M); double tol = OCCQueryEngine::instance()->get_sme_resabs_tolerance(); int ii; TopTools_ListOfShape shapes; - for (ii=1; ii<=M.Extent(); ii++) { + for (ii=1; ii<=M.Extent(); ii++) + { TopoDS_Wire wire = TopoDS::Wire(M(ii)); if(!new_surface.IsNull()) @@ -846,45 +846,41 @@ TopExp::MapShapes(new_surface, TopAbs_WIRE, M_new); shape = M_new(ii); } - - OCCQueryEngine::instance()->update_OCC_map(wire, shape); } //set curves BRepTools_WireExplorer Ex; + for(Ex.Init(wire); Ex.More();Ex.Next()) { TopoDS_Edge edge = Ex.Current(); shapes.Assign(op->Modified(edge)); - shape.Nullify(); if (shapes.Extent() > 0) - shape = shapes.First(); + shape_edge = shapes.First(); else if (op->IsDeleted(edge)) ; else continue; - if(wire.Orientation() == TopAbs_REVERSED && !shape.IsNull()) + if(wire.Orientation() == TopAbs_REVERSED && !shape_edge.IsNull()) { - shape.Orientation( - shape.Orientation()==TopAbs_FORWARD? TopAbs_REVERSED:TopAbs_FORWARD); + shape_edge.Orientation( + shape_edge.Orientation()==TopAbs_FORWARD? TopAbs_REVERSED:TopAbs_FORWARD); } - OCCQueryEngine::instance()->update_OCC_map(edge, shape); - if (shape.IsNull()) - continue; //update vertex TopoDS_Vertex vertex = Ex.CurrentVertex(); shapes.Assign(op->Modified(vertex)); - shape.Nullify(); if (shapes.Extent() > 0) - { - shape = shapes.First(); - OCCQueryEngine::instance()->update_OCC_map(vertex, shape); - } - else if(op->IsDeleted(vertex)) - OCCQueryEngine::instance()->update_OCC_map(vertex, shape); + shape_vertex = shapes.First(); + + if(shapes.Extent() > 0 || op->IsDeleted(vertex)) + OCCQueryEngine::instance()->update_OCC_map(vertex, shape_vertex); + + OCCQueryEngine::instance()->update_OCC_map(edge, shape_edge); } + OCCQueryEngine::instance()->update_OCC_map(wire, shape); } + OCCQueryEngine::instance()->update_OCC_map(old_surface, new_surface); return CUBIT_SUCCESS; }
participants (1)
-
janehu@mcs.anl.gov