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

janehu at mcs.anl.gov janehu at mcs.anl.gov
Mon Mar 10 13:08:33 CDT 2008


Author: janehu
Date: 2008-03-10 13:08:33 -0500 (Mon, 10 Mar 2008)
New Revision: 1640

Added:
   cgm/trunk/test/modify.cpp
Modified:
   cgm/trunk/geom/OCC/OCCModifyEngine.cpp
   cgm/trunk/test/Makefile.am
Log:
Fine tuned stitch_surfs; Added test case for it.

Modified: cgm/trunk/geom/OCC/OCCModifyEngine.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCModifyEngine.cpp	2008-03-07 19:56:28 UTC (rev 1639)
+++ cgm/trunk/geom/OCC/OCCModifyEngine.cpp	2008-03-10 18:08:33 UTC (rev 1640)
@@ -1453,20 +1453,13 @@
   TopoDS_Face* second_face = NULL;
   TopoDS_Face* new_face = NULL ;
   CubitBoolean disconnected = CUBIT_FALSE;
-  DLIList<TopoDS_Face*>disconnected_faces;
   TopoDS_Shape fusion;
   int count = 0;
   for(int i = 0; i < faces_to_stitch.size(); i++)
   {
-     if (count > 0 && disconnected)
-     {
-       first_face = faces_to_stitch[i];
-       disconnected = CUBIT_FALSE;
-     }
-     else if (count > 0 && disconnected == CUBIT_FALSE)
-     {
+     if (count > 0)
        first_face = new_face;
-     }
+     
      for(int j = i + 1; j < faces_to_stitch.size(); j++)
      {
        second_face = faces_to_stitch[j];
@@ -1489,35 +1482,28 @@
 	 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)  
      {
-       //save the first_face for building the body
-       disconnected_faces.append(first_face);
+       //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;
      }
   }
-  if (disconnected) //last one
-    disconnected_faces.append(second_face); 
 
-  if(disconnected_faces.size() == 0)
-  {
-    Surface* surface = OCCQueryEngine::instance()->
-       populate_topology_bridge(*new_face, CUBIT_TRUE);
+  Surface* surface = OCCQueryEngine::instance()->
+      populate_topology_bridge(*new_face, CUBIT_TRUE);
 
-    stitched_body = CAST_TO(surface, OCCSurface)->my_body(); 
-    //delete all original surfaces
-    OCCQueryEngine::instance()->delete_solid_model_entities(surf_bodies);  
-    return CUBIT_SUCCESS; 
-  }
-
-  //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;
+  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/test/Makefile.am
===================================================================
--- cgm/trunk/test/Makefile.am	2008-03-07 19:56:28 UTC (rev 1639)
+++ cgm/trunk/test/Makefile.am	2008-03-10 18:08:33 UTC (rev 1640)
@@ -16,7 +16,7 @@
   TESTS += webcut
 endif
 if WITH_OCC
-  TESTS += makept
+  TESTS += modify makept
 endif
 
 CPPFLAGS += -DSRCDIR=@srcdir@
@@ -24,6 +24,7 @@
 
 webcut_SOURCES = webcut.cpp
 makept_SOURCES = makept.cpp
+modify_SOURCES = modify.cpp
 LDADD = ../geom/virtual/libcubit_virtual.la \
         ../geom/facetbool/libcubit_facetbool.la \
         ../geom/Cholla/libcholla.la \

