[cgma-dev] r1710 - in cgm/trunk: geom/OCC test

janehu at mcs.anl.gov janehu at mcs.anl.gov
Thu Mar 27 13:53:17 CDT 2008


Author: janehu
Date: 2008-03-27 13:53:17 -0500 (Thu, 27 Mar 2008)
New Revision: 1710

Modified:
   cgm/trunk/geom/OCC/OCCModifyEngine.cpp
   cgm/trunk/test/modify.cpp
Log:
Added for cylinder function to create a ellipse based cone;test passed this; modified for imprint_toposhapes, still the overlapping of edges status is to be improved to make the code work automatically. If I go into debugger and hand choose edges to cut the face, it works.

Modified: cgm/trunk/geom/OCC/OCCModifyEngine.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCModifyEngine.cpp	2008-03-27 17:39:57 UTC (rev 1709)
+++ cgm/trunk/geom/OCC/OCCModifyEngine.cpp	2008-03-27 18:53:17 UTC (rev 1710)
@@ -40,7 +40,9 @@
 #include "Handle_Geom_Plane.hxx"
 #include "BRepPrimAPI_MakePrism.hxx"
 #include "BRepPrimAPI_MakeCone.hxx"
+#include "BRepOffsetAPI_ThruSections.hxx"
 #include "BRepPrimAPI_MakeTorus.hxx"
+#include "BRepPrimAPI_MakeCylinder.hxx"
 #include "GC_MakeEllipse.hxx"
 #include "BRepBuilderAPI_MakeEdge.hxx"
 #include "BRepAdaptor_Surface.hxx"
@@ -751,10 +753,10 @@
 // Date       : 03/08
 //===============================================================================
 CubitStatus OCCModifyEngine::sort_curves(DLIList<Curve*> curve_list,
-                                         DLIList<DLIList<TopoDS_Edge*>*>& topo_edges_loops)const
+                        DLIList<DLIList<TopoDS_Edge*>*>& topo_edges_loops)const
 {
   topo_edges_loops.clean_out();
-
+  CubitStatus stat = CUBIT_SUCCESS;
   DLIList<TopoDS_Edge*>* topo_edges[curve_list.size()];
   for(int i = 0; i < curve_list.size(); i++)
     topo_edges[i] = new DLIList<TopoDS_Edge*>;
@@ -824,19 +826,15 @@
      }
      else
      {
-        PRINT_ERROR("In OCCModifyEngine::sort_curves\n"
-                    "  Curve list  can't  form closed loops    \n") ;
-        return CUBIT_FAILURE;
+        stat = CUBIT_FAILURE; 
+        i = -1;
+        size = curve_list.size();
      }
   }
 
   if( new_end == CUBIT_FALSE ) //case of one disconnected curve
-  {
-     PRINT_ERROR("In OCCModifyEngine::sort_curves\n"
-                 "  Curve list  can't  form closed loops    \n") ;
-     return CUBIT_FAILURE;
-  }
-  return CUBIT_SUCCESS;
+    stat = CUBIT_FAILURE;
+  return stat;
 } 
 //===============================================================================
 // Function   : make_TopoDS_Face
