Author: janehu Date: 2008-10-08 13:03:04 -0500 (Wed, 08 Oct 2008) New Revision: 2136 Modified: cgm/trunk/geom/OCC/OCCModifyEngine.cpp cgm/trunk/geom/OCC/OCCSurface.cpp Log: Use 1x10^-7 instead of 1x10^-6 as tolerance as seen in Extrema_ExtPS intenal uses. Modified: cgm/trunk/geom/OCC/OCCModifyEngine.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2008-10-07 20:15:04 UTC (rev 2135) +++ cgm/trunk/geom/OCC/OCCModifyEngine.cpp 2008-10-08 18:03:04 UTC (rev 2136) @@ -3792,7 +3792,6 @@ { //in OCC, there's no sweep surface with draft option, this can be done by //creating draft shell then make solid to achieve. -/* TopoDS_Shape *stop_shape = NULL; if(stop_surf) { @@ -3814,6 +3813,31 @@ for (int i = ref_ent_list.size(); i > 0; i--) { GeometryEntity *ref_ent = ref_ent_list.get_and_step(); + //check if the ref_ent has free boundary, if not, bail out + OCCSurface* surface = CAST_TO(ref_ent, OCCSurface); + if(surface != NULL) + { + if(surface->my_body() == NULL) + continue; + } + CubitVector center = surface->center_point(); + CubitVector normal; + surface->closest_point(center,NULL,&normal); + if(normal % sweep_vector > 0) + { + DLIList<Surface*> surfaces; + surfaces.append(surface); + flip_normals(surfaces); + surface = CAST_TO(surfaces.get(), OCCSurface); + ref_ent = (GeometryEntity *)surface; + } + + else if(normal % sweep_vector == 0) + { + PRINT_ERROR("Sweeping direction should not be on the surface.\n"); + continue; + } + TopoDS_Shape* toposhape = OCCQueryEngine::instance()->get_TopoDS_Shape_of_entity(ref_ent); TopoDS_Wire wire; @@ -3833,14 +3857,7 @@ wire = BRepBuilderAPI_MakeWire(edge); toposhape = &wire; } - - //check if the ref_ent has free boundary, if not, bail out - OCCSurface* surface = CAST_TO(ref_ent, OCCSurface); - if(surface != NULL) - { - if(surface->my_body() == NULL) - continue; - } + //create the draft BRepOffsetAPI_MakeDraft draft(*toposhape, adir, draft_angle); BRepBuilderAPI_TransitionMode Cornertype; @@ -3862,9 +3879,9 @@ assert(tbs.size() == 1); BodySM* bodysm = CAST_TO(tbs.get(), BodySM); - if(surface != NULL) //only gets swept side and top surfaces + if(bodysm && surface != NULL) //only gets swept side and top surfaces { - //get surfaces from the shell body and add the original surface to + //get surfaces from the shell body and add the original surface to //make a swept solid. OCCShell* occ_shell = CAST_TO(bodysm, OCCBody)->shell(); if(!occ_shell) @@ -3872,13 +3889,12 @@ PRINT_WARNING("Sweep surface failed inside OCC engine.\n"); return CUBIT_FAILURE; } - DLIList<OCCCoFace*> cofaces = occ_shell->cofaces(); + DLIList<OCCCoFace*> cofaces = occ_shell->cofaces(); DLIList<Surface*> surface_list; surface_list.append(surface); for(int i = 0; i < cofaces.size(); i++) surface_list.append(cofaces.get_and_step()->surface()); - flip_normals(surface_list); DLIList<BodySM*> bodies; create_solid_bodies_from_surfs(surface_list, bodies); @@ -3893,7 +3909,6 @@ if (bodysm) result_body_list.append(bodysm); } -*/ return CUBIT_SUCCESS; } Modified: cgm/trunk/geom/OCC/OCCSurface.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCSurface.cpp 2008-10-07 20:15:04 UTC (rev 2135) +++ cgm/trunk/geom/OCC/OCCSurface.cpp 2008-10-08 18:03:04 UTC (rev 2136) @@ -405,7 +405,7 @@ gp_Pnt p(location.x(), location.y(), location.z()), newP(0.0, 0.0, 0.0); double minDist=0.0; int i; - Extrema_ExtPS ext(p, asurface, Precision::Approximation(), Precision::Approximation()); + Extrema_ExtPS ext(p, asurface, Precision::Confusion(), Precision::Confusion()); if (ext.IsDone() && (ext.NbExt() > 0)) { for ( i = 1 ; i <= ext.NbExt() ; i++ ) { if ( (i==1) || (p.Distance(ext.Point(i).Value()) < minDist) ) {
participants (1)
-
janehu@mcs.anl.gov