Added: cgm/trunk/test/modify.cpp
===================================================================
--- cgm/trunk/test/modify.cpp	                        (rev 0)
+++ cgm/trunk/test/modify.cpp	2008-03-10 18:08:33 UTC (rev 1640)
@@ -0,0 +1,159 @@
+/**
+ * \file makept.cpp
+ *
+ * \brief makept, another simple C++ driver for CGM
+ *
+ * This program acts as a simple driver for CGM.  It reads in a geometry,
+ * and performs varies checks for bodies, surfaces, curves and vertices.
+ */
+#include "config.h"
+#include "CpuTimer.hpp"
+#include "GeometryModifyTool.hpp"
+#include "GeometryQueryTool.hpp"
+#include "OCCQueryEngine.hpp"
+#include "CubitUtil.hpp"
+#include "CubitMessage.hpp"
+#include "CubitDefines.h"
+#include "RefEntity.hpp"
+#include "Body.hpp"
+#include "RefVolume.hpp"
+#include "RefFace.hpp"
+#include "RefEdge.hpp"
+#include "RefVertex.hpp"
+#include "CubitObserver.hpp"
+#include "CastTo.hpp"
+#include "OCCModifyEngine.hpp"
+#include "AppUtil.hpp"
+#include "RefEntityFactory.hpp"
+#include "RefEdge.hpp"
+#include "BodySM.hpp"
+#include "OCCBody.hpp"
+#include "OCCSurface.hpp"
+#include "OCCCurve.hpp"
+
+// forward declare some functions used and defined later
+CubitStatus read_geometry(int, char **);
+CubitStatus make_Point();
+// macro for printing a separator line
+#define PRINT_SEPARATOR   PRINT_INFO("=======================================\n");
+
+
+// main program - initialize, then send to proper function
+int main (int argc, char **argv)
+{
+
+  CubitObserver::init_static_observers();
+    // Initialize the GeometryTool
+  
+  CGMApp::instance()->startup( argc, argv );
+  OCCQueryEngine::instance();
+  OCCModifyEngine::instance();
+
+    // If there aren't any file arguments, print usage and exit
+  //if (argc == 1) {
+  //  PRINT_INFO("Usage: mergechk <geom_file> [<geom_file> ...]\n");
+  //  exit(0);
+  //}
+  
+  CubitStatus status = CUBIT_SUCCESS;
+
+
+
+  //Do make point.
+  status = make_Point();
+  if (status == CUBIT_FAILURE) 
+     PRINT_INFO("Operation Failed");
+
+  int ret_val = ( CubitMessage::instance()->error_count() );
+  if ( ret_val > 0 )
+  {
+    PRINT_ERROR("Errors found during Mergechk session.\n");
+  }
+  return ret_val;
+  
+}
+
+/// attribs module: list, modify attributes in a give model or models
+/// 
+/// Arguments: file name(s) of geometry files in which to look
+///
+CubitStatus read_geometry(int num_files, char **argv) 
+{
+  CubitStatus status = CUBIT_SUCCESS;
+  GeometryQueryTool *gti = GeometryQueryTool::instance();
+  assert(gti);
+  int i;
+  
+  PRINT_SEPARATOR;
+
+  for (i = 0; i < num_files; i++) {
+    status = gti->import_solid_model(argv[i], "OCC");
+    if (status != CUBIT_SUCCESS) {
+      PRINT_ERROR("Problems reading geometry file %s.\n", argv[i]);
+    }
+  }
+  PRINT_SEPARATOR;
+
+  return CUBIT_SUCCESS;
+}
+
+CubitStatus make_Point()
+{
+  GeometryQueryTool *gti = GeometryQueryTool::instance();
+  GeometryModifyTool *gmti = GeometryModifyTool::instance();
+
+  OCCQueryEngine::instance();
+  OCCModifyEngine::instance();
+
+  Body* body = gmti->brick(10, 10, 10);
+  BodySM* bodysm = body->get_body_sm_ptr();
+  DLIList<OCCSurface*> surfaces;
+  CAST_TO(bodysm, OCCBody)->get_all_surfaces(surfaces);  
+  DLIList<RefFace*> ref_faces;
+  body->ref_faces(ref_faces);
+  
+
+  DLIList<RefFace*> faces_to_stitch;
+  for(int i = 0 ; i < ref_faces.size(); i++)
+  {
+    RefFace* refface = gmti->make_RefFace(ref_faces.get_and_step());
+    if(refface)
+	faces_to_stitch.append(refface);
+  }
+
+  DLIList<BodySM*> bodysm_list;
+  for(int i = 0; i < faces_to_stitch.size(); i++)
+  {
+    //move each refface by (15,0,0)
+    RefFace* refface = faces_to_stitch.get_and_step();
+    Body* body = refface->ref_volume()->get_body_ptr();
+    BodySM* bodysm = body->get_body_sm_ptr();
+    bodysm_list.append(bodysm);
+    CubitVector v(15,0,0);
+    gti->translate(body, v);
+  }
+
+  //stitch surfaces together
+  GeometryModifyEngine *gme = gmti->get_engine(surfaces.get());
+  BodySM* stitched_body = NULL;
+  CubitStatus stat = gme->stitch_surfs(bodysm_list, stitched_body);
+  Body* body2;
+  if (stat)
+    body2 = gti->make_Body(stitched_body);
+     
+  CubitVector v = body2->center_point();
+  
+  DLIList<Body*> bodies;
+  DLIList<RefEntity*>  free_entities;
+  gti->bodies(bodies);
+  gti->get_free_ref_entities(free_entities);
+  //delete all entities
+  gti->delete_Body(bodies);
+
+  for (int j = free_entities.size(); j--;)
+    {
+      gti->delete_RefEntity( free_entities.get_and_step());
+    }
+
+  return stat;
+}




More information about the cgma-dev mailing list