@@ -1272,14 +1270,8 @@
 //===============================================================================
 BodySM* OCCModifyEngine::cylinder( double hi, double r1, double r2, double r3 ) const
 {
-  if(r2 > 0 && r3 > 0)
-  {
-    PRINT_WARNING("Can not make elliptical cone for OCC engine.\n");
-    return (BodySM*) NULL;
-  }
-
   TopoDS_Solid S;
-  if(r3 == 0)//elliptical based cylinder
+  if(r2 != r1)//elliptical based cylinder
   {
     gp_Pnt center(0.0, 0.0, 0.0);
     gp_Dir main_dir(0.0, 0.0, 1.0);
@@ -1290,23 +1282,36 @@
     BRepBuilderAPI_MakeWire aWire(new_edge);
 
     TopoDS_Wire test_Wire = aWire.Wire();
-
-    BRepBuilderAPI_MakeFace made_face(test_Wire);
-
-    if (!made_face.IsDone())
+    
+    BRepOffsetAPI_ThruSections builder(CUBIT_TRUE, CUBIT_TRUE);
+    builder.AddWire(test_Wire);
+    if (r3 == 0)
     {
-       PRINT_ERROR("In OCCModifyEngine::cylinder\n"
-                   "   Cannot create elliptical surface for given radii.\n");
-       return (BodySM *)NULL;
+      gp_Pnt pt = gp_Pnt( 0.0, 0.0, hi);
+      TopoDS_Vertex theVertex = BRepBuilderAPI_MakeVertex(pt);
+      builder.AddVertex(theVertex);
     }
-    TopoDS_Face test_face = made_face.Face();    
-    gp_Vec V(0.0, 0.0, hi);
-    TopoDS_Shape S1 = BRepPrimAPI_MakePrism(test_face, V);    
-    S = TopoDS::Solid(S1);
+    else
+    {
+      gp_Pnt center2(0.0, 0.0,hi);
+      gp_Ax2 Axis2(center2, main_dir, x_dir);
+      Handle(Geom_Curve) curve_ptr = GC_MakeEllipse(Axis2, r3, r3*r2/r1);
+      TopoDS_Edge new_edge = BRepBuilderAPI_MakeEdge(curve_ptr);
+      BRepBuilderAPI_MakeWire aWire(new_edge);
+      TopoDS_Wire test_Wire = aWire.Wire();
+      builder.AddWire(test_Wire);
+    }
+    builder.Build() ;
+    S = TopoDS::Solid(builder.Shape());
   }
 
   else // cone
-    S = BRepPrimAPI_MakeCone(r1, r3, hi);
+  {
+    if(r1 == r3) //cylinder
+      S = BRepPrimAPI_MakeCylinder(r1, hi);
+    else
+      S = BRepPrimAPI_MakeCone(r1, r3, hi);
+  }
 
   Lump* lump = OCCQueryEngine::instance()->populate_topology_bridge(S,
                                                                 CUBIT_TRUE);
@@ -1531,7 +1536,6 @@
                                           bool imprint,
                                           bool keep_old) const
 {
-  //need to implement "imprint" function.
   // copy the bodies in case subtraction has some errors
   DLIList<TopoDS_Shape*> tool_bodies_copy;
   DLIList<TopoDS_Shape*> from_bodies_copy;
@@ -1756,67 +1760,90 @@
 CubitStatus OCCModifyEngine::imprint_toposhapes(TopoDS_Shape*& from_shape, 
                                                 TopoDS_Shape* tool_shape)const
 {
-  TopOpeBRep_ShapeIntersector intersector;
-  intersector.InitIntersection(*from_shape, *tool_shape);
-  BRepFeat_SplitShape splitor(*from_shape);
-  TopTools_ListOfShape list_of_edges;
-
-  int max_edge = 0;
-  TopoDS_Shape from_face; 
-  for(; intersector.MoreIntersection(); intersector.NextIntersection())
+  int num_cuts = 1;
+  while(num_cuts)
   {
-    TopoDS_Shape face1 = intersector.ChangeFacesIntersector().Face(1);
-    TopoDS_Shape face2 = intersector.ChangeFacesIntersector().Face(2);
-    BRepAlgoAPI_Section section(face1, face2);
-    TopTools_ListOfShape temp_list_of_edges;
-    temp_list_of_edges.Assign(section.SectionEdges());
-    int num_edges = temp_list_of_edges.Extent();
-    if (max_edge < num_edges)
-    {
-      list_of_edges.Assign(temp_list_of_edges);  
-      max_edge =  num_edges ;
-      from_face = face1;
-    }
-  }
+      TopOpeBRep_ShapeIntersector intersector;
+      intersector.InitIntersection(*from_shape, *tool_shape);
+      BRepFeat_SplitShape splitor(*from_shape);
+      TopTools_ListOfShape list_of_edges;
 
-  TopTools_ListIteratorOfListOfShape Itor;
-  Itor.Initialize(list_of_edges);
-  DLIList<Curve*> curve_list;
-  for(; Itor.More(); Itor.Next())
-  {
-    TopoDS_Edge edge = TopoDS::Edge(Itor.Value());
-    if (max_edge == 1) //surface solid imprint
-    {
-      splitor.Add(edge, TopoDS::Face(from_face));  
-      break;
-    }
-    Curve* curve = OCCQueryEngine::instance()->populate_topology_bridge(edge);
-    curve_list.append(curve);
+      int max_edge = 0;
+      TopoDS_Face from_face, tool_face; 
+      for(; intersector.MoreIntersection(); intersector.NextIntersection())
+	{
+	  TopoDS_Shape face1 = intersector.ChangeFacesIntersector().Face(1);
+	  TopoDS_Shape face2 = intersector.ChangeFacesIntersector().Face(2);
+	  BRepAlgoAPI_Section section(face1, face2);
+	  TopTools_ListOfShape temp_list_of_edges;
+	  temp_list_of_edges.Assign(section.SectionEdges());
+	  int num_edges = temp_list_of_edges.Extent();
+	  if (max_edge < num_edges)
+	    {
+	      list_of_edges.Assign(temp_list_of_edges);  
+	      max_edge =  num_edges ;
+	      from_face = TopoDS::Face(face1);
+              tool_face = TopoDS::Face(face2);
+	    }
+	}
+
+      TopTools_ListIteratorOfListOfShape Itor;
+      Itor.Initialize(list_of_edges);
+      DLIList<Curve*> curve_list;
+      for(; Itor.More(); Itor.Next())
+      {
+        TopoDS_Edge edge = TopoDS::Edge(Itor.Value());
+      	//check if the edge is on from_face edges, add such edge on existing 
+        //edge to split it.
+	TopExp_Explorer Ex;
+	CubitBoolean added = CUBIT_FALSE;
+	for (Ex.Init(from_face, TopAbs_EDGE); Ex.More(); Ex.Next())
+	{
+	  TopoDS_Edge from_edge = TopoDS::Edge(Ex.Current());
+          TopOpeBRep_ShapeIntersector intersector;
+   	  intersector.InitIntersection(edge, from_edge, tool_face, from_face);
+	  for(; intersector.MoreIntersection(); intersector.NextIntersection())
+   	  {
+            TopoDS_Shape section_shape = intersector.CurrentGeomShape(1);
+            TopExp_Explorer Ex;
+            int num_edges = 0;
+            for (Ex.Init(section_shape, TopAbs_EDGE); Ex.More(); Ex.Next())
+              num_edges++;
+	    if(num_edges== 1) //overlap
+ 	    {
+	      added = CUBIT_TRUE;
+   	      splitor.Add(edge, from_edge);
+	      max_edge--;
+	      break;
+	    }
+	  }
+	  if(added)
+	    continue;
+        } 
+	Curve* curve = OCCQueryEngine::instance()->populate_topology_bridge(edge);
+	curve_list.append(curve);
+      }
+      DLIList<DLIList<TopoDS_Edge*>*> edge_lists;
+      if (max_edge > 1)
+	{      
+	  sort_curves(curve_list, edge_lists); 
+	  DLIList<TopoDS_Edge*>* edge_list;
+	  edge_list = edge_lists.pop();
+	  BRepBuilderAPI_MakeWire myWire;
+	  for(int i = 0; i < edge_list->size(); i++)
+	    {
+	      TopoDS_Edge e = *(edge_list->get_and_step());
+	      myWire.Add(e); 
+	    }
+	  splitor.Add(myWire.Wire(),from_face);
+	} 
+      splitor.Build();
+      if(splitor.IsDone())
+	delete from_shape;
+      from_shape = new TopoDS_Shape(splitor.Shape());
+      if(edge_lists.size()==0)
+	num_cuts--;
   }
-  if (max_edge > 1)
-  {      
-    DLIList<DLIList<TopoDS_Edge*>*> edge_lists;
-    CubitStatus stat = sort_curves(curve_list, edge_lists); 
-    if (!stat)
-    {
-      PRINT_ERROR("can't do solid solid imprint without a closed loop.\n");
-      return CUBIT_FAILURE;
-    }  
-    assert(edge_lists.size() == 1);
-    DLIList<TopoDS_Edge*>* edge_list;
-    edge_list = edge_lists.get();
-    BRepBuilderAPI_MakeWire myWire;
-    for(int i = 0; i < edge_list->size(); i++)
-    {
-      TopoDS_Edge e = *(edge_list->get_and_step());
-      myWire.Add(e); 
-    }
-    splitor.Add(myWire.Wire(),TopoDS::Face(from_face));
-  } 
-  splitor.Build();
-  if(splitor.IsDone())
-    delete from_shape;
-  from_shape = new TopoDS_Shape(splitor.Shape());
   /*
   TopExp_Explorer Ex;
   int num_face = 0;

Modified: cgm/trunk/test/modify.cpp
===================================================================
--- cgm/trunk/test/modify.cpp	2008-03-27 17:39:57 UTC (rev 1709)
+++ cgm/trunk/test/modify.cpp	2008-03-27 18:53:17 UTC (rev 1710)
@@ -183,14 +183,33 @@
       gti->delete_RefEntity( free_entities.get_and_step());
     }
 
+  //test for cylinder making
+  Body* from_body = gmti->cylinder(10, 4, 3, 2);
+  Body* from_body2 = gmti->cylinder(8, 4, 2, 0);
+  Body* tool_body = gmti->cylinder(10, 1, 1, 1);
+  double d;
+  d = from_body->measure(); //d = 219.91
+  d = from_body2->measure();//d = 67.02
+  d = tool_body->measure(); //d = 31.41
+
+  bodies.clean_out();
+  gti->bodies(bodies);
+  //delete all entities
+  gti->delete_Body(bodies); 
+
   //test for subtract
-  Body* from_body = gmti->brick(10, 10, 10);
-  Body* tool_body = gmti->brick(1, 1, 1);  
+  from_body = gmti->brick(10, 10, 10);
+  from_body2 = gmti->brick(4, 4, 4);
+  tool_body = gmti->brick(1, 1, 1);  
+  CubitVector v_move(1,0,0);
+  gti->translate(from_body2,v_move);
   DLIList<Body*> from_bodies;
   from_bodies.append(from_body);
+  from_bodies.append(from_body2);
   DLIList<Body*>  new_bodies;
   rsl = gmti->subtract(tool_body, from_bodies, new_bodies, 
-                       CUBIT_FALSE, CUBIT_FALSE);
-  double d = new_bodies.get()->measure();
+                       CUBIT_TRUE, CUBIT_FALSE);
+  d = new_bodies.step_and_get()->measure();
+  v = new_bodies.get()->center_point();
   return stat;
 }




More information about the cgma-dev mailing list