LCOV - code coverage report
Current view: top level - geom/OCC - OCCQueryEngine.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 1210 2010 60.2 %
Date: 2020-06-30 00:58:45 Functions: 55 93 59.1 %
Branches: 2026 5884 34.4 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : OCCQueryEngine.cpp
       3                 :            : //
       4                 :            : // Purpose       : Implementation of the OCCQueryEngine class.
       5                 :            : //                 This class provides OCC-based implementations
       6                 :            : //                 of various virtual functions in the GeometryQueryEngine
       7                 :            : //                 hierarchy.
       8                 :            : //
       9                 :            : // Special Notes :
      10                 :            : //
      11                 :            : // Creator       : David R. White
      12                 :            : //
      13                 :            : // Creation Date : 7/17/00
      14                 :            : //
      15                 :            : //-------------------------------------------------------------------------
      16                 :            : #include <Standard_Version.hxx>
      17                 :            : #include <Standard_Stream.hxx>
      18                 :            : //#include <Standard_SStream.hxx>
      19                 :            : //#include <Standard_String.hxx>
      20                 :            : //#include <stringbuf>
      21                 :            : #if OCC_VERSION_MINOR < 5
      22                 :            :   #include "TDataStd_Shape.hxx"
      23                 :            :   typedef TDataStd_Shape TDataXtd_Shape;
      24                 :            :   typedef Handle_TDataStd_Shape Handle_TDataXtd_Shape;
      25                 :            : #else
      26                 :            :   #include "TDataXtd_Shape.hxx"
      27                 :            : #endif
      28                 :            : 
      29                 :            : #include "BRep_Tool.hxx"
      30                 :            : #include "gp_Pnt.hxx"
      31                 :            : #include "gp_Ax1.hxx"
      32                 :            : #include "gp_Ax2.hxx"
      33                 :            : #include "Geom_Surface.hxx"
      34                 :            : #include "Geom_Curve.hxx"
      35                 :            : #include "Interface_Static.hxx"
      36                 :            : #include "BRepBuilderAPI.hxx"
      37                 :            : #include "BRepBuilderAPI_Transform.hxx"
      38                 :            : #include "BRepBuilderAPI_GTransform.hxx"
      39                 :            : #include "BRepBuilderAPI_ModifyShape.hxx"
      40                 :            : #include "BRepBuilderAPI_MakeSolid.hxx"
      41                 :            : #include "OCCShapeAttributeSet.hpp"
      42                 :            : //#include "OCCBinToolsShapeSet.hpp"
      43                 :            : #include "BRepBuilderAPI_MakeShell.hxx"
      44                 :            : #include "GProp_GProps.hxx"
      45                 :            : #include "BRepGProp.hxx"
      46                 :            : #include "BRepTools_WireExplorer.hxx"
      47                 :            : #include "TColgp_Array1OfPnt.hxx"
      48                 :            : #include "Poly_Array1OfTriangle.hxx"
      49                 :            : #include "Poly_Triangle.hxx"
      50                 :            : #include "BRepAlgoAPI_BooleanOperation.hxx"
      51                 :            : #include "Handle_Poly_Triangulation.hxx"
      52                 :            : #include "GCPnts_TangentialDeflection.hxx"
      53                 :            : #include "BRepAdaptor_Curve.hxx"
      54                 :            : #include "TopExp.hxx"
      55                 :            : #ifdef HAVE_OCC_STEP
      56                 :            : #  include "STEPControl_Reader.hxx"
      57                 :            : #  include "STEPControl_Writer.hxx"
      58                 :            : #  include "STEPControl_StepModelType.hxx"
      59                 :            : #endif
      60                 :            : #ifdef HAVE_OCC_IGES
      61                 :            : #  include "IGESControl_Reader.hxx"
      62                 :            : #  include "IGESControl_Writer.hxx"
      63                 :            : #endif
      64                 :            : #include "IFSelect_ReturnStatus.hxx"
      65                 :            : #include "BndLib_Add3dCurve.hxx"
      66                 :            : #include "Poly_Polygon3D.hxx"
      67                 :            : #include "Handle_Poly_Polygon3D.hxx"
      68                 :            : #include "BRepMesh_FastDiscret.hxx"
      69                 :            : #include "OCCQueryEngine.hpp"
      70                 :            : #include "OCCModifyEngine.hpp"
      71                 :            : #include "Poly_Triangulation.hxx"
      72                 :            : #include "TopologyEntity.hpp"
      73                 :            : #include "TopologyBridge.hpp"
      74                 :            : #include "RefEntity.hpp"
      75                 :            : #include "Body.hpp"
      76                 :            : #include "Shell.hpp"
      77                 :            : #include "Loop.hpp"
      78                 :            : #include "Chain.hpp"
      79                 :            : #include "RefVolume.hpp"
      80                 :            : #include "RefFace.hpp"
      81                 :            : #include "RefEdge.hpp"
      82                 :            : #include "RefVertex.hpp"
      83                 :            : #include "GeometryEntity.hpp"
      84                 :            : #include "DLIList.hpp"
      85                 :            : #include "CubitBox.hpp"
      86                 :            : #include "CubitString.hpp"
      87                 :            : #include "OCCPoint.hpp"
      88                 :            : #include "OCCCurve.hpp"
      89                 :            : #include "OCCCoEdge.hpp"
      90                 :            : #include "OCCLoop.hpp"
      91                 :            : #include "OCCSurface.hpp"
      92                 :            : #include "OCCShell.hpp"
      93                 :            : #include "OCCLump.hpp"
      94                 :            : #include "OCCBody.hpp"
      95                 :            : #include "OCCAttribSet.hpp"
      96                 :            : #include "GMem.hpp"
      97                 :            : #include "GeometryQueryTool.hpp"
      98                 :            : #include "CubitObserver.hpp"
      99                 :            : #include "GfxDebug.hpp"
     100                 :            : #include <stdio.h>
     101                 :            : #include <errno.h>
     102                 :            : 
     103                 :            : #include <BRep_Builder.hxx>
     104                 :            : #include <BRepTools.hxx>
     105                 :            : #include <TopExp_Explorer.hxx>
     106                 :            : #include <TopoDS.hxx>
     107                 :            : #include "TopoDS_Compound.hxx"
     108                 :            : #include <TopoDS_CompSolid.hxx>
     109                 :            : #include <TopoDS_Solid.hxx>
     110                 :            : #include <TopoDS_Shell.hxx>
     111                 :            : #include <TopoDS_Face.hxx>
     112                 :            : #include <TopoDS_Wire.hxx>
     113                 :            : #include <TopoDS_Edge.hxx>
     114                 :            : #include <TopoDS_Vertex.hxx>
     115                 :            : #include <Bnd_Box.hxx>
     116                 :            : #include <BndLib_AddSurface.hxx>
     117                 :            : #include <Precision.hxx>
     118                 :            : #include <BRepAdaptor_Surface.hxx>
     119                 :            : #include <TDF_ChildIterator.hxx>
     120                 :            : #include <BinTools_ShapeSet.hxx>
     121                 :            : #include "Standard_Boolean.hxx"
     122                 :            : 
     123                 :            : #include "TDF_Label.hxx"
     124                 :            : #include "TopTools_DataMapOfShapeInteger.hxx"
     125                 :            : #include "BRepExtrema_DistShapeShape.hxx"
     126                 :            : #include "BRepAlgoAPI_Section.hxx"
     127                 :            : #include "BRepBuilderAPI_MakeEdge.hxx"
     128                 :            : #include "TDocStd_Document.hxx"
     129                 :            : #include "TCollection_ExtendedString.hxx"
     130                 :            : #include "gp_Lin.hxx"
     131                 :            : using namespace NCubitFile;
     132                 :            : 
     133                 :            : #include "CGMEngineDynamicLoader.hpp"
     134                 :            : 
     135                 :            : 
     136                 :          0 : CGM_ENGINE_EXPORT_CREATE_GQE(OpenCascade)
     137                 :            : {
     138                 :          0 :   return OCCQueryEngine::instance();
     139                 :            : }
     140                 :            : 
     141                 :            : OCCQueryEngine* OCCQueryEngine::instance_ = NULL;
     142                 :            : 
     143                 :            : typedef std::map<int, TopologyBridge*>::value_type valType;
     144                 :            : typedef std::map<int, TDF_Label>::value_type labType;
     145                 :            : int OCCQueryEngine::iTotalTBCreated = 0;
     146                 :            : int OCCQueryEngine::total_coedges = 0;
     147                 :            : #define NUM_PTS_UV 30
     148                 :            : //================================================================================
     149                 :            : // Description:
     150                 :            : // Author     :
     151                 :            : // Date       :
     152                 :            : //================================================================================
     153                 :    6633135 : OCCQueryEngine* OCCQueryEngine::instance()
     154                 :            : {
     155         [ +  + ]:    6633135 :   if (instance_ == NULL ) {
     156         [ +  - ]:        841 :     instance_ = new OCCQueryEngine;
     157                 :            :   }
     158                 :    6633135 :   return instance_;
     159                 :            : }
     160                 :            : 
     161                 :            : //================================================================================
     162                 :            : // Description:  default constructor
     163                 :            : // Author     :
     164                 :            : // Date       :
     165                 :            : //================================================================================
     166 [ +  - ][ +  - ]:       1682 : OCCQueryEngine::OCCQueryEngine()
     167                 :            : {
     168 [ +  - ][ +  - ]:        841 :   GeometryQueryTool::instance()->add_gqe( this );
     169 [ +  - ][ +  - ]:        841 :   OCCMap = new TopTools_DataMapOfShapeInteger;
     170 [ +  - ][ +  - ]:        841 :   OccToCGM = new std::map<int, TopologyBridge*>;
     171 [ +  - ][ +  - ]:        841 :   Shape_Label_Map = new std::map<int, TDF_Label>;
     172 [ +  - ][ +  - ]:        841 :   BodyList = new DLIList<OCCBody*>;
     173 [ +  - ][ +  - ]:        841 :   WireList = new DLIList<OCCLoop*>;
     174 [ +  - ][ +  - ]:        841 :   SurfaceList = new DLIList<OCCSurface*>;
     175 [ +  - ][ +  - ]:        841 :   CurveList = new DLIList<OCCCurve*>;
     176         [ +  - ]:        841 :   CubitString name("Doc");
     177 [ +  - ][ +  - ]:       1682 :   TCollection_ExtendedString xString((Standard_CString)name.c_str(), CUBIT_TRUE);
                 [ +  - ]
     178 [ +  - ][ +  - ]:        841 :   MyDF = new TDocStd_Document(xString);
                 [ +  - ]
     179 [ +  - ][ +  - ]:        841 :   mainLabel = MyDF->Main();
     180         [ +  - ]:        841 :   EXPORT_ATTRIB = CUBIT_TRUE;
     181                 :        841 : }
     182                 :            : 
     183                 :            : //================================================================================
     184                 :            : // Description:  destructor
     185                 :            : // Author     :
     186                 :            : // Date       :
     187                 :            : //================================================================================
     188         [ +  - ]:        813 : OCCQueryEngine::~OCCQueryEngine()
     189                 :            : {
     190                 :        271 :   instance_ = NULL;
     191 [ +  - ][ +  - ]:        271 :   delete OCCMap;
                 [ +  - ]
     192 [ +  - ][ +  - ]:        271 :   delete OccToCGM;
     193 [ +  - ][ +  - ]:        271 :   delete Shape_Label_Map;
     194 [ +  - ][ +  - ]:        271 :   delete BodyList;
     195 [ +  - ][ +  - ]:        271 :   delete WireList;
     196 [ +  - ][ +  - ]:        271 :   delete SurfaceList;
     197 [ +  - ][ +  - ]:        271 :   delete CurveList;
     198         [ -  + ]:        542 : }
     199                 :            : 
     200                 :          0 : int OCCQueryEngine::get_major_version()
     201                 :            : {
     202                 :          0 :   return OCC_VERSION_MAJOR;
     203                 :            : }
     204                 :            : 
     205                 :          0 : int OCCQueryEngine::get_minor_version()
     206                 :            : {
     207                 :          0 :   return OCC_VERSION_MINOR;
     208                 :            : }
     209                 :            : 
     210                 :          0 : int OCCQueryEngine::get_subminor_version()
     211                 :            : {
     212                 :          0 :   return OCC_VERSION_MAINTENANCE;
     213                 :            : }
     214                 :            : 
     215                 :        231 : CubitString OCCQueryEngine::get_engine_version_string()
     216                 :            : {
     217 [ +  - ][ +  - ]:        231 :   return CubitString("OpenCascade ") + OCC_VERSION_STRING;
                 [ +  - ]
     218                 :            : }
     219                 :            : 
     220                 :            : //================================================================================
     221                 :            : // Description:
     222                 :            : // Author     :
     223                 :            : // Date       :
     224                 :            : //================================================================================
     225                 :          0 : const type_info& OCCQueryEngine::entity_type_info() const
     226                 :            : {
     227                 :          0 :   return typeid(OCCQueryEngine);
     228                 :            : }
     229                 :            : 
     230                 :            : //================================================================================
     231                 :            : // Description: reflect body about an axis
     232                 :            : // Author     : sjowen
     233                 :            : // Date       : 9/7/01
     234                 :            : //================================================================================
     235                 :         11 : CubitStatus OCCQueryEngine::reflect( BodySM *bodysm,
     236                 :            :                                      const CubitVector& axis)
     237                 :            : {
     238         [ -  + ]:         11 :   OCCBody *body = CAST_TO(bodysm, OCCBody);
     239         [ -  + ]:         11 :   if (!body)
     240                 :            :     {
     241 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Attempt to reflect OCC-based geometry Body.  This body is not OCCBody.");
     242                 :          0 :       return CUBIT_FAILURE;
     243                 :            :     }
     244                 :            : 
     245                 :         11 :   body->reflect( axis.x(), axis.y(), axis.z() );
     246                 :            : 
     247                 :         11 :   return CUBIT_SUCCESS;
     248                 :            : }
     249                 :            : 
     250                 :            : 
     251                 :            : //================================================================================
     252                 :            : // Description:  This function queries OCC for the necessary facets
     253                 :            : //               information needed in facetting a RefFace.  This
     254                 :            : //               information is stored and output in gMem.  The
     255                 :            : //               number of triangles, points and facets are also
     256                 :            : //               output.
     257                 :            : //               normal_tolerance is in degree.
     258                 :            : //               max_edge_length is not considered in getting graphics.
     259                 :            : // Author     :  Jane Hu
     260                 :            : // Date       :  10/25/07
     261                 :            : //================================================================================
     262                 :       2943 : CubitStatus OCCQueryEngine::get_graphics( Surface* surface_ptr,
     263                 :            :                                           GMem* g_mem,
     264                 :            :                                           unsigned short normal_tolerance,
     265                 :            :                                           double distance_tolerance,
     266                 :            :                                           double max_edge_length) const
     267                 :            : {
     268                 :            :   // Because this may be unnecessarily called twice,
     269                 :            :   // say there is one triangle.
     270         [ -  + ]:       2943 :   if (!g_mem)
     271                 :          0 :       return CUBIT_SUCCESS;
     272                 :            : 
     273         [ -  + ]:       2943 :   if(max_edge_length > get_sme_resabs_tolerance())
     274                 :            :   {
     275 [ #  # ][ #  # ]:          0 :     PRINT_WARNING("OCC surface's tessilation doesn't consider edge_length.\n");
     276 [ #  # ][ #  # ]:          0 :     PRINT_WARNING("max_edge_length argument is ignored. \n");
     277                 :            :   }
     278                 :            : 
     279         [ -  + ]:       2943 :   OCCSurface *occ_surface_ptr = CAST_TO(surface_ptr, OCCSurface);
     280                 :       2943 :   TopoDS_Face * Topo_Face = occ_surface_ptr->get_TopoDS_Face();
     281                 :            : 
     282                 :       2943 :   return get_graphics( Topo_Face, g_mem, normal_tolerance, distance_tolerance, max_edge_length );
     283                 :            : }
     284                 :            : 
     285                 :       2943 : CubitStatus OCCQueryEngine::get_graphics( TopoDS_Face* face_ptr,
     286                 :            :                                           GMem* g_mem,
     287                 :            :                                           unsigned short normal_tolerance,
     288                 :            :                                           double distance_tolerance,
     289                 :            :                                          double max_edge_length) const
     290                 :            : {
     291         [ -  + ]:       2943 :   if (!face_ptr)
     292                 :          0 :     return CUBIT_FAILURE;
     293                 :            : 
     294         [ +  - ]:       2943 :   TopLoc_Location L;
     295 [ +  - ][ +  - ]:       5886 :   Handle_Poly_Triangulation facets = BRep_Tool::Triangulation(*face_ptr, L);
                 [ +  - ]
     296                 :            : 
     297         [ +  - ]:       2943 :   gp_Trsf tf = L.Transformation();
     298                 :            : 
     299 [ +  - ][ +  + ]:       2943 :   if(facets.IsNull() || facets->NbTriangles() == 0)
         [ +  - ][ +  - ]
         [ -  + ][ +  + ]
     300                 :            :   {
     301                 :            :     //do triangulation
     302         [ +  + ]:       2412 :     if(distance_tolerance <= 0.0)
     303                 :         66 :       distance_tolerance = 0.01;
     304                 :       2412 :     double angle  = CUBIT_PI * normal_tolerance/180;
     305         [ +  - ]:       2412 :     BRepAdaptor_Surface asurface(*face_ptr);
     306         [ +  - ]:       2412 :     Bnd_Box aBox;
     307 [ +  - ][ +  - ]:       2412 :     BndLib_AddSurface::Add(asurface, Precision::Approximation(), aBox);
     308                 :            :     BRepMesh_FastDiscret *myMesh =
     309                 :            : #if OCC_VERSION_MAJOR <= 6 && OCC_VERSION_MINOR < 8
     310                 :            :       new BRepMesh_FastDiscret(distance_tolerance, *face_ptr, aBox, angle, Standard_True, Standard_True);
     311                 :            : #else
     312 [ +  - ][ +  - ]:       2412 :       new BRepMesh_FastDiscret(*face_ptr, distance_tolerance, angle, aBox, Standard_True, Standard_True);
     313                 :            : #endif
     314 [ +  - ][ +  - ]:       2412 :     if (myMesh != NULL) delete myMesh;
                 [ +  - ]
     315 [ +  - ][ +  - ]:       2412 :     facets = BRep_Tool::Triangulation(*face_ptr, L);
     316 [ +  - ][ +  - ]:       2412 :     if(facets.IsNull() || facets->NbTriangles() == 0)
         [ +  - ][ +  - ]
         [ -  + ][ -  + ]
     317                 :            :     {
     318 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Can't get triangulation representation for this surface.\n");
         [ #  # ][ #  # ]
     319 [ +  - ][ +  - ]:       2412 :       return CUBIT_FAILURE;
     320                 :       2412 :     }
     321                 :            :   }
     322                 :            :   //if necessary, the face tolerance can be returned. now, no use.
     323                 :            :   //double tol = BRep_Tool::Tolerance(*Topo_Face);   
     324                 :            : 
     325 [ +  - ][ +  - ]:       2943 :   int  number_points = facets->NbNodes();
     326 [ +  - ][ +  - ]:       2943 :   int  number_triangles = facets->NbTriangles();
     327                 :       2943 :   int  number_facets = 4 * number_triangles; 
     328                 :            :   
     329 [ +  - ][ +  - ]:       5886 :   Poly_Array1OfTriangle triangles(0, number_triangles-1);
     330 [ +  - ][ +  - ]:       2943 :   triangles.Assign( facets->Triangles() );
                 [ +  - ]
     331 [ +  - ][ +  - ]:       2943 :   int *facetList =  new int[number_facets];
     332                 :            :   //needs to test that N1, N2, N3 index are starting from 0 to number_points-1
     333                 :            :   //otherwise needs to update either facetList or gPnts to make consistent.
     334                 :            :   //It's possible also that N's starting from 1.
     335                 :       2943 :   int minN = 100;
     336 [ +  - ][ +  + ]:    1802589 :   for (int i = 0; i < triangles.Length(); i++)
     337                 :            :     {
     338         [ +  - ]:    1799646 :       Poly_Triangle triangle = triangles.Value( i );
     339                 :            :       int N1, N2, N3;
     340         [ +  - ]:    1799646 :       triangle.Get(N1, N2, N3); 
     341                 :    1799646 :       facetList[4 * i] = 3;
     342                 :    1799646 :       facetList[4 * i + 1] = N1;
     343         [ +  + ]:    1799646 :       minN = (minN < N1 ? minN : N1);
     344                 :    1799646 :       facetList[4 * i + 2] = N2;
     345         [ +  + ]:    1799646 :       minN = (minN < N2 ? minN : N2);
     346                 :    1799646 :       facetList[4 * i + 3] = N3;
     347         [ +  + ]:    1799646 :       minN = (minN < N3 ? minN : N3);
     348                 :            :     } 
     349         [ +  - ]:       2943 :   if(minN != 0)
     350                 :            :   {
     351                 :            :     //subtract the minN from the facetList for all i+1, i+2, i+3 points
     352 [ +  - ][ +  + ]:    1802589 :     for (int i = 0; i < triangles.Length(); i++)
     353                 :            :     {
     354                 :    1799646 :       facetList[4 * i + 1] -= minN;
     355                 :    1799646 :       facetList[4 * i + 2] -= minN;
     356                 :    1799646 :       facetList[4 * i + 3] -= minN;
     357                 :            :     }
     358                 :            :   }
     359         [ +  - ]:       2943 :   g_mem->replace_facet_list( facetList, number_facets, number_facets); 
     360                 :            : 
     361 [ +  - ][ +  - ]:       5886 :   TColgp_Array1OfPnt points(0,  number_points-1);
     362 [ +  - ][ +  - ]:       2943 :   points.Assign(facets->Nodes());
                 [ +  - ]
     363 [ +  - ][ +  - ]:       2943 :   GPoint *gPnts= new GPoint[number_points];
     364         [ +  + ]:     961175 :   for (int i = 0; i < number_points ; i ++)
     365                 :            :     {
     366         [ +  - ]:     958232 :       gp_Pnt gp_pnt = points.Value(i);
     367 [ +  - ][ +  + ]:     958232 :       if( !L.IsIdentity())
     368         [ +  - ]:        264 :         gp_pnt.Transform(tf);
     369                 :            : 
     370                 :            :       GPoint gPnt;
     371         [ +  - ]:     958232 :       gPnt.x = gp_pnt.X();
     372         [ +  - ]:     958232 :       gPnt.y = gp_pnt.Y();
     373         [ +  - ]:     958232 :       gPnt.z = gp_pnt.Z();
     374                 :     958232 :       gPnts[i] = gPnt;
     375                 :            :     }
     376         [ +  - ]:       2943 :   g_mem->replace_point_list( gPnts, number_points, number_points );
     377                 :            : 
     378         [ +  - ]:       2943 :   return CUBIT_SUCCESS;
     379                 :            : }
     380                 :            : 
     381                 :            : //================================================================================
     382                 :            : // Description: This function queries OCC for the edge information
     383                 :            : //              needed in facetting a RefEdge.  This information is
     384                 :            : //              stored and output in g_mem.
     385                 :            : // Author     : Jane Hu
     386                 :            : // Date       : 10/26/07
     387                 :            : //================================================================================
     388                 :       5964 : CubitStatus OCCQueryEngine::get_graphics( Curve* curve_ptr,
     389                 :            :                                           GMem* gMem,
     390                 :            :                                           double angle_tolerance,
     391                 :            :                                           double distance_tolerance,
     392                 :            :                                           double max_edge_length ) const
     393                 :            : {
     394                 :            :   //  get the OCCCurve.
     395         [ -  + ]:       5964 :   OCCCurve *occ_curve_ptr = CAST_TO(curve_ptr,OCCCurve);
     396         [ -  + ]:       5964 :   assert (gMem);
     397                 :            : 
     398         [ -  + ]:       5964 :   if(max_edge_length > get_sme_resabs_tolerance())
     399                 :            :   {
     400 [ #  # ][ #  # ]:          0 :     PRINT_WARNING("OCC surface's tessilation doesn't consider edge_length.\n");
     401 [ #  # ][ #  # ]:          0 :     PRINT_WARNING("max_edge_length argument is ignored. \n");
     402                 :            :   }
     403                 :            :     
     404                 :       5964 :   TopoDS_Edge *edge_ptr = occ_curve_ptr->get_TopoDS_Edge();
     405                 :            : 
     406                 :       5964 :   return get_graphics( edge_ptr, gMem, angle_tolerance, distance_tolerance, max_edge_length );  
     407                 :            : }
     408                 :            : 
     409                 :            : 
     410                 :            : 
     411                 :       5964 : CubitStatus OCCQueryEngine::get_graphics( TopoDS_Edge* edge_ptr,
     412                 :            :                                           GMem* gMem,
     413                 :            :                                           double angle_tolerance,
     414                 :            :                                           double distance_tolerance,
     415                 :            :                                           double max_edge_length ) const
     416                 :            : {
     417         [ -  + ]:       5964 :   if (!edge_ptr)
     418                 :          0 :     return CUBIT_FAILURE;
     419                 :            : 
     420                 :            :   //do tessellation
     421         [ +  + ]:       5964 :   if(distance_tolerance <= 0.0)
     422                 :        132 :     distance_tolerance = 0.2;
     423         [ +  + ]:       5964 :   if(angle_tolerance == 0.0)
     424                 :        132 :     angle_tolerance = 5;
     425                 :       5964 :   double angle  = CUBIT_PI * angle_tolerance/180;
     426         [ +  - ]:       5964 :   BRepAdaptor_Curve acurve(*edge_ptr);
     427                 :            :   GCPnts_TangentialDeflection *myMesh = 
     428                 :            :         new GCPnts_TangentialDeflection(acurve, angle, 
     429 [ +  - ][ +  - ]:       5964 :                                         distance_tolerance);
     430         [ -  + ]:       5964 :   if (myMesh == NULL) 
     431                 :            :   {
     432 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("Can't tessellate for this curve.\n");
         [ #  # ][ #  # ]
     433                 :          0 :     return CUBIT_FAILURE;
     434                 :            :   }
     435         [ +  - ]:       5964 :   int num_points = myMesh->NbPoints();
     436                 :            : 
     437                 :            :   //! Note: If the polygon is closed, the point of closure is 
     438                 :            :   //! repeated at the end of its table of nodes. Thus, on a closed 
     439                 :            :   //! triangle the function NbNodes returns 4? 
     440 [ +  - ][ +  - ]:       5964 :   GPoint *gPnts= new GPoint[num_points];
     441         [ +  + ]:      41152 :   for (int i = 1; i <= num_points ; i ++)
     442                 :            :     {
     443         [ +  - ]:      35188 :       gp_Pnt gp_pnt = myMesh->Value(i);
     444                 :            :       GPoint gPnt;
     445         [ +  - ]:      35188 :       gPnt.x = gp_pnt.X();
     446         [ +  - ]:      35188 :       gPnt.y = gp_pnt.Y();
     447         [ +  - ]:      35188 :       gPnt.z = gp_pnt.Z();
     448                 :      35188 :       gPnts[i-1] = gPnt;
     449                 :            :     }
     450         [ +  - ]:       5964 :   gMem->replace_point_list( gPnts, num_points, num_points );
     451                 :            :  
     452 [ +  - ][ +  - ]:       5964 :   delete myMesh;
                 [ +  - ]
     453         [ +  - ]:       5964 :   return CUBIT_SUCCESS;
     454                 :            : }
     455                 :            : 
     456                 :            : //================================================================================
     457                 :            : // Description: Given surface and number of point on u and v parametric
     458                 :            : //              direction, find the 3-d point locations
     459                 :            : // Author     : Jane Hu
     460                 :            : // Date       : 10/22/07
     461                 :            : //================================================================================
     462                 :          0 : CubitStatus OCCQueryEngine::get_isoparametric_points(Surface* surface,
     463                 :            :                                                      int &nu, int &nv,
     464                 :            :                                                      GMem*& g_mem) const
     465                 :            : {
     466         [ #  # ]:          0 :   OCCSurface* occ_surface = CAST_TO(surface, OCCSurface);
     467         [ #  # ]:          0 :   TopoDS_Face* Tops_face = occ_surface->get_TopoDS_Face();
     468         [ #  # ]:          0 :   if (Tops_face == NULL)
     469                 :            :   {
     470 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("This surface is not OCCSurface.");
                 [ #  # ]
           [ #  #  #  # ]
     471                 :          0 :     return CUBIT_FAILURE;
     472                 :            :   }
     473         [ #  # ]:          0 :   Handle_Geom_Surface HGeom_surface = BRep_Tool::Surface(*Tops_face);
     474                 :            : 
     475                 :            :   double u1, u2, v1, v2;
     476         [ #  # ]:          0 :   BRepTools::UVBounds(*Tops_face, u1, u2, v1, v2);
     477                 :            : 
     478 [ #  # ][ #  # ]:          0 :   assert (nu > 1 && nv > 1);
     479         [ #  # ]:          0 :   if(nu <= 1)
     480                 :          0 :     nu = NUM_PTS_UV;
     481         [ #  # ]:          0 :   if(nv <= 1)
     482                 :          0 :     nv = NUM_PTS_UV;
     483 [ #  # ][ #  # ]:          0 :   g_mem = new GMem[nu];
                 [ #  # ]
           [ #  #  #  # ]
     484                 :            :  
     485                 :            : 
     486                 :            :   // calculate the nu curves
     487                 :          0 :   double interval_u = (u2-u1)/double(nu-1);
     488                 :          0 :   double interval_v = (v2 - v1)/(double)(nv - 1);
     489                 :            : 
     490         [ #  # ]:          0 :   for (int i = 0; i < nu; i++)
     491                 :            :   {
     492 [ #  # ][ #  # ]:          0 :     Handle_Geom_Curve HGeom_curve = HGeom_surface->UIso(u1 + i * interval_u); 
     493         [ #  # ]:          0 :     g_mem[i].allocate_polylines(nv-1);
     494         [ #  # ]:          0 :     for (int j = 0; j <  nv; j++)
     495                 :            :           {
     496 [ #  # ][ #  # ]:          0 :             gp_Pnt pnt = HGeom_curve->Value(v1 + j * interval_v);
     497 [ #  # ][ #  # ]:          0 :             g_mem[i].point_list()[j].x = pnt.X();
     498 [ #  # ][ #  # ]:          0 :             g_mem[i].point_list()[j].y = pnt.Y();
     499 [ #  # ][ #  # ]:          0 :             g_mem[i].point_list()[j].z = pnt.Z();
     500                 :            :           }
     501                 :          0 :     g_mem[i].pointListCount = nv;
     502         [ #  # ]:          0 :   }
     503                 :            : 
     504         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     505                 :            : }
     506                 :            : 
     507                 :          0 : CubitStatus OCCQueryEngine::get_u_isoparametric_points(Surface* surface,
     508                 :            :                                                        double v, int&n,
     509                 :            :                                                        GMem*& g_mem) const
     510                 :            : {
     511         [ #  # ]:          0 :   OCCSurface* occ_surface = CAST_TO(surface, OCCSurface);
     512         [ #  # ]:          0 :   TopoDS_Face* Tops_face = occ_surface->get_TopoDS_Face();
     513         [ #  # ]:          0 :   TopoDS_Face the_face;
     514         [ #  # ]:          0 :   if (Tops_face == NULL)
     515                 :            :     {
     516 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("This surface is not OCCSurface.");
         [ #  # ][ #  # ]
     517                 :          0 :       return CUBIT_FAILURE;
     518                 :            :     }
     519                 :            : 
     520         [ #  # ]:          0 :   the_face = *Tops_face;
     521                 :            : 
     522 [ #  # ][ #  # ]:          0 :   Handle_Geom_Surface HGeom_surface = BRep_Tool::Surface(the_face);
     523                 :            : 
     524                 :            :   //n must be given to calculate the points.
     525         [ #  # ]:          0 :   if (n <= 1)
     526                 :          0 :     n = NUM_PTS_UV;
     527                 :            :   double u1, u2, v1, v2;
     528 [ #  # ][ #  # ]:          0 :   HGeom_surface->Bounds(u1, u2, v1, v2);
     529                 :          0 :   double interval = (u2 - u1)/(n -1); 
     530                 :            :   
     531 [ #  # ][ #  # ]:          0 :   Handle_Geom_Curve HGeom_curve = HGeom_surface->VIso(v);
                 [ #  # ]
     532 [ #  # ][ #  # ]:          0 :   g_mem = new GMem;
     533         [ #  # ]:          0 :   g_mem->allocate_polylines(n-1);
     534         [ #  # ]:          0 :   for (int j = 0; j < n; j++)
     535                 :            :     {
     536 [ #  # ][ #  # ]:          0 :       gp_Pnt pnt = HGeom_curve->Value(u1 + j * interval);
     537 [ #  # ][ #  # ]:          0 :       g_mem->point_list()[j].x = pnt.X();
     538 [ #  # ][ #  # ]:          0 :       g_mem->point_list()[j].y = pnt.Y();
     539 [ #  # ][ #  # ]:          0 :       g_mem->point_list()[j].z = pnt.Z();
     540                 :            :     }
     541                 :          0 :   g_mem->pointListCount = n;
     542                 :            : 
     543         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     544                 :            : }
     545                 :            : 
     546                 :          0 : CubitStatus OCCQueryEngine::get_v_isoparametric_points(Surface* surface,
     547                 :            :                                                        double u, int&n,
     548                 :            :                                                        GMem*&g_mem) const
     549                 :            : {
     550         [ #  # ]:          0 :   OCCSurface* occ_surface = CAST_TO(surface, OCCSurface);
     551         [ #  # ]:          0 :   TopoDS_Face* Tops_face = occ_surface->get_TopoDS_Face();
     552         [ #  # ]:          0 :   TopoDS_Face the_face;
     553         [ #  # ]:          0 :   if (Tops_face == NULL)
     554                 :            :     {
     555 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("This surface is not OCCSurface.");
         [ #  # ][ #  # ]
     556                 :          0 :       return CUBIT_FAILURE;
     557                 :            :     }
     558                 :            : 
     559         [ #  # ]:          0 :   the_face = *Tops_face;
     560                 :            : 
     561 [ #  # ][ #  # ]:          0 :   Handle_Geom_Surface HGeom_surface = BRep_Tool::Surface(the_face);
     562                 :            : 
     563         [ #  # ]:          0 :   if (n <= 1)
     564                 :          0 :     n = NUM_PTS_UV;
     565                 :            :   double u1, u2, v1, v2;
     566 [ #  # ][ #  # ]:          0 :   HGeom_surface->Bounds(u1, u2, v1, v2);
     567                 :          0 :   double interval = (v2 - v1)/(n -1);
     568                 :            : 
     569 [ #  # ][ #  # ]:          0 :   Handle_Geom_Curve HGeom_curve = HGeom_surface->UIso(u);
                 [ #  # ]
     570 [ #  # ][ #  # ]:          0 :   g_mem = new GMem;
     571         [ #  # ]:          0 :   g_mem->allocate_polylines(n-1);
     572         [ #  # ]:          0 :   for (int j = 0; j < n; j++)
     573                 :            :     {
     574 [ #  # ][ #  # ]:          0 :       gp_Pnt pnt = HGeom_curve->Value(v1 + j * interval);
     575 [ #  # ][ #  # ]:          0 :       g_mem->point_list()[j].x = pnt.X();
     576 [ #  # ][ #  # ]:          0 :       g_mem->point_list()[j].y = pnt.Y();
     577 [ #  # ][ #  # ]:          0 :       g_mem->point_list()[j].z = pnt.Z();
     578                 :            :     }
     579                 :          0 :   g_mem->pointListCount = n;
     580                 :            : 
     581         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     582                 :            : }
     583                 :            : 
     584                 :            : //================================================================================
     585                 :            : // Description:
     586                 :            : // Author     :
     587                 :            : // Date       :
     588                 :            : //================================================================================
     589                 :          0 : CubitStatus OCCQueryEngine::transform_vec_position( CubitVector const& ,
     590                 :            :                                                     BodySM *,
     591                 :            :                                                     CubitVector & ) const
     592                 :            : {
     593                 :            :   //Nobody is using this function in  yet.
     594 [ #  # ][ #  # ]:          0 :   PRINT_ERROR("Option not supported for OCC based geometry.\n");
     595                 :          0 :   return CUBIT_FAILURE;
     596                 :            : }
     597                 :            : 
     598                 :            : //================================================================================
     599                 :            : // Description:  Calculate for intersection points between a curve and 
     600                 :            : //               a segment defined by two points or
     601                 :            : //               between two curves or between a curve and a surface.
     602                 :            : // Author     :  Jane Hu
     603                 :            : // Date       :  10/15/07
     604                 :            : //================================================================================
     605                 :          0 : CubitStatus OCCQueryEngine::get_intersections( Curve* curve, 
     606                 :            :                                                CubitVector& point1,
     607                 :            :                                                CubitVector& point2,
     608                 :            :                                                DLIList<CubitVector>& intscts,
     609                 :            :                                                CubitBoolean bounded,
     610                 :            :                                                CubitBoolean closest)
     611                 :            : {
     612         [ #  # ]:          0 :   OCCCurve *occ_curve =  CAST_TO(curve, OCCCurve);
     613         [ #  # ]:          0 :   if (occ_curve == NULL)
     614                 :            :     {
     615 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Option not supported for non-occ based geometry.\n");
     616                 :          0 :       return CUBIT_FAILURE;
     617                 :            :     }
     618                 :            : 
     619         [ #  # ]:          0 :   OCCPoint *pt1 = new OCCPoint(point1);
     620         [ #  # ]:          0 :   OCCPoint *pt2 = new OCCPoint(point2);
     621                 :            :   Curve *curve2 = 
     622                 :          0 :     OCCModifyEngine::instance()->make_Curve(pt1, pt2);
     623         [ #  # ]:          0 :   if (curve2 == NULL)
     624                 :            :     {
     625 [ #  # ][ #  # ]:          0 :       PRINT_ERROR( "Unable to create OCC EDGE from points\n" );
     626                 :          0 :       return CUBIT_FAILURE;
     627                 :            :     }
     628                 :            :   
     629         [ #  # ]:          0 :   OCCCurve *occ_curve2 = CAST_TO(curve2, OCCCurve);
     630                 :          0 :   CubitStatus stat = get_intersections(occ_curve, occ_curve2, intscts, bounded, closest);
     631                 :          0 :   delete_solid_model_entities(occ_curve2);
     632                 :          0 :   return stat;
     633                 :            : }
     634                 :            : 
     635                 :        209 : CubitStatus OCCQueryEngine::get_intersections( Curve* curve1, 
     636                 :            :                                                Curve* curve2,
     637                 :            :                                                DLIList<CubitVector>& intscts,
     638                 :            :                                                CubitBoolean bounded,
     639                 :            :                                                CubitBoolean closest)
     640                 :            : {
     641                 :            :   //If this function has shortcomes in using BRepExtrema_DistShapeShape,
     642                 :            :   //look also at IntTools_EdgeEdge.
     643         [ -  + ]:        209 :   OCCCurve *occ_curve1 =  CAST_TO(curve1, OCCCurve);
     644         [ -  + ]:        209 :   if (occ_curve1 == NULL)
     645                 :            :     {
     646 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Option not supported for non-occ based geometry.\n");
         [ #  # ][ #  # ]
     647                 :          0 :       return CUBIT_FAILURE;
     648                 :            :     }
     649                 :            : 
     650         [ -  + ]:        209 :   OCCCurve *occ_curve2 =  CAST_TO(curve2, OCCCurve);
     651         [ -  + ]:        209 :   if (occ_curve2 == NULL)
     652                 :            :     {
     653 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Option not supported for non-occ based geometry.\n");
         [ #  # ][ #  # ]
     654                 :          0 :       return CUBIT_FAILURE;
     655                 :            :     }
     656                 :            : 
     657                 :            :   //currently, there's no effect on 'closest' argument or bounded.
     658                 :            :   BRepExtrema_DistShapeShape distShapeShape(
     659         [ +  - ]:        209 :                                             *(occ_curve1->get_TopoDS_Edge()),
     660 [ +  - ][ +  - ]:        418 :                                             *(occ_curve2->get_TopoDS_Edge()));
     661                 :            : 
     662                 :            :   //distShapeShape.Perform();
     663 [ +  - ][ -  + ]:        209 :   if (!distShapeShape.IsDone())
     664                 :            :     {
     665 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Cannot calculate the intersection points for the input curves.\n");
         [ #  # ][ #  # ]
     666                 :          0 :       return CUBIT_FAILURE;
     667                 :            :     }
     668                 :            :   
     669 [ +  - ][ +  - ]:        209 :   if (distShapeShape.Value() < get_sme_resabs_tolerance())
                 [ +  + ]
     670                 :            :     {
     671         [ +  - ]:        132 :       int numPnt = distShapeShape.NbSolution();
     672         [ +  + ]:        264 :       for (int i = 1; i <= numPnt; i++)
     673                 :            :         {
     674         [ +  - ]:        132 :           gp_Pnt aPoint = distShapeShape.PointOnShape1(i);
     675                 :            :      
     676 [ +  - ][ +  - ]:        132 :           CubitVector cv(aPoint.X(), aPoint.Y(), aPoint.Z());
         [ +  - ][ +  - ]
     677         [ +  - ]:        132 :           intscts.append(cv);
     678                 :            :         }
     679                 :            :     }
     680         [ +  - ]:        209 :   return CUBIT_SUCCESS;
     681                 :            : }
     682                 :            : 
     683                 :            : CubitStatus
     684                 :         11 : OCCQueryEngine::get_intersections( Curve* curve, Surface* surface,
     685                 :            :                                    DLIList<CubitVector>& intscts,
     686                 :            :                                    CubitBoolean bounded )
     687                 :            : {
     688                 :            :   // There's no effect of bounded =  false. 
     689         [ -  + ]:         11 :   OCCCurve *occ_curve =  CAST_TO(curve, OCCCurve);
     690         [ -  + ]:         11 :   if (occ_curve == NULL)
     691                 :            :     {
     692 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Option not supported for non-occ based geometry.\n");
         [ #  # ][ #  # ]
     693                 :          0 :       return CUBIT_FAILURE;
     694                 :            :     }
     695                 :            : 
     696         [ -  + ]:         11 :   OCCSurface *occ_surface =  CAST_TO(surface, OCCSurface);
     697         [ -  + ]:         11 :   if (occ_surface == NULL)
     698                 :            :     {
     699 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Option not supported for non-occ based geometry.\n");
         [ #  # ][ #  # ]
     700                 :          0 :       return CUBIT_FAILURE;
     701                 :            :     }
     702                 :            :    
     703                 :            :   //currently, there's no effect on 'closest' argument or bounded.
     704         [ +  - ]:         11 :   BRepExtrema_DistShapeShape distShapeShape(*(occ_curve->get_TopoDS_Edge()),
     705 [ +  - ][ +  - ]:         22 :                                             *(occ_surface->get_TopoDS_Face()));
     706                 :            : 
     707                 :            :   //distShapeShape.Perform();
     708 [ +  - ][ -  + ]:         11 :   if (!distShapeShape.IsDone())
     709                 :            :     {
     710 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Cannot calculate the intersection points for the input curve and surface.\n");
         [ #  # ][ #  # ]
     711                 :          0 :       return CUBIT_FAILURE;
     712                 :            :     }
     713                 :            :   
     714 [ +  - ][ +  - ]:         11 :   if (distShapeShape.Value() < get_sme_resabs_tolerance())
                 [ -  + ]
     715                 :            :     {
     716         [ #  # ]:          0 :       int numPnt = distShapeShape.NbSolution();
     717         [ #  # ]:          0 :       for (int i = 1; i <= numPnt; i++)
     718                 :            :         {
     719         [ #  # ]:          0 :           gp_Pnt aPoint = distShapeShape.PointOnShape1(i);
     720                 :            :      
     721 [ #  # ][ #  # ]:          0 :           CubitVector cv(aPoint.X(), aPoint.Y(), aPoint.Z());
         [ #  # ][ #  # ]
     722         [ #  # ]:          0 :           intscts.append(cv);
     723                 :            :         }
     724                 :            :     }
     725                 :            :  
     726         [ +  - ]:         11 :   return CUBIT_SUCCESS;
     727                 :            : }
     728                 :            : 
     729                 :            : //================================================================================
     730                 :            : // Description: Find extrema position on an entity list
     731                 :            : // Author     : Jane Hu
     732                 :            : // Date       : 10/30/07
     733                 :            : //================================================================================
     734                 :            : CubitStatus
     735                 :          0 : OCCQueryEngine::entity_extrema( DLIList<GeometryEntity*> &ref_entity_list,
     736                 :            :                                 const CubitVector *dir1,
     737                 :            :                                 const CubitVector *dir2,
     738                 :            :                                 const CubitVector *dir3,
     739                 :            :                                 CubitVector &extrema,
     740                 :            :                                 GeometryEntity *&extrema_entity_ptr )
     741                 :            : {
     742                 :            :   //in OCC, the api_entity_extrema is used to calculate "possible
     743                 :            :   //self-intersecting sweeping and to align lofting sections"
     744 [ #  # ][ #  # ]:          0 :   PRINT_ERROR("There's no such call in OCC ");
     745                 :          0 :   return CUBIT_FAILURE;
     746                 :            : }
     747                 :            : 
     748                 :            : //================================================================================
     749                 :            : // Description: Find distance between two entities and closest positions.
     750                 :            : // Author     : Jane Hu
     751                 :            : // Date       : 10/19/07
     752                 :            : //================================================================================
     753                 :            : CubitStatus
     754                 :          0 : OCCQueryEngine::entity_entity_distance( GeometryEntity *entity1,
     755                 :            :                                         GeometryEntity *entity2,
     756                 :            :                                         CubitVector &pos1, CubitVector &pos2,
     757                 :            :                                         double &distance )
     758                 :            : {
     759                 :            :   TopoDS_Shape * shape1;
     760                 :            :   TopoDS_Shape * shape2;
     761 [ #  # ][ #  # ]:          0 :   if ((shape1 = get_TopoDS_Shape_of_entity(entity1)) == NULL)
     762                 :            :     {
     763 [ #  # ][ #  # ]:          0 :       PRINT_ERROR( "problem occured getting OCC entity.\n"
                 [ #  # ]
     764         [ #  # ]:          0 :                    "       Aborting.\n" );
     765                 :          0 :       return CUBIT_FAILURE;
     766                 :            :     }
     767                 :            : 
     768 [ #  # ][ #  # ]:          0 :   if( (shape2 = get_TopoDS_Shape_of_entity( entity2 )) == NULL )
     769                 :            :     {
     770 [ #  # ][ #  # ]:          0 :       PRINT_ERROR( "problem occured getting OCC entity.\n"
                 [ #  # ]
     771         [ #  # ]:          0 :                    "       Aborting.\n");
     772                 :          0 :       return CUBIT_FAILURE;
     773                 :            :     }
     774                 :            : 
     775         [ #  # ]:          0 :   BRepExtrema_DistShapeShape distShapeShape(*shape1, *shape2);
     776                 :            :   //distShapeShape.Perform();
     777                 :            :   
     778 [ #  # ][ #  # ]:          0 :   if (!distShapeShape.IsDone())
     779                 :            :     {
     780 [ #  # ][ #  # ]:          0 :       PRINT_ERROR( "problem occured getting distance between OCC entities.\n"
                 [ #  # ]
     781         [ #  # ]:          0 :                    "       Aborting.\n");
     782                 :          0 :       return CUBIT_FAILURE;
     783                 :            :     }
     784                 :            : 
     785         [ #  # ]:          0 :   distance = distShapeShape.Value();
     786         [ #  # ]:          0 :   gp_Pnt pnt1 = distShapeShape.PointOnShape1(1);
     787         [ #  # ]:          0 :   gp_Pnt pnt2 = distShapeShape.PointOnShape2(1);
     788 [ #  # ][ #  # ]:          0 :   pos1 = CubitVector(pnt1.X(), pnt1.Y(), pnt1.Z());
         [ #  # ][ #  # ]
                 [ #  # ]
     789 [ #  # ][ #  # ]:          0 :   pos2 = CubitVector(pnt2.X(), pnt2.Y(), pnt2.Z());
         [ #  # ][ #  # ]
                 [ #  # ]
     790         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     791                 :            : }
     792                 :            : 
     793                 :         11 : TopoDS_Shape* OCCQueryEngine::get_TopoDS_Shape_of_entity(TopologyBridge * entity_ptr)
     794                 :            : {
     795 [ -  + ][ -  + ]:         11 :   if (OCCBody * occ_body = CAST_TO( entity_ptr, OCCBody))
     796                 :            :     {
     797                 :            :       TopoDS_Shape* theShape;
     798         [ #  # ]:          0 :       occ_body->get_TopoDS_Shape(theShape);
     799                 :          0 :       return theShape;
     800                 :            :     }
     801                 :            : 
     802 [ -  + ][ -  + ]:         11 :   else if (OCCLump * lump_ptr = CAST_TO( entity_ptr,OCCLump))
     803                 :            :     {
     804                 :          0 :       TopoDS_Solid * theSolid = lump_ptr->get_TopoDS_Solid();
     805         [ #  # ]:          0 :       if(theSolid)
     806                 :          0 :         return (TopoDS_Shape*) theSolid; 
     807                 :            :       else
     808                 :            :         {
     809 [ #  # ][ #  # ]:          0 :           PRINT_ERROR("OCCLump without TopoDS_Solid at %s:%d.\n", __FILE__, __LINE__ );
     810                 :          0 :           return NULL;
     811                 :            :         }
     812                 :            :     }
     813                 :            : 
     814 [ -  + ][ +  - ]:         11 :   else if( OCCSurface * surface_ptr = CAST_TO( entity_ptr, OCCSurface))
     815                 :            :     {
     816                 :         11 :       TopoDS_Face *theFace = surface_ptr->get_TopoDS_Face();
     817         [ -  + ]:         11 :       if(!theFace)
     818                 :            :         {
     819 [ #  # ][ #  # ]:          0 :           PRINT_ERROR("OCCSurface without TopoDS_Face at %s:%d.\n", __FILE__, __LINE__ );
     820                 :          0 :           return NULL;
     821                 :            :         }
     822                 :            : 
     823                 :         11 :       return (TopoDS_Shape*) theFace;
     824                 :            :     }
     825                 :            : 
     826 [ #  # ][ #  # ]:          0 :   else if( OCCCurve * curve_ptr = CAST_TO( entity_ptr, OCCCurve))
     827                 :            :     {
     828                 :          0 :       TopoDS_Edge *theEdge = curve_ptr->get_TopoDS_Edge();
     829         [ #  # ]:          0 :       if (!theEdge)
     830                 :            :         {
     831 [ #  # ][ #  # ]:          0 :           PRINT_ERROR("OCCCurve without TopoDS_Edge at %s:%d.\n", __FILE__, __LINE__ );
     832                 :          0 :           return NULL;
     833                 :            :         }
     834                 :            : 
     835                 :          0 :       return (TopoDS_Shape*) theEdge;
     836                 :            :     }
     837                 :            : 
     838 [ #  # ][ #  # ]:          0 :   else if( OCCPoint * point_ptr = CAST_TO( entity_ptr, OCCPoint))
     839                 :            :     {
     840                 :          0 :       TopoDS_Vertex *thePoint = point_ptr->get_TopoDS_Vertex(); 
     841         [ #  # ]:          0 :       if (!thePoint)
     842                 :            :         {
     843 [ #  # ][ #  # ]:          0 :           PRINT_ERROR("OCCPoint without TopoDS_Point at %s:%d.\n", __FILE__, __LINE__ );
     844                 :          0 :           return NULL;
     845                 :            :         }
     846                 :            : 
     847                 :          0 :       return (TopoDS_Shape*) thePoint;
     848                 :            :     }
     849                 :            :   
     850 [ #  # ][ #  # ]:          0 :   PRINT_ERROR("Non-OCC TopologyBridge at %s:%d.\n", __FILE__, __LINE__ );
     851                 :         11 :   return NULL;
     852                 :            : 
     853                 :            : }
     854                 :            : //===========================================================================
     855                 :            : //Function Name: save_temp_geom_file
     856                 :            : //Member Type:  PUBLIC
     857                 :            : //Description:  function called for save/restore to save temporary FACET file
     858                 :            : //              If file is created, CubitString 'created_file' and
     859                 :            : //              'create_file_type' are set
     860                 :            : //Author:       Corey Ernst
     861                 :            : //Date:         1/18/2003
     862                 :            : //===========================================================================
     863                 :            : 
     864                 :          0 : CubitStatus OCCQueryEngine::save_temp_geom_file( DLIList<TopologyBridge*>& ref_entity_list,
     865                 :            :                                                  const char *file_name,
     866                 :            :                                                  const CubitString &cubit_version,
     867                 :            :                                                  CubitString &created_file,
     868                 :            :                                                  CubitString &created_file_type)
     869                 :            : {
     870         [ #  # ]:          0 :   int size_before = ref_entity_list.size();
     871         [ #  # ]:          0 :   CubitString temp_filename(file_name);
     872 [ #  # ][ #  # ]:          0 :   temp_filename += ".occ";
                 [ #  # ]
     873                 :            : 
     874 [ #  # ][ #  # ]:          0 :   ModelExportOptions M_O;
     875         [ #  # ]:          0 :   if( export_solid_model( ref_entity_list, temp_filename.c_str(), OCC_TYPE,
     876 [ #  # ][ #  # ]:          0 :                           cubit_version, M_O ) == CUBIT_FAILURE )
     877                 :            :     {
     878 [ #  # ][ #  # ]:          0 :       PRINT_ERROR( "Error occured while trying to save temporary OCC_BASED_GEOMETRY file\n");
         [ #  # ][ #  # ]
     879                 :          0 :       return CUBIT_FAILURE;
     880                 :            :     }
     881                 :            : 
     882         [ #  # ]:          0 :   int size_after = ref_entity_list.size();
     883                 :            : 
     884         [ #  # ]:          0 :   if( size_before > size_after )
     885                 :            :     {
     886         [ #  # ]:          0 :       created_file +=  temp_filename;
     887 [ #  # ][ #  # ]:          0 :       created_file_type += "OCC";
                 [ #  # ]
     888                 :            :     }
     889         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     890                 :            : }
     891                 :            : 
     892                 :            : //===========================================================================
     893                 :            : //Function Name:export_solid_model
     894                 :            : //Member Type:  PUBLIC
     895                 :            : //Description:  function called for save/restore to save temporary Brep file
     896                 :            : //Author:       Jane Hu
     897                 :            : //Date:         11/16/2007
     898                 :            : //===========================================================================
     899                 :            : 
     900                 :        285 : CubitStatus OCCQueryEngine::export_solid_model( DLIList<TopologyBridge*>& ref_entity_list,
     901                 :            :                                                 const char* file_name,
     902                 :            :                                                 Model_File_Type file_type,
     903                 :            :                                                 const CubitString &,
     904                 :            :                                                 ModelExportOptions &)
     905                 :            : {
     906 [ +  + ][ +  + ]:        285 :   if(  file_type != OCC_TYPE  && 
     907         [ -  + ]:         22 :        file_type != STEP_TYPE &&
     908                 :            :        file_type != IGES_TYPE)
     909                 :            :     {
     910                 :            :       //PRINT_ERROR("The specified file type, %s, is not supported!\n", filetype );
     911                 :          0 :       return CUBIT_FAILURE;
     912                 :            :     }
     913                 :            :  
     914                 :            : /*
     915                 :            :   char* name = "write.iges.unit";
     916                 :            :   Standard_CString orig_unit;
     917                 :            :   char* unit = "M";
     918                 :            :   if(strcmp( file_type, "IGES") == 0 && unit != NULL)
     919                 :            :   {
     920                 :            :     orig_unit = Interface_Static::CVal(name);
     921                 :            :     Interface_Static::SetCVal (name, unit); 
     922                 :            :   }
     923                 :            : */
     924         [ +  - ]:        285 :   DLIList<OCCBody*>    OCC_bodies;
     925 [ +  - ][ +  - ]:        570 :   DLIList<OCCSurface*> OCC_surfaces;
     926 [ +  - ][ +  - ]:        570 :   DLIList<OCCCurve*>   OCC_curves;
     927 [ +  - ][ +  - ]:        570 :   DLIList<OCCPoint*>   OCC_points;
     928                 :            : 
     929 [ +  - ][ +  - ]:        570 :   DLIList<TopologyBridge*> ref_entities_handled;
     930                 :            : 
     931                 :            :   int i;
     932                 :            :   //Collect all free entities (bodies, curves, vertices )
     933         [ +  - ]:        285 :   ref_entity_list.reset();
     934 [ +  - ][ +  + ]:       1843 :   for(i=ref_entity_list.size(); i>0; i--)
     935                 :            :     {
     936         [ +  - ]:       1558 :       TopologyBridge* ref_entity_ptr = ref_entity_list.get();
     937                 :       1558 :       CubitBoolean handled = CUBIT_TRUE;
     938                 :            : 
     939                 :            :       //if it is a Vertex
     940 [ -  + ][ -  + ]:       1558 :       if( OCCPoint* pt = CAST_TO( ref_entity_ptr, OCCPoint) )
     941         [ #  # ]:          0 :         OCC_points.append( pt );
     942                 :            : 
     943                 :            :       //if it is a Curve
     944 [ -  + ][ +  + ]:       1558 :       else if( OCCCurve* curve = CAST_TO( ref_entity_ptr, OCCCurve) )
     945         [ +  - ]:        737 :         OCC_curves.append( curve );
     946                 :            :     
     947                 :            :       //if it is a surface
     948 [ -  + ][ -  + ]:        821 :       else if( OCCSurface* surf = CAST_TO( ref_entity_ptr, OCCSurface) )
     949         [ #  # ]:          0 :         OCC_surfaces.append( surf );
     950                 :            :    
     951                 :            :       //if it is a Body
     952 [ -  + ][ +  - ]:        821 :       else if( OCCBody* body = CAST_TO( ref_entity_ptr, OCCBody ) )
     953         [ +  - ]:        821 :         OCC_bodies.append( body );
     954                 :            : 
     955                 :            :       else
     956                 :       1558 :         handled = CUBIT_FALSE;
     957                 :            : 
     958         [ +  - ]:       1558 :       if( handled == CUBIT_TRUE )
     959                 :            :         {
     960         [ +  - ]:       1558 :           ref_entities_handled.append( ref_entity_ptr );
     961         [ +  - ]:       1558 :           ref_entity_list.change_to(NULL);
     962                 :            :         }
     963                 :            : 
     964         [ +  - ]:       1558 :       ref_entity_list.step();
     965                 :            :     }
     966                 :            : 
     967         [ +  - ]:        285 :   ref_entity_list.remove_all_with_value(NULL);
     968                 :            : 
     969         [ +  - ]:        285 :   int free_body_count = OCC_bodies.size();
     970         [ +  - ]:        285 :   int free_curve_count = OCC_curves.size();
     971         [ +  - ]:        285 :   int free_point_count = OCC_points.size();
     972         [ +  - ]:        285 :   int free_surface_count = OCC_surfaces.size();
     973                 :            : 
     974                 :            :   //if nothing to write out...return
     975 [ +  + ][ +  - ]:        285 :   if( free_body_count == 0 && free_surface_count == 0 && 
                 [ -  + ]
     976         [ #  # ]:          0 :       free_curve_count == 0 && free_point_count == 0)
     977                 :          0 :     return CUBIT_SUCCESS;
     978                 :            : 
     979                 :            :   //save the facets (geometry info )
     980                 :            :   CubitStatus status;
     981                 :            : 
     982                 :            :   //write out topology and attributes
     983                 :            :   status = write_topology( file_name, file_type,
     984                 :            :                            OCC_bodies, OCC_surfaces,
     985         [ +  - ]:        285 :                            OCC_curves, OCC_points );
     986                 :            : /*
     987                 :            :   //set the unit back.
     988                 :            :   if(strcmp( file_type, "IGES") == 0 && unit != NULL) 
     989                 :            :     Interface_Static::SetCVal (name,orig_unit);
     990                 :            : */
     991         [ -  + ]:        285 :   if( status == CUBIT_FAILURE ) return CUBIT_FAILURE;
     992                 :            : 
     993 [ +  + ][ +  - ]:        285 :   if( free_body_count || free_surface_count || 
                 [ -  + ]
     994         [ #  # ]:          0 :       free_curve_count || free_point_count )
     995 [ +  - ][ +  - ]:        285 :     PRINT_INFO( "\nExported:" );
         [ +  - ][ +  - ]
     996                 :            : 
     997                 :        285 :   int flg = 0;
     998                 :            : 
     999         [ +  + ]:        285 :   if( free_body_count )
    1000                 :            :     {
    1001 [ -  + ][ #  # ]:        241 :       if( flg )PRINT_INFO( "         " );else flg=1;
         [ #  # ][ #  # ]
                 [ #  # ]
    1002         [ +  + ]:        241 :       if( free_body_count == 1 )
    1003 [ +  - ][ +  - ]:         88 :          PRINT_INFO( "%4d OCC Body to %s\n", free_body_count, file_name );
         [ +  - ][ +  - ]
    1004                 :            :       else
    1005 [ +  - ][ +  - ]:        241 :          PRINT_INFO( "%4d OCC Bodies to %s\n", free_body_count, file_name );
         [ +  - ][ +  - ]
    1006                 :            :     }
    1007                 :            : 
    1008         [ -  + ]:        285 :   if( free_surface_count )
    1009                 :            :     {
    1010 [ #  # ][ #  # ]:          0 :       if( flg )PRINT_INFO( "         " );else flg=1;
         [ #  # ][ #  # ]
                 [ #  # ]
    1011         [ #  # ]:          0 :       if( free_surface_count == 1 )
    1012 [ #  # ][ #  # ]:          0 :         PRINT_INFO( "%4d OCC Surface to %s\n", free_surface_count, file_name );
         [ #  # ][ #  # ]
    1013                 :            :       else
    1014 [ #  # ][ #  # ]:          0 :         PRINT_INFO( "%4d OCC Surface to %s\n", free_surface_count, file_name );
         [ #  # ][ #  # ]
    1015                 :            :     }
    1016                 :            : 
    1017         [ +  + ]:        285 :   if( free_curve_count )
    1018                 :            :     {
    1019 [ -  + ][ #  # ]:         44 :       if( flg )PRINT_INFO( "         " );else flg=1;
         [ #  # ][ #  # ]
                 [ #  # ]
    1020         [ -  + ]:         44 :       if( free_curve_count == 1 )
    1021 [ #  # ][ #  # ]:          0 :         PRINT_INFO( "%4d OCC Curve to %s\n", free_curve_count, file_name );
         [ #  # ][ #  # ]
    1022                 :            :       else
    1023 [ +  - ][ +  - ]:         44 :         PRINT_INFO( "%4d OCC Curves to %s\n", free_curve_count, file_name );
         [ +  - ][ +  - ]
    1024                 :            :     }
    1025                 :            : 
    1026         [ -  + ]:        285 :   if( free_point_count )
    1027                 :            :     {
    1028 [ #  # ][ #  # ]:          0 :       if( flg )PRINT_INFO( "         " );else flg=1;
         [ #  # ][ #  # ]
                 [ #  # ]
    1029         [ #  # ]:          0 :       if( free_point_count == 1 )
    1030 [ #  # ][ #  # ]:          0 :         PRINT_INFO( "%4d OCC Point to %s\n", free_point_count, file_name );
         [ #  # ][ #  # ]
    1031                 :            :       else
    1032 [ #  # ][ #  # ]:          0 :         PRINT_INFO( "%4d OCC Points to %s\n", free_point_count, file_name );
         [ #  # ][ #  # ]
    1033                 :            :     }
    1034 [ +  - ][ +  - ]:        285 :   PRINT_INFO( "\n" );
         [ +  - ][ +  - ]
    1035                 :            : 
    1036         [ +  - ]:        570 :   return CUBIT_SUCCESS;
    1037                 :            : }
    1038                 :            : 
    1039                 :          0 : CubitStatus OCCQueryEngine::export_solid_model( DLIList<TopologyBridge*>& ref_entity_list,
    1040                 :            :                                                 char*& p_buffer,
    1041                 :            :                                                 int& n_buffer_size,
    1042                 :            :                                                 bool b_export_buffer)
    1043                 :            : {
    1044         [ #  # ]:          0 :   DLIList<OCCBody*>    OCC_bodies;
    1045 [ #  # ][ #  # ]:          0 :   DLIList<OCCSurface*> OCC_surfaces;
    1046 [ #  # ][ #  # ]:          0 :   DLIList<OCCCurve*>   OCC_curves;
    1047 [ #  # ][ #  # ]:          0 :   DLIList<OCCPoint*>   OCC_points;
    1048                 :            : 
    1049 [ #  # ][ #  # ]:          0 :   DLIList<TopologyBridge*> ref_entities_handled;
    1050                 :            : 
    1051                 :            :   int i;
    1052                 :            :   //Collect all free entities (bodies, curves, vertices )
    1053         [ #  # ]:          0 :   ref_entity_list.reset();
    1054 [ #  # ][ #  # ]:          0 :   for(i=ref_entity_list.size(); i>0; i--)
    1055                 :            :     {
    1056         [ #  # ]:          0 :       TopologyBridge* ref_entity_ptr = ref_entity_list.get();
    1057                 :          0 :       CubitBoolean handled = CUBIT_TRUE;
    1058                 :            : 
    1059                 :            :       //if it is a Vertex
    1060 [ #  # ][ #  # ]:          0 :       if( OCCPoint* pt = CAST_TO( ref_entity_ptr, OCCPoint) )
    1061         [ #  # ]:          0 :         OCC_points.append( pt );
    1062                 :            : 
    1063                 :            :       //if it is a Curve
    1064 [ #  # ][ #  # ]:          0 :       else if( OCCCurve* curve = CAST_TO( ref_entity_ptr, OCCCurve) )
    1065         [ #  # ]:          0 :         OCC_curves.append( curve );
    1066                 :            :     
    1067                 :            :       //if it is a surface
    1068 [ #  # ][ #  # ]:          0 :       else if( OCCSurface* surf = CAST_TO( ref_entity_ptr, OCCSurface) )
    1069         [ #  # ]:          0 :         OCC_surfaces.append( surf );
    1070                 :            :    
    1071                 :            :       //if it is a Body
    1072 [ #  # ][ #  # ]:          0 :       else if( OCCBody* body = CAST_TO( ref_entity_ptr, OCCBody ) )
    1073         [ #  # ]:          0 :         OCC_bodies.append( body );
    1074                 :            : 
    1075                 :            :       else
    1076                 :          0 :         handled = CUBIT_FALSE;
    1077                 :            : 
    1078         [ #  # ]:          0 :       if( handled == CUBIT_TRUE )
    1079                 :            :         {
    1080         [ #  # ]:          0 :           ref_entities_handled.append( ref_entity_ptr );
    1081         [ #  # ]:          0 :           ref_entity_list.change_to(NULL);
    1082                 :            :         }
    1083                 :            : 
    1084         [ #  # ]:          0 :       ref_entity_list.step();
    1085                 :            :     }
    1086                 :            : 
    1087         [ #  # ]:          0 :   ref_entity_list.remove_all_with_value(NULL);
    1088                 :            : 
    1089         [ #  # ]:          0 :   int free_body_count = OCC_bodies.size();
    1090         [ #  # ]:          0 :   int free_curve_count = OCC_curves.size();
    1091         [ #  # ]:          0 :   int free_point_count = OCC_points.size();
    1092         [ #  # ]:          0 :   int free_surface_count = OCC_surfaces.size();
    1093                 :            : 
    1094                 :            :   //if nothing to write out...return
    1095 [ #  # ][ #  # ]:          0 :   if( free_body_count == 0 && free_surface_count == 0 && 
                 [ #  # ]
    1096         [ #  # ]:          0 :       free_curve_count == 0 && free_point_count == 0)
    1097                 :          0 :     return CUBIT_SUCCESS;
    1098                 :            : 
    1099                 :            :   //save the facets (geometry info )
    1100                 :            :   CubitStatus status;
    1101                 :            : 
    1102                 :            :   //write out topology and attributes
    1103                 :            :   status = write_topology( p_buffer, n_buffer_size,
    1104                 :            :                            b_export_buffer,
    1105                 :            :                            OCC_bodies, OCC_surfaces,
    1106         [ #  # ]:          0 :                            OCC_curves, OCC_points);
    1107         [ #  # ]:          0 :   if( status == CUBIT_FAILURE ) return CUBIT_FAILURE;
    1108                 :            : 
    1109 [ #  # ][ #  # ]:          0 :   if( free_body_count || free_surface_count || 
                 [ #  # ]
    1110         [ #  # ]:          0 :       free_curve_count || free_point_count )
    1111                 :            :   {
    1112 [ #  # ][ #  # ]:          0 :     if (b_export_buffer) PRINT_INFO( "\nExported:" );
         [ #  # ][ #  # ]
                 [ #  # ]
    1113 [ #  # ][ #  # ]:          0 :     else PRINT_INFO( "\nSize checked:" );
         [ #  # ][ #  # ]
    1114                 :            :   }
    1115                 :          0 :   int flg = 0;
    1116                 :            : 
    1117         [ #  # ]:          0 :   if( free_body_count )
    1118                 :            :     {
    1119 [ #  # ][ #  # ]:          0 :       if( flg )PRINT_INFO( "         " );else flg=1;
         [ #  # ][ #  # ]
                 [ #  # ]
    1120         [ #  # ]:          0 :       if( free_body_count == 1 )
    1121 [ #  # ][ #  # ]:          0 :          PRINT_INFO( "%4d OCC Body to buffer\n", free_body_count );
         [ #  # ][ #  # ]
    1122                 :            :       else
    1123 [ #  # ][ #  # ]:          0 :          PRINT_INFO( "%4d OCC Bodies to buffer\n", free_body_count );
         [ #  # ][ #  # ]
    1124                 :            :     }
    1125                 :            : 
    1126         [ #  # ]:          0 :   if( free_surface_count )
    1127                 :            :     {
    1128 [ #  # ][ #  # ]:          0 :       if( flg )PRINT_INFO( "         " );else flg=1;
         [ #  # ][ #  # ]
                 [ #  # ]
    1129         [ #  # ]:          0 :       if( free_surface_count == 1 )
    1130 [ #  # ][ #  # ]:          0 :         PRINT_INFO( "%4d OCC Surface to buffer\n", free_surface_count );
         [ #  # ][ #  # ]
    1131                 :            :       else
    1132 [ #  # ][ #  # ]:          0 :         PRINT_INFO( "%4d OCC Surface to buffer\n", free_surface_count );
         [ #  # ][ #  # ]
    1133                 :            :     }
    1134                 :            : 
    1135         [ #  # ]:          0 :   if( free_curve_count )
    1136                 :            :     {
    1137 [ #  # ][ #  # ]:          0 :       if( flg )PRINT_INFO( "         " );else flg=1;
         [ #  # ][ #  # ]
                 [ #  # ]
    1138         [ #  # ]:          0 :       if( free_curve_count == 1 )
    1139 [ #  # ][ #  # ]:          0 :         PRINT_INFO( "%4d OCC Curve to buffer\n", free_curve_count );
         [ #  # ][ #  # ]
    1140                 :            :       else
    1141 [ #  # ][ #  # ]:          0 :         PRINT_INFO( "%4d OCC Curves to buffer\n", free_curve_count );
         [ #  # ][ #  # ]
    1142                 :            :     }
    1143                 :            : 
    1144         [ #  # ]:          0 :   if( free_point_count )
    1145                 :            :     {
    1146 [ #  # ][ #  # ]:          0 :       if( flg )PRINT_INFO( "         " );else flg=1;
         [ #  # ][ #  # ]
                 [ #  # ]
    1147         [ #  # ]:          0 :       if( free_point_count == 1 )
    1148 [ #  # ][ #  # ]:          0 :         PRINT_INFO( "%4d OCC Point to buffer\n", free_point_count );
         [ #  # ][ #  # ]
    1149                 :            :       else
    1150 [ #  # ][ #  # ]:          0 :         PRINT_INFO( "%4d OCC Points to buffer\n", free_point_count );
         [ #  # ][ #  # ]
    1151                 :            :     }
    1152 [ #  # ][ #  # ]:          0 :   PRINT_INFO( "\n" );
         [ #  # ][ #  # ]
    1153                 :            : 
    1154         [ #  # ]:          0 :   return CUBIT_SUCCESS;
    1155                 :            : }
    1156                 :            : 
    1157                 :        241 : void OCCQueryEngine::body_attributes_for_writing(DLIList<OCCBody*> &OCC_bodies,
    1158                 :            :                                   BRep_Builder &B,
    1159                 :            :                                   TopoDS_Compound &Co,
    1160                 :            :                                   DLIList<OCCLump*> &single_lumps,
    1161                 :            :                                   DLIList< DLIList<CubitSimpleAttrib>*> &lists)
    1162                 :            : {
    1163                 :            :   //Add every shape to the compound
    1164                 :        241 :   OCCLump* lump = NULL;
    1165         [ +  - ]:        241 :   DLIList<CubitSimpleAttrib> body_csa_list;
    1166                 :            : 
    1167 [ +  - ][ +  + ]:       1062 :   for (int i = 0; i < OCC_bodies.size(); i++)
    1168                 :            :   {
    1169         [ +  - ]:        821 :     OCCBody* body = OCC_bodies.get_and_step();
    1170         [ +  - ]:        821 :     TopoDS_Compound *shape = body->get_TopoDS_Shape();
    1171 [ +  + ][ +  - ]:        821 :     if (shape == NULL || shape->IsNull()) //single lump or sheet or shell body
         [ -  + ][ +  + ]
    1172                 :            :     {
    1173         [ +  - ]:        799 :        DLIList<OCCSurface*> surfaces = body->my_sheet_surfaces();
    1174 [ +  - ][ +  - ]:       1598 :        DLIList<OCCShell*> shells = body->shells();
    1175 [ +  - ][ +  - ]:       1598 :        DLIList<Lump*> lumps = body->lumps();
    1176 [ +  - ][ +  + ]:        799 :        if(surfaces.size() == 1)
    1177 [ +  - ][ +  - ]:        473 :          B.Add(Co,*(surfaces.get()->get_TopoDS_Face()));
                 [ +  - ]
    1178 [ +  - ][ -  + ]:        326 :        else if (shells.size() == 1)
    1179 [ #  # ][ #  # ]:          0 :          B.Add(Co,*(shells.get()->get_TopoDS_Shell()));
                 [ #  # ]
    1180                 :            :        else
    1181                 :            :        {
    1182 [ +  - ][ -  + ]:        326 :          lump = CAST_TO(lumps.get(), OCCLump);
    1183 [ +  - ][ +  - ]:        326 :          B.Add(Co, *(lump->get_TopoDS_Solid()));
    1184                 :            :          //if body has attributes, add them to the solid.
    1185         [ +  - ]:        326 :          DLIList<CubitSimpleAttrib> csa_list;
    1186         [ +  - ]:        326 :          body->get_simple_attribute(csa_list);
    1187         [ +  - ]:        326 :          body_csa_list.clean_out();
    1188 [ +  - ][ +  + ]:        593 :          for(int i = 0; i < csa_list.size(); i++)
    1189                 :            :          {
    1190 [ +  - ][ +  - ]:        267 :            CubitSimpleAttrib body_csa = csa_list.get_and_step();
    1191 [ +  - ][ +  - ]:        534 :            CubitString pre_fix("#SINGLELUMP%");
    1192 [ +  - ][ +  - ]:        267 :            pre_fix += CubitString::number(i);
                 [ +  - ]
    1193                 :            : 
    1194 [ +  - ][ +  - ]:        267 :            body_csa.string_data_list().insert(body_csa.string_data_list().begin(), pre_fix);
         [ +  - ][ +  - ]
    1195         [ +  - ]:        267 :            lump->append_simple_attribute_virt(body_csa);
    1196         [ +  - ]:        267 :            body_csa_list.append(body_csa);
    1197         [ +  - ]:        267 :          }
    1198 [ +  - ][ +  + ]:        326 :          if(csa_list.size() > 0)
    1199                 :            :          {
    1200         [ +  - ]:        194 :            single_lumps.append(lump);
    1201 [ +  - ][ +  - ]:        194 :            lists.append(new DLIList<CubitSimpleAttrib>(body_csa_list));
                 [ +  - ]
    1202         [ +  - ]:        326 :          }
    1203                 :            :        }
    1204         [ +  - ]:       1598 :        continue;
    1205                 :            :     }
    1206         [ +  - ]:         22 :     B.Add(Co, *shape);
    1207         [ +  - ]:        241 :   }
    1208                 :        241 : } 
    1209                 :            : //===========================================================================
    1210                 :            : //Function Name:write_topology
    1211                 :            : //Member Type:  PUBLIC
    1212                 :            : //Description:  function called for write out temporary Brep file
    1213                 :            : //Author:       Jane Hu
    1214                 :            : //Date:         11/16/2007
    1215                 :            : //===========================================================================
    1216                 :            : 
    1217                 :            : CubitStatus
    1218                 :        285 : OCCQueryEngine::write_topology( const char* file_name,
    1219                 :            :                                 Model_File_Type file_type,
    1220                 :            :                                 DLIList<OCCBody*> &OCC_bodies,
    1221                 :            :                                 DLIList<OCCSurface*> &OCC_surfaces,
    1222                 :            :                                 DLIList<OCCCurve*> &OCC_curves,
    1223                 :            :                                 DLIList<OCCPoint*> &OCC_points )
    1224                 :            : {
    1225                 :            : 
    1226                 :            :   int i;
    1227                 :            :   //Create a compound shape to export
    1228                 :            :   BRep_Builder B;
    1229         [ +  - ]:        285 :   TopoDS_Compound Co;
    1230         [ +  - ]:        285 :   B.MakeCompound(Co);
    1231                 :            : 
    1232                 :            :   //Add every shape to the compound
    1233 [ +  - ][ +  - ]:        570 :   DLIList<OCCLump*> single_lumps;
    1234 [ +  - ][ +  - ]:        570 :   DLIList< DLIList<CubitSimpleAttrib>*> lists;
    1235                 :        285 :   OCCLump* lump = NULL;
    1236                 :            : 
    1237 [ +  - ][ +  + ]:        285 :   if(OCC_bodies.size() > 0)
    1238         [ +  - ]:        241 :     body_attributes_for_writing(OCC_bodies, B, Co, single_lumps, lists);
    1239                 :            : 
    1240 [ +  - ][ -  + ]:        285 :   for (i = 0; i < OCC_surfaces.size(); i++)
    1241                 :            :     {
    1242 [ #  # ][ #  # ]:          0 :       TopoDS_Face *face = OCC_surfaces.get_and_step()->get_TopoDS_Face();
    1243         [ #  # ]:          0 :       B.Add(Co, *face);
    1244                 :            :     }
    1245                 :            : 
    1246                 :            :   //Add standalone wires to the export BRep file
    1247 [ +  - ][ -  + ]:        285 :   for (i = 0; i < WireList->size(); i++)
    1248                 :            :     {
    1249 [ #  # ][ #  # ]:          0 :       TopoDS_Wire *wire = WireList->get_and_step()->get_TopoDS_Wire();
    1250         [ #  # ]:          0 :       B.Add(Co, *wire);
    1251                 :            :     }
    1252                 :            : 
    1253 [ +  - ][ +  + ]:       1022 :   for (i = 0; i < OCC_curves.size(); i++)
    1254                 :            :     {
    1255 [ +  - ][ +  - ]:        737 :       TopoDS_Edge *edge = OCC_curves.get_and_step()->get_TopoDS_Edge();
    1256         [ +  - ]:        737 :       B.Add(Co, *edge);
    1257                 :            :     }
    1258                 :            : 
    1259 [ +  - ][ -  + ]:        285 :   for (i = 0; i < OCC_points.size(); i++)
    1260                 :            :     {
    1261 [ #  # ][ #  # ]:          0 :       TopoDS_Vertex *vertex = OCC_points.get_and_step()->get_TopoDS_Vertex();
    1262         [ #  # ]:          0 :       B.Add(Co, *vertex);
    1263                 :            :     }
    1264                 :            :  
    1265         [ +  + ]:        285 :   if(file_type == OCC_TYPE)
    1266                 :            :   {
    1267         [ +  - ]:        241 :     TDF_Label label;
    1268         [ +  - ]:        241 :     if(EXPORT_ATTRIB)
    1269                 :        241 :       label = mainLabel;
    1270                 :            : 
    1271         [ +  - ]:        241 :     CubitBoolean result = Write(Co, const_cast<char*>(file_name),label);
    1272                 :            :     //remove the body attributes from lump
    1273 [ +  - ][ +  + ]:        435 :     for (int i = 0; i < single_lumps.size(); i++)
    1274                 :            :     {
    1275         [ +  - ]:        194 :       lump = single_lumps.get_and_step();
    1276         [ +  - ]:        194 :       DLIList<CubitSimpleAttrib>* p_csas = lists.get_and_step();
    1277 [ +  - ][ +  + ]:        461 :       for(int j = 0 ; j < p_csas->size(); j ++)
    1278                 :            :       {
    1279         [ +  - ]:        267 :         const CubitSimpleAttrib& csa = p_csas->get_and_step();
    1280         [ +  - ]:        267 :         lump->remove_simple_attribute_virt(csa);  
    1281                 :            :       }
    1282 [ +  - ][ +  - ]:        194 :       delete p_csas;
    1283                 :            :     }
    1284         [ -  + ]:        241 :     if(!result)
    1285                 :        241 :       return CUBIT_FAILURE;
    1286                 :            :   } 
    1287                 :            : 
    1288                 :            : #ifdef HAVE_OCC_STEP
    1289         [ +  + ]:         44 :   else if(file_type == STEP_TYPE)
    1290                 :            :   {
    1291         [ +  - ]:         22 :     STEPControl_Writer writer;
    1292 [ +  - ][ +  - ]:         22 :     writer.Model( Standard_True);
    1293         [ +  - ]:         22 :     writer.Transfer(Co, STEPControl_AsIs );
    1294         [ +  - ]:         22 :     IFSelect_ReturnStatus stat = writer.Write( (char*) file_name);
    1295         [ -  + ]:         22 :     if (stat  != IFSelect_RetDone)
    1296                 :            :     {
    1297 [ #  # ][ #  # ]:          0 :        PRINT_INFO("%s: Cannot open file", file_name );
         [ #  # ][ #  # ]
    1298 [ +  - ][ +  - ]:         22 :        return CUBIT_FAILURE;
    1299                 :         22 :     }
    1300                 :            :   }
    1301                 :            : #endif
    1302                 :            : #ifdef HAVE_OCC_IGES
    1303         [ +  - ]:         22 :  else if (file_type == IGES_TYPE) // IGES file
    1304                 :            :   {
    1305         [ +  - ]:         22 :     IGESControl_Writer writer;
    1306         [ +  - ]:         22 :     writer.AddShape(Co);
    1307         [ +  - ]:         22 :     writer.ComputeModel();
    1308         [ +  - ]:         22 :     Standard_Boolean  stat = writer.Write( (char*) file_name);
    1309         [ -  + ]:         22 :     if (!stat )
    1310                 :            :     {
    1311 [ #  # ][ #  # ]:          0 :        PRINT_INFO("%s: Cannot open file", file_name );
         [ #  # ][ #  # ]
    1312 [ +  - ][ +  - ]:         22 :        return CUBIT_FAILURE;
    1313                 :         22 :     }
    1314                 :            :   }
    1315                 :            : #endif
    1316                 :            :   else {
    1317 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("File formats other than OCC, STEP and IGES are  not supported by OCC.\n");
         [ #  # ][ #  # ]
    1318                 :          0 :     return CUBIT_FAILURE;
    1319                 :            :   }
    1320                 :            : 
    1321         [ +  - ]:        570 :   return CUBIT_SUCCESS;
    1322                 :            : }
    1323                 :            : 
    1324                 :            : CubitStatus
    1325                 :          0 : OCCQueryEngine::write_topology( char*& p_buffer,
    1326                 :            :                                 int& n_buffer_size,
    1327                 :            :                                 bool b_export_buffer,
    1328                 :            :                                 DLIList<OCCBody*> &OCC_bodies,
    1329                 :            :                                 DLIList<OCCSurface*> &OCC_surfaces,
    1330                 :            :                                 DLIList<OCCCurve*> &OCC_curves,
    1331                 :            :                                 DLIList<OCCPoint*> &OCC_points)
    1332                 :            : {
    1333                 :            : 
    1334                 :            :   int i;
    1335                 :            :   //Create a compound shape to export
    1336                 :            :   BRep_Builder B;
    1337         [ #  # ]:          0 :   TopoDS_Compound Co;
    1338         [ #  # ]:          0 :   B.MakeCompound(Co);
    1339                 :            : 
    1340                 :            :   //Add every shape to the compound
    1341 [ #  # ][ #  # ]:          0 :   DLIList<OCCLump*> single_lumps;
    1342 [ #  # ][ #  # ]:          0 :   DLIList< DLIList<CubitSimpleAttrib>*> lists;
    1343                 :          0 :   OCCLump* lump = NULL;
    1344                 :            : 
    1345 [ #  # ][ #  # ]:          0 :   if(OCC_bodies.size() > 0)
    1346         [ #  # ]:          0 :     body_attributes_for_writing(OCC_bodies, B, Co, single_lumps, lists);
    1347                 :            : 
    1348 [ #  # ][ #  # ]:          0 :   for (i = 0; i < OCC_surfaces.size(); i++)
    1349                 :            :     {
    1350 [ #  # ][ #  # ]:          0 :       TopoDS_Face *face = OCC_surfaces.get_and_step()->get_TopoDS_Face();
    1351         [ #  # ]:          0 :       B.Add(Co, *face);
    1352                 :            :     }
    1353                 :            : 
    1354                 :            :   //Add standalone wires to the export BRep file
    1355 [ #  # ][ #  # ]:          0 :   for (i = 0; i < WireList->size(); i++)
    1356                 :            :     {
    1357 [ #  # ][ #  # ]:          0 :       TopoDS_Wire *wire = WireList->get_and_step()->get_TopoDS_Wire();
    1358         [ #  # ]:          0 :       B.Add(Co, *wire);
    1359                 :            :     }
    1360                 :            : 
    1361 [ #  # ][ #  # ]:          0 :   for (i = 0; i < OCC_curves.size(); i++)
    1362                 :            :     {
    1363 [ #  # ][ #  # ]:          0 :       TopoDS_Edge *edge = OCC_curves.get_and_step()->get_TopoDS_Edge();
    1364         [ #  # ]:          0 :       B.Add(Co, *edge);
    1365                 :            :     }
    1366                 :            : 
    1367 [ #  # ][ #  # ]:          0 :   for (i = 0; i < OCC_points.size(); i++)
    1368                 :            :     {
    1369 [ #  # ][ #  # ]:          0 :       TopoDS_Vertex *vertex = OCC_points.get_and_step()->get_TopoDS_Vertex();
    1370         [ #  # ]:          0 :       B.Add(Co, *vertex);
    1371                 :            :     }
    1372                 :            :  
    1373                 :            :   //if(strcmp(file_type, "OCC") == 0)
    1374                 :            :   //{
    1375         [ #  # ]:          0 :     TDF_Label label;
    1376         [ #  # ]:          0 :     if(EXPORT_ATTRIB)
    1377                 :          0 :       label = mainLabel;
    1378                 :            : 
    1379 [ #  # ][ #  # ]:          0 :     if(!Write(Co, p_buffer, n_buffer_size, b_export_buffer, label))
    1380                 :          0 :       return CUBIT_FAILURE;
    1381                 :            : 
    1382                 :            :     //remove the body attributes from lump
    1383 [ #  # ][ #  # ]:          0 :     for (int i = 0; i < single_lumps.size(); i++)
    1384                 :            :     {
    1385         [ #  # ]:          0 :       lump = single_lumps.get_and_step();
    1386         [ #  # ]:          0 :       DLIList<CubitSimpleAttrib>* p_csas = lists.get_and_step();
    1387 [ #  # ][ #  # ]:          0 :       for(int j = 0 ; j < p_csas->size(); j ++)
    1388                 :            :       {
    1389         [ #  # ]:          0 :         const CubitSimpleAttrib& csa = p_csas->get_and_step();
    1390         [ #  # ]:          0 :         lump->remove_simple_attribute_virt(csa);
    1391                 :            :       }
    1392 [ #  # ][ #  # ]:          0 :       delete p_csas;
    1393                 :            :     }
    1394                 :            : 
    1395         [ #  # ]:          0 :   return CUBIT_SUCCESS;
    1396                 :            : }
    1397                 :            : 
    1398                 :        241 : CubitBoolean OCCQueryEngine::Write(const TopoDS_Shape& Sh,
    1399                 :            :                                    const Standard_CString File,
    1400                 :            :                                    TDF_Label label) 
    1401                 :            : {
    1402         [ +  - ]:        241 :   ofstream os;
    1403         [ +  - ]:        241 :   os.open(File, ios::out);
    1404 [ +  - ][ -  + ]:        241 :   if (!os.rdbuf()->is_open()) return Standard_False;
    1405                 :            :   
    1406 [ +  - ][ +  - ]:        241 :   CubitBoolean isGood = (os.good() && !os.eof());
         [ +  - ][ +  - ]
    1407         [ -  + ]:        241 :   if(!isGood)
    1408                 :          0 :     return isGood;
    1409                 :            : 
    1410 [ +  - ][ +  - ]:        482 :   OCCShapeAttributeSet SS;
    1411         [ +  - ]:        241 :   SS.Add(Sh);
    1412                 :            : 
    1413         [ +  - ]:        241 :   os << "DBRep_DrawableShape\n";  // for easy Draw read
    1414         [ +  - ]:        241 :   SS.Write(os);
    1415         [ +  - ]:        241 :   isGood = os.good();
    1416         [ +  - ]:        241 :   if(isGood )
    1417         [ +  - ]:        241 :     SS.Write(Sh,os,&label);
    1418         [ +  - ]:        241 :   os.flush();
    1419         [ +  - ]:        241 :   isGood = os.good();
    1420         [ +  - ]:        241 :   os.close();
    1421 [ +  - ][ +  - ]:        241 :   isGood = os.good() && isGood;
                 [ +  - ]
    1422                 :            : 
    1423         [ +  - ]:        241 :   return isGood;
    1424                 :            : }
    1425                 :            : 
    1426                 :          0 : CubitBoolean OCCQueryEngine::Write(const TopoDS_Shape& Sh,
    1427                 :            :                                    char*& pBuffer,
    1428                 :            :                                    int& n_buffer_size,
    1429                 :            :                                    bool b_write_buffer,
    1430                 :            :                                    TDF_Label label)
    1431                 :            : {
    1432                 :            :   // make buffer as ouput stream
    1433 [ #  # ][ #  # ]:          0 :   std::stringbuf sb;
    1434 [ #  # ][ #  # ]:          0 :   std::iostream os(&sb);
    1435 [ #  # ][ #  # ]:          0 :   OCCShapeAttributeSet SS;
    1436                 :            :   
    1437                 :            :   // write to output stream
    1438         [ #  # ]:          0 :   SS.Add(Sh);
    1439         [ #  # ]:          0 :   os << "DBRep_DrawableShape\n";  // for easy Draw read
    1440         [ #  # ]:          0 :   SS.Write(os);
    1441         [ #  # ]:          0 :   CubitBoolean isGood = os.good();
    1442         [ #  # ]:          0 :   if (!isGood) return isGood;
    1443         [ #  # ]:          0 :   SS.Write(Sh,os,&label);
    1444         [ #  # ]:          0 :   isGood = os.good();
    1445         [ #  # ]:          0 :   if (!isGood) return isGood;
    1446                 :            :   
    1447 [ #  # ][ #  # ]:          0 :   n_buffer_size = os.rdbuf()->pubseekoff(0, std::ios_base::end, std::ios::out);
                 [ #  # ]
    1448                 :            : 
    1449                 :            :   // get real geometries from output stream to buffer
    1450 [ #  # ][ #  # ]:          0 :   if (b_write_buffer) os.read(pBuffer, n_buffer_size);
    1451                 :            :   
    1452         [ #  # ]:          0 :   return CUBIT_TRUE;
    1453                 :            : }
    1454                 :            :                                    
    1455                 :        186 : CubitBoolean OCCQueryEngine::Read(TopoDS_Shape& Sh,
    1456                 :            :                                   const Standard_CString File,
    1457                 :            :                                   TDF_Label label)
    1458                 :            : {
    1459         [ +  - ]:        186 :   ifstream in( File );
    1460 [ +  - ][ -  + ]:        186 :   if (in.fail()) {
    1461 [ #  # ][ #  # ]:          0 :     PRINT_INFO("%s: Cannot open file", File );
         [ #  # ][ #  # ]
    1462                 :          0 :     return CUBIT_FAILURE;
    1463                 :            :   }
    1464                 :            : 
    1465 [ +  - ][ +  - ]:        372 :   OCCShapeAttributeSet SS;
    1466         [ +  - ]:        186 :   SS.Read(in, CUBIT_TRUE);
    1467         [ +  - ]:        186 :   int nbshapes = SS.NbShapes();
    1468         [ -  + ]:        186 :   if(!nbshapes) return CUBIT_FALSE;
    1469         [ +  - ]:        186 :   SS.Read(Sh,in,nbshapes, &label);
    1470         [ +  - ]:        372 :   return CUBIT_TRUE;
    1471                 :            : }
    1472                 :            :                                    
    1473                 :          0 : CubitBoolean OCCQueryEngine::Read(TopoDS_Shape& Sh,
    1474                 :            :                                   const char* pBuffer,
    1475                 :            :                                   const int n_buffer_size,
    1476                 :            :                                   TDF_Label label)
    1477                 :            : {
    1478                 :            :   // make buffer as input stream
    1479 [ #  # ][ #  # ]:          0 :   std::stringbuf sb;
    1480 [ #  # ][ #  # ]:          0 :   std::iostream is(&sb);
    1481         [ #  # ]:          0 :   is.write(pBuffer, n_buffer_size);
    1482                 :            :   
    1483                 :            :   // read from input stream
    1484 [ #  # ][ #  # ]:          0 :   OCCShapeAttributeSet SS;
    1485         [ #  # ]:          0 :   SS.Read(is, false);
    1486         [ #  # ]:          0 :   int nbshapes = SS.NbShapes();
    1487         [ #  # ]:          0 :   if (!nbshapes) return CUBIT_FALSE;
    1488         [ #  # ]:          0 :   SS.Read(Sh, is, nbshapes, &label);
    1489                 :            : 
    1490         [ #  # ]:          0 :   return CUBIT_TRUE;
    1491                 :            : }
    1492                 :            : 
    1493                 :            : CubitStatus
    1494                 :          0 : OCCQueryEngine::import_temp_geom_file(FILE* file_ptr,
    1495                 :            :                                       const char* file_name,
    1496                 :            :                                       Model_File_Type file_type,
    1497                 :            :                                       DLIList<TopologyBridge*> &bridge_list )
    1498                 :            : {
    1499         [ #  # ]:          0 :   ModelImportOptions M_O;
    1500 [ #  # ][ #  # ]:          0 :   return import_solid_model( file_name, file_type, bridge_list, M_O );
    1501                 :            : }
    1502                 :            : 
    1503                 :            : //===========================================================================
    1504                 :            : //Function Name:import_solid_model
    1505                 :            : //Member Type:  PUBLIC
    1506                 :            : //Description:  function called for read in temporary Brep file
    1507                 :            : //Author:       Jane Hu
    1508                 :            : //Date:         11/16/2007
    1509                 :            : //===========================================================================
    1510                 :            : 
    1511                 :        927 : CubitStatus OCCQueryEngine::import_solid_model(
    1512                 :            :                                                const char* file_name ,
    1513                 :            :                                                Model_File_Type file_type,
    1514                 :            :                                                DLIList<TopologyBridge*> &imported_entities,
    1515                 :            :                                                ModelImportOptions &import_options)
    1516                 :            : {
    1517 [ +  - ][ +  - ]:        927 :   TopoDS_Shape *aShape = new TopoDS_Shape;
    1518                 :            :   
    1519                 :            :   //BRep_Builder aBuilder;
    1520         [ +  + ]:        927 :   if(file_type == OCC_TYPE)
    1521                 :            :   {
    1522         [ +  - ]:        186 :     Standard_Boolean result = Read(*aShape, (char*) file_name, mainLabel);
    1523         [ -  + ]:        186 :     if (result==0) return CUBIT_FAILURE;
    1524                 :            :   }
    1525                 :            : #ifdef HAVE_OCC_STEP 
    1526         [ +  + ]:        741 :   else if (file_type == STEP_TYPE)
    1527                 :            :   {
    1528         [ +  - ]:        719 :     STEPControl_Reader reader;
    1529                 :            : /*
    1530                 :            :     char* name = "xstep.cascade.unit";
    1531                 :            :     char* unit = "M"; 
    1532                 :            :     Standard_CString orig_unit = Interface_Static::CVal(name);
    1533                 :            :     Interface_Static::SetCVal (name, unit); //this set is good for both step
    1534                 :            :                                             // and iges files.
    1535                 :            : */
    1536         [ +  - ]:        719 :     IFSelect_ReturnStatus stat = reader.ReadFile( (char*) file_name);
    1537                 :            : /*
    1538                 :            :     //set the unit back.
    1539                 :            :     Interface_Static::SetCVal (name,orig_unit);
    1540                 :            : */
    1541         [ -  + ]:        719 :     if (stat  != IFSelect_RetDone)
    1542                 :            :     {
    1543 [ #  # ][ #  # ]:          0 :        PRINT_INFO("%s: Cannot open file", file_name );
         [ #  # ][ #  # ]
    1544                 :          0 :        return CUBIT_FAILURE;
    1545                 :            :     } 
    1546         [ +  - ]:        719 :     reader.TransferRoots();
    1547 [ +  - ][ +  - ]:        719 :     *aShape = reader.OneShape(); 
         [ +  - ][ +  - ]
                 [ +  - ]
    1548                 :            :   }
    1549                 :            : #endif
    1550                 :            : #ifdef HAVE_OCC_IGES
    1551         [ +  - ]:         22 :   else if(file_type == IGES_TYPE)
    1552                 :            :   {
    1553         [ +  - ]:         22 :     IGESControl_Reader reader;
    1554                 :            : /*
    1555                 :            :     char* name = "xstep.cascade.unit";
    1556                 :            :     char* unit = "M";
    1557                 :            :     Interface_Static::SetCVal (name, unit); //this set is good for both step
    1558                 :            :                                             // and iges files.
    1559                 :            : */
    1560                 :         22 :     const Standard_CString string1 = file_name;
    1561         [ +  - ]:         22 :     IFSelect_ReturnStatus stat = reader.ReadFile( string1);
    1562                 :            : 
    1563                 :            : //    Interface_Static::SetCVal (name, "MM");
    1564                 :            : 
    1565         [ -  + ]:         22 :     if (stat  != IFSelect_RetDone)
    1566                 :            :     {
    1567 [ #  # ][ #  # ]:          0 :        PRINT_INFO("%s: Cannot open file", file_name );
         [ #  # ][ #  # ]
    1568                 :          0 :        return CUBIT_FAILURE;
    1569                 :            :     } 
    1570         [ +  - ]:         22 :     reader.TransferRoots(); 
    1571 [ +  - ][ +  - ]:         22 :     *aShape = reader.OneShape();
         [ +  - ][ +  - ]
                 [ +  - ]
    1572                 :            :   } 
    1573                 :            : #endif
    1574                 :            :   else 
    1575                 :            :   {
    1576 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("File formats other than OCC, STEP and IGES are not supported by OCC\n");
         [ #  # ][ #  # ]
    1577                 :          0 :     return CUBIT_FAILURE;
    1578                 :            :   }
    1579                 :            :     
    1580                 :            :   //All read in shapes are wrapped inside a compound shape. Ignore this one
    1581         [ +  - ]:        927 :   TopoDS_Iterator it(*aShape);
    1582 [ +  - ][ +  + ]:        927 :   if(aShape->ShapeType() != TopAbs_COMPOUND)
    1583                 :            :   {
    1584 [ +  - ][ +  - ]:        627 :     imported_entities += populate_topology_bridge(*aShape);
                 [ +  - ]
    1585                 :        627 :     return CUBIT_SUCCESS;
    1586                 :            :   }
    1587                 :            : 
    1588 [ +  - ][ +  - ]:       1463 :   for(;it.More();it.Next())
                 [ +  + ]
    1589                 :            :   {
    1590 [ +  - ][ +  - ]:       1163 :     TopoDS_Shape shape = it.Value();
    1591 [ +  - ][ +  - ]:       1163 :     imported_entities += populate_topology_bridge(shape);
                 [ +  - ]
    1592         [ +  - ]:       1163 :   }
    1593                 :            : 
    1594         [ +  - ]:        927 :   return CUBIT_SUCCESS;
    1595                 :            : }
    1596                 :            : 
    1597                 :          0 : CubitStatus OCCQueryEngine::import_solid_model(DLIList<TopologyBridge*> &imported_entities,
    1598                 :            :                                                const char* pBuffer,
    1599                 :            :                                                const int n_buffer_size)
    1600                 :            : {
    1601 [ #  # ][ #  # ]:          0 :   TopoDS_Shape *aShape = new TopoDS_Shape;
    1602         [ #  # ]:          0 :   Standard_Boolean result = Read(*aShape, pBuffer, n_buffer_size, mainLabel);
    1603         [ #  # ]:          0 :   if (result==0) return CUBIT_FAILURE;
    1604                 :            :   
    1605                 :            :   //All read in shapes are wrapped inside a compound shape. Ignore this one
    1606         [ #  # ]:          0 :   TopoDS_Iterator it(*aShape);
    1607 [ #  # ][ #  # ]:          0 :   if(aShape->ShapeType() != TopAbs_COMPOUND)
    1608                 :            :   {
    1609 [ #  # ][ #  # ]:          0 :     imported_entities += populate_topology_bridge(*aShape);
                 [ #  # ]
    1610                 :          0 :     return CUBIT_SUCCESS;
    1611                 :            :   }
    1612                 :            : 
    1613 [ #  # ][ #  # ]:          0 :   for(;it.More();it.Next())
                 [ #  # ]
    1614                 :            :   {
    1615 [ #  # ][ #  # ]:          0 :     TopoDS_Shape shape = it.Value();
    1616 [ #  # ][ #  # ]:          0 :     imported_entities += populate_topology_bridge(shape);
                 [ #  # ]
    1617         [ #  # ]:          0 :   }
    1618                 :            : 
    1619         [ #  # ]:          0 :   return CUBIT_SUCCESS;
    1620                 :            : }
    1621                 :            : 
    1622                 :            : //===========================================================================
    1623                 :            : //Function Name:populate_topology_bridge
    1624                 :            : //Member Type:  PUBLIC
    1625                 :            : //Description:  function called for populating topology bridge for OCC entity 
    1626                 :            : //Author:       Jane Hu
    1627                 :            : //Date:         11/16/2007
    1628                 :            : //===========================================================================
    1629                 :            : 
    1630                 :       2096 : DLIList<TopologyBridge*> OCCQueryEngine::populate_topology_bridge(TopoDS_Shape& aShape)
    1631                 :            : {
    1632                 :       2096 :   DLIList<TopologyBridge*> tblist;
    1633                 :            :   // suitable to populate for a  TopoDS_Compound shape.
    1634 [ +  - ][ +  + ]:       2096 :   if ( aShape.ShapeType() == TopAbs_COMPOUND)
    1635 [ +  - ][ +  - ]:        229 :     tblist.append(populate_topology_bridge(TopoDS::Compound(aShape)));
                 [ +  - ]
    1636                 :            : 
    1637 [ +  - ][ +  + ]:       1867 :   else if(aShape.ShapeType() == TopAbs_SOLID)
    1638                 :            :   {
    1639                 :            :     Lump *lump = 
    1640 [ +  - ][ +  - ]:       1116 :     populate_topology_bridge(TopoDS::Solid(aShape), CUBIT_TRUE);
    1641 [ -  + ][ +  - ]:       1116 :     tblist.append(CAST_TO(lump, OCCLump)->get_body());
                 [ +  - ]
    1642                 :            :   }
    1643                 :            : 
    1644 [ +  - ][ +  + ]:        751 :   else if(aShape.ShapeType() == TopAbs_SHELL)
    1645                 :            :   {
    1646                 :            :     OCCShell* shell =
    1647 [ +  - ][ +  - ]:        311 :        populate_topology_bridge(TopoDS::Shell(aShape), CUBIT_TRUE);
    1648 [ +  - ][ +  - ]:        311 :     tblist.append(shell->my_body());
    1649                 :            :   }
    1650                 :            : 
    1651 [ +  - ][ +  + ]:        440 :   else if(aShape.ShapeType() == TopAbs_FACE)
    1652                 :            :   {
    1653                 :            :     Surface* face =
    1654 [ +  - ][ +  - ]:        231 :       populate_topology_bridge(TopoDS::Face(aShape), CUBIT_TRUE);
    1655         [ +  - ]:        231 :     if(face)
    1656 [ -  + ][ +  - ]:        231 :       tblist.append(CAST_TO(face, OCCSurface)->my_body());
                 [ +  - ]
    1657                 :            :   }
    1658                 :            : 
    1659 [ +  - ][ -  + ]:        209 :   else if(aShape.ShapeType() == TopAbs_WIRE)
    1660 [ #  # ][ #  # ]:          0 :     populate_topology_bridge(TopoDS::Wire(aShape), CUBIT_TRUE);
    1661                 :            : 
    1662 [ +  - ][ +  - ]:        209 :   else if(aShape.ShapeType() == TopAbs_EDGE)
    1663 [ +  - ][ +  - ]:        209 :     tblist.append(populate_topology_bridge(TopoDS::Edge(aShape),CUBIT_TRUE));
                 [ +  - ]
    1664                 :            : 
    1665 [ #  # ][ #  # ]:          0 :   else if(aShape.ShapeType() == TopAbs_VERTEX)
    1666 [ #  # ][ #  # ]:          0 :     tblist.append(populate_topology_bridge(TopoDS::Vertex(aShape), CUBIT_TRUE));
                 [ #  # ]
    1667                 :            :   else
    1668 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("Wrong topology type is given. \n");
         [ #  # ][ #  # ]
    1669         [ +  - ]:       2096 :   tblist.remove_all_with_value(NULL);
    1670                 :       2096 :   return tblist;
    1671                 :            : }
    1672                 :            : 
    1673                 :        282 : BodySM* OCCQueryEngine::populate_topology_bridge(const TopoDS_Compound& aShape)
    1674                 :            : {
    1675 [ +  - ][ -  + ]:        282 :   if(aShape.IsNull())
    1676                 :          0 :     return (BodySM*)NULL;
    1677                 :        282 :   OCCBody *body = (OCCBody*)NULL;
    1678 [ +  - ][ -  + ]:        564 :   if (!OCCMap->IsBound(aShape) || 
         [ #  # ][ +  - ]
    1679 [ #  # ][ #  # ]:        282 :        OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end())
         [ #  # ][ #  # ]
         [ -  + ][ +  - ]
           [ #  #  #  # ]
    1680                 :            :     {
    1681                 :            :       //check to see if this compound has only one lump which is already in 
    1682                 :            :       //in another body. Unite operation will return a one lump compound.
    1683                 :            :       //Check also if this compound has only shells. which is or has faces that
    1684                 :            :       //are already in another body. Unite faces will return such shell.
    1685         [ +  - ]:        282 :       TopExp_Explorer Ex;
    1686                 :        282 :       int num_lumps = 0, num_shells = 0, num_faces = 0;
    1687 [ +  - ][ +  - ]:        564 :       TopoDS_Solid solid;
                 [ +  + ]
    1688 [ +  - ][ +  - ]:        859 :       for (Ex.Init(aShape, TopAbs_SOLID); Ex.More(); Ex.Next()) 
         [ +  - ][ +  + ]
    1689                 :            :       {
    1690                 :        577 :         num_lumps++;
    1691 [ +  - ][ +  - ]:        577 :         solid = TopoDS::Solid(Ex.Current());
                 [ +  - ]
    1692                 :            :       }
    1693                 :            : 
    1694 [ +  - ][ +  - ]:        564 :       TopoDS_Shell shell;
                 [ +  + ]
    1695 [ +  - ][ #  # ]:        282 :       for (Ex.Init(aShape, TopAbs_SHELL, TopAbs_SOLID); Ex.More(); Ex.Next())
         [ +  - ][ -  + ]
    1696                 :            :       {
    1697                 :          0 :         num_shells++;
    1698 [ #  # ][ #  # ]:          0 :         shell = TopoDS::Shell(Ex.Current());
                 [ #  # ]
    1699                 :            :       }
    1700                 :            : 
    1701 [ +  - ][ +  - ]:        564 :       TopoDS_Face face;
                 [ +  + ]
    1702 [ +  - ][ #  # ]:        282 :       for (Ex.Init(aShape, TopAbs_FACE, TopAbs_SHELL);  Ex.More(); Ex.Next())
         [ +  - ][ -  + ]
    1703                 :            :       {
    1704                 :          0 :         num_faces++;
    1705 [ #  # ][ #  # ]:          0 :         face = TopoDS::Face(Ex.Current());
                 [ #  # ]
    1706                 :            :       }
    1707                 :            : 
    1708         [ +  + ]:        282 :       if(num_faces + num_shells + num_lumps == 1)
    1709                 :            :       {
    1710 [ -  + ][ #  # ]:        370 :         if (num_faces  == 1 && (!OCCMap->IsBound(face) ||
         [ #  # ][ #  # ]
                 [ -  + ]
    1711 [ #  # ][ #  # ]:        185 :                       OccToCGM->find(OCCMap->Find(face)) == OccToCGM->end()))
         [ #  # ][ #  # ]
         [ -  + ][ +  - ]
           [ #  #  #  # ]
    1712                 :            :         {
    1713         [ #  # ]:          0 :           Surface* surface = populate_topology_bridge(face, CUBIT_TRUE);
    1714 [ #  # ][ #  # ]:          0 :           return CAST_TO(surface, OCCSurface)->my_body();
    1715                 :            :         }
    1716 [ -  + ][ #  # ]:        370 :         else if (num_shells == 1 && (!OCCMap->IsBound(shell)||
         [ #  # ][ #  # ]
                 [ -  + ]
    1717 [ #  # ][ #  # ]:        185 :                   OccToCGM->find(OCCMap->Find(shell)) == OccToCGM->end()))
         [ #  # ][ #  # ]
         [ -  + ][ +  - ]
           [ #  #  #  # ]
    1718                 :            :         {
    1719         [ #  # ]:          0 :           OCCShell* occ_shell = populate_topology_bridge(shell, CUBIT_TRUE);
    1720         [ #  # ]:          0 :           return occ_shell->my_body();
    1721                 :            :         }
    1722 [ +  - ][ +  - ]:        718 :         else if( num_lumps == 1 && (!OCCMap->IsBound(solid) ||
         [ +  + ][ -  + ]
                 [ +  + ]
    1723 [ +  - ][ +  - ]:        533 :                   OccToCGM->find(OCCMap->Find(solid)) == OccToCGM->end()))
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
           [ #  #  #  # ]
    1724                 :            :         {
    1725         [ +  - ]:         11 :           Lump* lump= populate_topology_bridge(solid, CUBIT_TRUE);
    1726 [ -  + ][ +  - ]:         11 :           return CAST_TO(lump, OCCLump)->get_body();
    1727                 :            :         }
    1728                 :            :         else //find existing body
    1729                 :            :         {
    1730                 :            :           int k;
    1731         [ +  - ]:        174 :           if(num_lumps == 1)
    1732                 :            :           {
    1733         [ +  - ]:        174 :             k = OCCMap->Find(solid);
    1734 [ +  - ][ +  - ]:        174 :             OCCLump* lump = (OCCLump*)(OccToCGM->find(k))->second;
    1735 [ +  - ][ -  + ]:        174 :             body = CAST_TO(lump->get_body(), OCCBody);
    1736                 :            :           }
    1737         [ #  # ]:          0 :           else if (num_shells == 1)
    1738                 :            :           {
    1739         [ #  # ]:          0 :             k = OCCMap->Find(shell);
    1740 [ #  # ][ #  # ]:          0 :             OCCShell* occ_shell = (OCCShell*)(OccToCGM->find(k))->second;
    1741         [ #  # ]:          0 :             body = occ_shell->my_body();
    1742                 :            :           }
    1743                 :            :           else
    1744                 :            :           {
    1745         [ #  # ]:          0 :             k = OCCMap->Find(face);
    1746 [ #  # ][ #  # ]:          0 :             OCCSurface* occ_surface = (OCCSurface*) (OccToCGM->find(k))->second;
    1747         [ #  # ]:        174 :             body = occ_surface->my_body();
    1748                 :            :           }
    1749                 :            :         }
    1750                 :            :       } 
    1751                 :            : 
    1752                 :            :       else
    1753                 :            :       {
    1754 [ +  - ][ +  - ]:         97 :         TopoDS_Compound *comsolid = new TopoDS_Compound;
    1755         [ +  - ]:         97 :         *comsolid = aShape;
    1756 [ +  - ][ +  - ]:         97 :         body = new OCCBody(comsolid);
    1757                 :            :         int current_id;
    1758 [ +  - ][ +  - ]:         97 :         if(!OCCMap->IsBound(aShape))
    1759                 :            :         {
    1760                 :         97 :           iTotalTBCreated++;
    1761                 :         97 :           current_id = iTotalTBCreated;
    1762         [ +  - ]:         97 :           OCCMap->Bind(aShape, current_id);
    1763                 :            :         }
    1764                 :            : 
    1765                 :            :         else
    1766         [ #  # ]:          0 :           current_id = OCCMap->Find(aShape);
    1767                 :            : 
    1768                 :            :         OccToCGM->insert(valType(current_id,
    1769 [ +  - ][ +  - ]:         97 :                              (TopologyBridge*)body));
    1770 [ +  - ][ +  - ]:        282 :         BodyList->append(body);
                 [ +  + ]
    1771                 :        282 :       }
    1772                 :            :     }
    1773                 :            :     else
    1774                 :            :     {
    1775         [ #  # ]:          0 :       int k = OCCMap->Find(aShape);
    1776 [ #  # ][ #  # ]:          0 :       body = (OCCBody*)(OccToCGM->find(k))->second;
    1777         [ #  # ]:          0 :       TopoDS_Compound compound = aShape;
    1778 [ #  # ][ #  # ]:          0 :       body->set_TopoDS_Shape(compound);
    1779                 :            :     }
    1780                 :            : 
    1781         [ +  - ]:        271 :   TopExp_Explorer Ex;
    1782 [ +  - ][ +  - ]:        542 :   DLIList<Lump*> lumps;
    1783 [ +  - ][ +  - ]:        837 :   for (Ex.Init(aShape, TopAbs_SOLID); Ex.More(); Ex.Next())
         [ +  - ][ +  + ]
    1784                 :            :   {
    1785 [ +  - ][ +  - ]:        566 :      TopoDS_Shape sh = Ex.Current();
    1786 [ +  - ][ +  - ]:        566 :      Lump* lump = populate_topology_bridge(TopoDS::Solid(sh));
    1787         [ +  - ]:        566 :      lumps.append(lump);
    1788 [ -  + ][ +  - ]:        566 :      CAST_TO(lump, OCCLump)->add_body(body);
    1789                 :            :      //add the solid shape into map
    1790 [ +  - ][ +  - ]:       1132 :      TopoDS_Shape parent = aShape;
    1791                 :            :      int current_id;
    1792         [ +  - ]:        566 :      add_shape_to_map(sh, parent, current_id);
    1793 [ +  - ][ +  - ]:       2264 :      if(!OCCMap->IsBound(sh) ||
         [ +  + ][ +  + ]
    1794 [ +  - ][ +  - ]:       1698 :         OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
           [ #  #  #  # ]
    1795 [ +  - ][ +  - ]:        392 :         OccToCGM->insert(valType(current_id, (TopologyBridge*)lump));
    1796         [ +  - ]:        566 :   }
    1797         [ +  - ]:        271 :   body->lumps(lumps);
    1798                 :            : 
    1799 [ +  - ][ +  - ]:        542 :   DLIList<OCCShell*> shells;
    1800 [ +  - ][ #  # ]:        271 :   for (Ex.Init(aShape, TopAbs_SHELL, TopAbs_SOLID);Ex.More(); Ex.Next())
         [ +  - ][ -  + ]
    1801                 :            :   {
    1802 [ #  # ][ #  # ]:          0 :     TopoDS_Shape sh = Ex.Current();
    1803 [ #  # ][ #  # ]:          0 :     OCCShell * shell = populate_topology_bridge(TopoDS::Shell(sh)); 
    1804         [ #  # ]:          0 :     OCCLump* lump = shell->my_lump();
    1805         [ #  # ]:          0 :     if(lump == (OCCLump*)NULL)
    1806 [ #  # ][ #  # ]:          0 :       lump = new OCCLump(NULL, NULL, shell);
    1807         [ #  # ]:          0 :     lumps.append(lump);
    1808         [ #  # ]:          0 :     lump->add_body(body);
    1809         [ #  # ]:          0 :     shell->set_body(body);
    1810         [ #  # ]:          0 :     shell->set_lump(lump);  
    1811         [ #  # ]:          0 :     shells.append(shell);
    1812 [ #  # ][ #  # ]:          0 :     TopoDS_Shape parent = aShape;
    1813                 :            :     int current_id;
    1814         [ #  # ]:          0 :     add_shape_to_map(sh, parent, current_id);
    1815 [ #  # ][ #  # ]:          0 :     if(!OCCMap->IsBound(sh) ||
         [ #  # ][ #  # ]
    1816 [ #  # ][ #  # ]:          0 :      OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end())
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
           [ #  #  #  # ]
    1817 [ #  # ][ #  # ]:          0 :        OccToCGM->insert(valType(current_id, (TopologyBridge*)shell));
    1818         [ #  # ]:          0 :   }
    1819 [ +  - ][ +  - ]:        271 :   body->shells(shells);
                 [ +  - ]
    1820                 :            :   
    1821 [ +  - ][ +  - ]:        542 :   DLIList<OCCSurface*> surfaces;
    1822 [ +  - ][ #  # ]:        271 :   for (Ex.Init(aShape, TopAbs_FACE, TopAbs_SHELL);Ex.More(); Ex.Next())
         [ +  - ][ -  + ]
    1823                 :            :   {
    1824 [ #  # ][ #  # ]:          0 :     TopoDS_Shape sh = Ex.Current();
    1825 [ #  # ][ #  # ]:          0 :     Surface* face = populate_topology_bridge(TopoDS::Face(sh));
    1826         [ #  # ]:          0 :     OCCSurface *surface = CAST_TO(face, OCCSurface);
    1827         [ #  # ]:          0 :     OCCShell* shell = surface->my_shell();
    1828         [ #  # ]:          0 :     if (shell == (OCCShell*) NULL)
    1829 [ #  # ][ #  # ]:          0 :       shell = new OCCShell(NULL, surface);
    1830         [ #  # ]:          0 :     OCCLump* lump = surface->my_lump();
    1831         [ #  # ]:          0 :     if(lump == (OCCLump*) NULL)
    1832 [ #  # ][ #  # ]:          0 :       lump = new OCCLump(NULL, surface);
    1833         [ #  # ]:          0 :     lumps.append(lump);
    1834         [ #  # ]:          0 :     lump->add_body(body);
    1835         [ #  # ]:          0 :     surface->set_body(body);
    1836         [ #  # ]:          0 :     surface->set_lump(lump);
    1837         [ #  # ]:          0 :     surface->set_shell(shell);
    1838         [ #  # ]:          0 :     shell->set_body(body);
    1839         [ #  # ]:          0 :     shell->set_lump(lump);
    1840 [ #  # ][ #  # ]:          0 :     TopoDS_Shape parent = aShape;
    1841         [ #  # ]:          0 :     surfaces.append(surface);
    1842                 :            :     int current_id;
    1843         [ #  # ]:          0 :     add_shape_to_map(sh, parent, current_id);
    1844 [ #  # ][ #  # ]:          0 :     if(!OCCMap->IsBound(sh) ||
         [ #  # ][ #  # ]
    1845 [ #  # ][ #  # ]:          0 :      OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end())
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
           [ #  #  #  # ]
    1846 [ #  # ][ #  # ]:          0 :        OccToCGM->insert(valType(current_id, (TopologyBridge*)face));
    1847                 :            : 
    1848         [ #  # ]:          0 :   } 
    1849 [ +  - ][ +  - ]:        271 :   body->set_sheet_surfaces(surfaces);
                 [ +  - ]
    1850         [ +  - ]:        282 :   return body;
    1851                 :            : }
    1852                 :            : 
    1853                 :       2533 : Lump* OCCQueryEngine::populate_topology_bridge(const TopoDS_Solid& aShape,
    1854                 :            :                                                CubitBoolean build_body)
    1855                 :            : {
    1856 [ +  - ][ -  + ]:       2533 :   if(aShape.IsNull())
    1857                 :          0 :     return (Lump*)NULL;
    1858                 :            : 
    1859                 :       2533 :   OCCLump *lump = NULL;
    1860                 :       2533 :   OCCBody *body = NULL;
    1861                 :       2533 :   int current_lump_number = 0;
    1862 [ +  - ][ +  + ]:       6022 :   if (!OCCMap->IsBound(aShape) || 
         [ +  + ][ +  + ]
    1863 [ +  - ][ +  - ]:       3489 :       OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
           [ #  #  #  # ]
    1864                 :            :   {
    1865 [ +  - ][ +  - ]:       2238 :     TopoDS_Solid *posolid =  new TopoDS_Solid;
    1866         [ +  - ]:       2238 :     *posolid = aShape;
    1867 [ +  - ][ +  - ]:       2238 :     lump = new OCCLump(posolid);
    1868         [ +  + ]:       2238 :     if (build_body)
    1869                 :            :     {
    1870 [ +  - ][ +  + ]:       1846 :       if(OCCMap->IsBound(aShape))
    1871         [ +  - ]:        183 :         current_lump_number = OCCMap->Find(aShape);
    1872                 :            :       else
    1873                 :            :       {
    1874                 :       1663 :         iTotalTBCreated++;
    1875                 :       1663 :         current_lump_number = iTotalTBCreated;
    1876                 :            :       }
    1877 [ +  - ][ +  - ]:       1846 :       body = new OCCBody(NULL, NULL, NULL, lump);
    1878         [ +  - ]:       1846 :       DLIList<CubitSimpleAttrib> csa_list;
    1879         [ +  - ]:       1846 :       lump->get_simple_attribute(csa_list);
    1880                 :            :       //if there's body attribute, append it to body and delete it from lump.
    1881 [ +  - ][ +  + ]:       2175 :       for(int i = 0; i < csa_list.size(); i++)
    1882                 :            :       {
    1883         [ +  - ]:        329 :         const CubitSimpleAttrib& csa = csa_list.get_and_step();
    1884 [ +  - ][ +  - ]:        329 :         CubitString type = csa.string_data_list()[0];
                 [ +  - ]
    1885 [ +  - ][ +  - ]:        658 :         CubitString subtype = type.substr(0,12);
    1886 [ +  - ][ +  - ]:        329 :         if(subtype == "#SINGLELUMP%")
         [ +  - ][ +  + ]
    1887                 :            :         {  
    1888         [ +  - ]:        146 :           lump->remove_simple_attribute_virt(csa);
    1889         [ +  - ]:        146 :           CubitSimpleAttrib copy = csa;
    1890 [ +  - ][ +  - ]:        146 :           copy.string_data_list().erase(copy.string_data_list().begin());
         [ +  - ][ +  - ]
    1891 [ +  - ][ +  - ]:        146 :           body->append_simple_attribute_virt(copy);
    1892                 :            :         }
    1893         [ +  - ]:        329 :       }
    1894         [ +  - ]:       1846 :       BodyList->append(body);
    1895 [ +  - ][ +  - ]:       2238 :       lump->add_body(body);
    1896                 :            :     }
    1897                 :            :   }
    1898                 :            :   else 
    1899                 :            :   {
    1900         [ +  - ]:        295 :     int k = OCCMap->Find(aShape);
    1901 [ +  - ][ +  - ]:        295 :     lump = (OCCLump*)(OccToCGM->find(k))->second;
    1902 [ +  - ][ +  - ]:        295 :     lump->set_TopoDS_Solid(aShape);
                 [ +  - ]
    1903         [ +  - ]:        295 :     body = static_cast<OCCBody*>(lump->get_body());
    1904                 :        295 :     TopoDS_Shape *b_shape = NULL;
    1905         [ +  - ]:        295 :     if(body)
    1906         [ +  - ]:        295 :       body->get_TopoDS_Shape(b_shape);
    1907 [ +  - ][ +  + ]:        295 :     if (!body || b_shape == NULL)
    1908                 :            :     { 
    1909         [ +  - ]:         88 :       if(body)
    1910         [ +  - ]:         88 :         BodyList->remove(body);
    1911 [ +  - ][ +  - ]:         88 :       body = new OCCBody(NULL, NULL, NULL, lump);
    1912         [ +  - ]:         88 :       BodyList->append(body);
    1913         [ +  - ]:        295 :       lump->add_body(body);
    1914                 :            :     }
    1915                 :            :   }
    1916                 :            : 
    1917                 :       2533 :   TopoDS_Compound *shape = NULL;
    1918         [ +  + ]:       2533 :   if(body)
    1919         [ +  - ]:       2141 :     shape = body->get_TopoDS_Shape();
    1920                 :            : 
    1921 [ +  + ][ +  - ]:       2533 :   if(build_body && OCCMap->IsBound(aShape) && shape && !shape->IsNull())
         [ +  + ][ -  + ]
         [ #  # ][ #  # ]
                 [ -  + ]
    1922                 :            :   {
    1923 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("Single lump body shouldn't have Compound shape.\n");
         [ #  # ][ #  # ]
    1924                 :          0 :     return (Lump*) NULL;
    1925                 :            :   }
    1926                 :            : 
    1927         [ +  - ]:       2533 :   TopExp_Explorer Ex;
    1928 [ +  - ][ +  - ]:       5126 :   for (Ex.Init(aShape, TopAbs_SHELL); Ex.More(); Ex.Next())
         [ +  - ][ +  + ]
    1929                 :            :   {
    1930 [ +  - ][ +  - ]:       2593 :     TopoDS_Shape sh = Ex.Current();
    1931 [ +  - ][ +  - ]:       2593 :     OCCShell* shell = populate_topology_bridge(TopoDS::Shell(sh));
    1932         [ +  - ]:       2593 :     shell->set_lump(lump);
    1933         [ +  - ]:       2593 :     shell->set_body(body);
    1934 [ +  - ][ +  - ]:       5186 :     TopoDS_Shape parent = aShape;
    1935                 :            :     int current_id;
    1936         [ +  - ]:       2593 :     add_shape_to_map(sh, parent, current_id);
    1937 [ +  - ][ +  - ]:      10372 :     if(!OCCMap->IsBound(sh) ||
         [ +  + ][ +  + ]
    1938 [ +  - ][ +  - ]:       7779 :      OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
           [ #  #  #  # ]
    1939 [ +  - ][ +  - ]:       2298 :        OccToCGM->insert(valType(current_id, (TopologyBridge*)shell));
    1940         [ +  - ]:       2593 :   } 
    1941                 :            : 
    1942 [ +  + ][ +  - ]:       5674 :   if(build_body && (!OCCMap->IsBound(aShape)||
         [ +  + ][ +  + ]
                 [ +  + ]
    1943 [ +  - ][ +  - ]:       3141 :       OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end()))
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
           [ #  #  #  # ]
    1944                 :            :   {
    1945 [ +  - ][ +  + ]:       1846 :     if (!OCCMap->IsBound(aShape))
    1946         [ +  - ]:       1663 :       OCCMap->Bind(aShape, current_lump_number);
    1947                 :            :     OccToCGM->insert(valType(current_lump_number,
    1948 [ +  - ][ +  - ]:       1846 :                        (TopologyBridge*)lump));
    1949                 :            :   }
    1950         [ +  - ]:       2533 :   return lump;
    1951                 :            : }
    1952                 :            : 
    1953                 :     262761 : void OCCQueryEngine::add_shape_to_map(TopoDS_Shape& sh,
    1954                 :            :                                       TopoDS_Shape& aShape, /*In, parent */
    1955                 :            :                                       int &current_id /*Out*/)
    1956                 :            : {
    1957                 :            :   //add the shape into map
    1958         [ -  + ]:     262761 :   if(sh.IsNull())
    1959                 :     262761 :     return;
    1960                 :            : 
    1961 [ +  - ][ +  + ]:     860188 :   if(!OCCMap->IsBound(sh) ||
         [ +  + ][ +  + ]
    1962 [ +  - ][ +  - ]:     597427 :      OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
           [ #  #  #  # ]
    1963                 :            :   {
    1964         [ +  - ]:      96198 :      DLIList<TopoDS_Shape*> list;
    1965                 :            :      //find the sh shape without aShape's location.
    1966 [ +  - ][ +  - ]:     192396 :      TopLoc_Location L = aShape.Location();
                 [ +  - ]
    1967 [ +  - ][ +  - ]:     192396 :      TopoDS_Iterator it(aShape, Standard_True, Standard_False);
    1968 [ +  - ][ +  - ]:     192396 :      TopoDS_Shape bare_shape;
    1969 [ +  - ][ +  - ]:     450017 :      for(; it.More(); it.Next())
                 [ +  + ]
    1970                 :            :      {
    1971 [ +  - ][ +  - ]:     353819 :        TopoDS_Shape test_shape = it.Value();
    1972         [ +  - ]:     353819 :        test_shape.Move(L);
    1973 [ +  - ][ +  + ]:     353819 :        if(sh.IsEqual(test_shape))
    1974                 :            :        {
    1975 [ +  - ][ +  - ]:      87865 :          bare_shape = it.Value();
    1976 [ +  - ][ +  + ]:     353819 :          break;
    1977                 :            :        }
    1978                 :     265954 :      }
    1979 [ +  - ][ +  + ]:      96198 :      if(!OCCMap->IsBound(sh))
    1980                 :            :      {
    1981                 :      95428 :        CubitBoolean shape_found = false;
    1982 [ +  - ][ +  + ]:      95428 :        if(OCCMap->IsBound(bare_shape))
    1983                 :            :        {
    1984         [ +  - ]:       2382 :          current_id = OCCMap->Find(bare_shape);
    1985                 :            :          //There are two possiblities when coming here:
    1986                 :            :          //1. After OCCAttribute binds the bare_shape but not binds the topo.
    1987                 :            :          //2. The bare_shape is bound because it binds to a different topo. 
    1988 [ +  - ][ +  - ]:       2382 :          if( OccToCGM->find(current_id) == OccToCGM->end() )        
         [ +  - ][ +  - ]
    1989                 :            :          {
    1990         [ +  - ]:       2382 :            OCCMap->UnBind(bare_shape);
    1991                 :            :            std::map<int, TDF_Label>::iterator it = 
    1992         [ +  - ]:       2382 :               Shape_Label_Map->find(current_id);
    1993 [ +  - ][ +  - ]:       2382 :            if(it != Shape_Label_Map->end())
                 [ +  - ]
    1994                 :            :            {
    1995         [ +  - ]:       2382 :              TDF_Label aLabel = (*it).second;
    1996 [ +  - ][ +  - ]:       2382 :              Handle_TDataXtd_Shape attr_shape = TDataXtd_Shape::Set(aLabel, sh);
    1997                 :            :            }
    1998                 :       2382 :            shape_found = true;
    1999                 :            :          }
    2000                 :            :        }
    2001         [ +  + ]:      95428 :        if(!shape_found)
    2002                 :            :        {
    2003                 :      93046 :          iTotalTBCreated++;
    2004                 :      93046 :          current_id = iTotalTBCreated;
    2005                 :            :        }
    2006         [ +  - ]:      95428 :        OCCMap->Bind(sh, current_id);
    2007                 :            :     }
    2008                 :            :     else
    2009 [ +  - ][ +  - ]:      96968 :       current_id = OCCMap->Find(sh);
    2010                 :            :   }
    2011                 :            :   else
    2012                 :     166563 :     current_id = OCCMap->Find(sh);
    2013                 :            : }
    2014                 :            : 
    2015                 :       2904 : OCCShell* OCCQueryEngine::populate_topology_bridge(const TopoDS_Shell& aShape,
    2016                 :            :                                                    CubitBoolean standalone)
    2017                 :            : {
    2018 [ +  - ][ -  + ]:       2904 :   if(aShape.IsNull())
    2019                 :          0 :     return (OCCShell*)NULL;
    2020                 :            :   OCCShell *shell ;
    2021 [ +  - ][ +  + ]:       6398 :   if (!OCCMap->IsBound(aShape) ||
         [ -  + ][ +  + ]
    2022 [ +  - ][ +  - ]:       3494 :       OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
           [ #  #  #  # ]
    2023                 :            :   {
    2024         [ +  + ]:       2609 :     if(standalone)
    2025                 :            :     {
    2026                 :            :       //check if just has one Face,if so, don't make new shell.
    2027         [ +  - ]:        311 :       TopExp_Explorer Ex;
    2028                 :        311 :       int num_faces = 0;
    2029 [ +  - ][ +  - ]:        622 :       TopoDS_Face topo_face;
                 [ -  + ]
    2030 [ +  - ][ +  - ]:        622 :       for (Ex.Init(aShape, TopAbs_FACE); Ex.More(); Ex.Next())
         [ +  - ][ +  + ]
    2031                 :            :       {
    2032 [ +  - ][ +  - ]:        311 :         topo_face = TopoDS::Face(Ex.Current());
                 [ +  - ]
    2033                 :        311 :         num_faces++;
    2034                 :            :       }
    2035         [ +  - ]:        311 :       if(num_faces == 1)
    2036                 :            :       {
    2037         [ +  - ]:        311 :         Surface* face = populate_topology_bridge(topo_face, standalone);
    2038 [ -  + ][ +  - ]:        311 :         return CAST_TO(face, OCCSurface)->my_shell();
         [ +  - ][ -  + ]
    2039                 :        311 :       }
    2040                 :            :     }
    2041 [ +  - ][ +  - ]:       2298 :     TopoDS_Shell *poshell = new TopoDS_Shell;
    2042         [ +  - ]:       2298 :     *poshell = aShape;
    2043 [ +  - ][ +  - ]:       2298 :     shell = new OCCShell(poshell);
    2044         [ +  - ]:       2298 :     shell->set_body(NULL);
    2045         [ +  - ]:       2298 :     shell->set_lump(NULL); 
    2046         [ -  + ]:       2298 :     if(standalone)
    2047                 :            :     {
    2048 [ #  # ][ #  # ]:          0 :       OCCLump* lump = new OCCLump(NULL, NULL, shell);
    2049 [ #  # ][ #  # ]:          0 :       OCCBody* body = new OCCBody(NULL, NULL, shell);
    2050         [ #  # ]:          0 :       BodyList->append(body);
    2051         [ #  # ]:          0 :       shell->set_body(body);
    2052         [ #  # ]:          0 :       shell->set_lump(lump);
    2053                 :            :       int k;
    2054 [ #  # ][ #  # ]:          0 :       if(!OCCMap->IsBound(aShape))
    2055                 :            :       {
    2056                 :          0 :         iTotalTBCreated++;
    2057                 :          0 :         k = iTotalTBCreated;
    2058         [ #  # ]:          0 :         OCCMap->Bind(*poshell, k);
    2059                 :            :       }
    2060                 :            :       else
    2061         [ #  # ]:          0 :         k = OCCMap->Find(aShape); 
    2062 [ #  # ][ #  # ]:       2298 :       OccToCGM->insert(valType(k, (TopologyBridge*)shell));
    2063                 :            :     }
    2064                 :            :   }
    2065                 :            :   else
    2066                 :            :   {
    2067         [ +  - ]:        295 :     int k = OCCMap->Find(aShape);
    2068 [ +  - ][ +  - ]:        295 :     shell = (OCCShell*)(OccToCGM->find(k))->second;
    2069 [ +  - ][ +  - ]:        295 :     shell->set_TopoDS_Shell(aShape);
                 [ +  - ]
    2070                 :            :   }
    2071                 :            : 
    2072         [ +  - ]:       2593 :   DLIList<OCCSurface*> memberSurfaces;
    2073 [ +  - ][ +  - ]:       5186 :   TopExp_Explorer Ex;
    2074 [ +  - ][ +  - ]:      19740 :   for (Ex.Init(aShape, TopAbs_FACE); Ex.More(); Ex.Next())
         [ +  - ][ +  + ]
    2075                 :            :   {
    2076 [ +  - ][ +  - ]:      17147 :     TopoDS_Shape sh = Ex.Current();
    2077 [ +  - ][ +  - ]:      34294 :     TopoDS_Face topo_face = TopoDS::Face(sh);
         [ +  - ][ +  - ]
    2078                 :            :     Surface* face =
    2079         [ +  - ]:      17147 :       populate_topology_bridge(topo_face, CUBIT_FALSE);
    2080                 :            :     
    2081 [ +  - ][ +  - ]:      34294 :     TopoDS_Shape parent = aShape; 
                 [ +  - ]
    2082                 :            :     int current_id;
    2083         [ +  - ]:      17147 :     add_shape_to_map(sh, parent, current_id);
    2084 [ +  - ][ +  - ]:      68588 :     if(!OCCMap->IsBound(sh) ||
         [ +  + ][ +  + ]
    2085 [ +  - ][ +  - ]:      51441 :      OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
           [ #  #  #  # ]
    2086 [ +  - ][ +  - ]:      15146 :        OccToCGM->insert(valType(current_id, (TopologyBridge*)face));
    2087                 :            : 
    2088         [ -  + ]:      17147 :     if(!face)
    2089                 :          0 :       continue;
    2090         [ -  + ]:      17147 :     OCCSurface *occ_surface = CAST_TO(face, OCCSurface);
    2091                 :            :     //check if surface was a sheet surface, delete it if so
    2092 [ +  - ][ +  + ]:      17147 :     if(occ_surface->my_shell() != NULL && occ_surface->my_shell() != shell)
         [ +  - ][ -  + ]
                 [ -  + ]
    2093                 :            :     {
    2094                 :            :        //if Sheet_body, delete this sheet body
    2095         [ #  # ]:          0 :        OCCBody* occ_body = occ_surface->my_body();
    2096         [ #  # ]:          0 :        if(occ_body != NULL)
    2097                 :            :        {
    2098         [ #  # ]:          0 :           delete_solid_model_entities(occ_body);
    2099                 :            :           face =
    2100         [ #  # ]:          0 :             populate_topology_bridge(topo_face, CUBIT_FALSE);
    2101                 :            :    
    2102         [ #  # ]:          0 :           if(!face)
    2103                 :          0 :             continue;
    2104         [ #  # ]:          0 :           occ_surface = CAST_TO(face, OCCSurface);
    2105         [ #  # ]:          0 :           shell->set_sheet_surface(occ_surface);
    2106                 :            :        }
    2107                 :            :     }
    2108                 :            : 
    2109         [ +  - ]:      17147 :     memberSurfaces.append(occ_surface);
    2110 [ +  - ][ +  - ]:      17147 :     occ_surface->set_shell(shell);
                 [ +  - ]
    2111                 :      17147 :   }
    2112                 :            : 
    2113 [ +  - ][ +  - ]:       2593 :   shell->setMemberSurfaces(memberSurfaces);
                 [ +  - ]
    2114         [ +  - ]:       2904 :   return shell;
    2115                 :            : }
    2116                 :            : 
    2117                 :      17832 : Surface* OCCQueryEngine::populate_topology_bridge(const TopoDS_Face& aShape,
    2118                 :            :                                                   CubitBoolean build_body)
    2119                 :            : {
    2120 [ +  - ][ -  + ]:      17832 :   if(aShape.IsNull())
    2121                 :          0 :     return (Surface*)NULL;
    2122                 :      17832 :   OCCSurface *surface = NULL;
    2123         [ +  - ]:      17832 :   GProp_GProps myProps;
    2124         [ +  - ]:      17832 :   BRepGProp::SurfaceProperties(aShape, myProps);
    2125         [ +  - ]:      17832 :   double area = myProps.Mass();
    2126         [ +  - ]:      17832 :   double tol = get_sme_resabs_tolerance();
    2127 [ -  + ][ #  # ]:      17832 :   if(area < tol * tol && area > 0.)
    2128 [ #  # ][ #  # ]:          0 :     PRINT_WARNING("Generated a sliver surface. \n");
         [ #  # ][ #  # ]
    2129                 :            :   
    2130         [ -  + ]:      17832 :   else if (area < 0.0)
    2131 [ #  # ][ #  # ]:          0 :     PRINT_WARNING("Generated a negative area surface. \n");
         [ #  # ][ #  # ]
    2132                 :            : 
    2133 [ +  - ][ +  + ]:      40436 :   if (!OCCMap->IsBound(aShape) ||
         [ +  + ][ +  + ]
    2134 [ +  - ][ +  - ]:      22604 :       OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
           [ #  #  #  # ]
    2135                 :            :   {
    2136 [ +  - ][ +  - ]:      15831 :     TopoDS_Face *poface = new TopoDS_Face;
    2137         [ +  - ]:      15831 :     *poface = aShape;
    2138 [ +  - ][ +  - ]:      15831 :     surface = new OCCSurface(poface);
    2139         [ +  - ]:      15831 :     SurfaceList->append(surface);
    2140         [ +  - ]:      15831 :     surface->set_body(NULL);
    2141         [ +  - ]:      15831 :     surface->set_lump(NULL);
    2142         [ +  - ]:      15831 :     surface->set_shell(NULL);
    2143         [ +  + ]:      15831 :     if(build_body)
    2144                 :            :     {
    2145 [ +  - ][ +  - ]:        619 :       OCCShell* shell = new OCCShell(NULL, surface);
    2146 [ +  - ][ +  - ]:        619 :       OCCLump* lump = new OCCLump(NULL, surface);
    2147 [ +  - ][ +  - ]:        619 :       OCCBody* body = new OCCBody(NULL, surface);
    2148         [ +  - ]:        619 :       surface->set_body(body);
    2149         [ +  - ]:        619 :       surface->set_lump(lump);
    2150         [ +  - ]:        619 :       surface->set_shell(shell);
    2151         [ +  - ]:        619 :       shell->set_body(body);
    2152         [ +  - ]:        619 :       shell->set_lump(lump);
    2153         [ +  - ]:        619 :       BodyList->append(body);
    2154                 :            :       int k;
    2155 [ +  - ][ +  - ]:        619 :       if(!OCCMap->IsBound(aShape))
    2156                 :            :       {
    2157                 :        619 :         iTotalTBCreated++;
    2158                 :        619 :         k = iTotalTBCreated;
    2159         [ +  - ]:        619 :         OCCMap->Bind(*poface, iTotalTBCreated);
    2160                 :            :       }
    2161                 :            :       else
    2162         [ #  # ]:          0 :         k = OCCMap->Find(aShape);
    2163 [ +  - ][ +  - ]:      15831 :       OccToCGM->insert(valType(k, (TopologyBridge*)surface));
    2164                 :            :     }
    2165                 :            :   } 
    2166                 :            : 
    2167                 :            :   else 
    2168                 :            :   {
    2169         [ +  - ]:       2001 :     int k = OCCMap->Find(aShape);
    2170 [ +  - ][ +  - ]:       2001 :     surface = (OCCSurface*)(OccToCGM->find(k))->second;
    2171         [ +  - ]:       2001 :     TopoDS_Face aFace(aShape);
    2172 [ +  - ][ +  - ]:       2001 :     surface->set_TopoDS_Face(aFace);
    2173                 :            :   }
    2174                 :            : 
    2175         [ +  - ]:      17832 :   TopExp_Explorer Ex;
    2176 [ +  - ][ +  - ]:      36854 :   for (Ex.Init(aShape.Oriented(TopAbs_FORWARD), TopAbs_WIRE); Ex.More();
         [ +  - ][ +  - ]
                 [ +  + ]
    2177         [ +  - ]:      19022 :       Ex.Next())
    2178                 :            :   {
    2179 [ +  - ][ +  - ]:      19022 :     TopoDS_Shape sh = Ex.Current();
    2180                 :            : 
    2181 [ +  - ][ +  - ]:      19022 :     OCCLoop* loop = populate_topology_bridge(TopoDS::Wire(sh));
    2182                 :            : /*
    2183                 :            :     if( aShape.Orientation() == TopAbs_REVERSED )
    2184                 :            :     {
    2185                 :            :       DLIList<OCCCoEdge*> coedges_new = loop->coedges();
    2186                 :            :       coedges_new.reverse();
    2187                 :            :       //Reverse all coedges' senses.
    2188                 :            :       for (int i = 0; i < coedges_new.size(); i ++)
    2189                 :            :       {
    2190                 :            :         OCCCoEdge* coedge = coedges_new.get_and_step();
    2191                 :            :         CubitSense sense = (coedge->sense() == CUBIT_FORWARD ? CUBIT_REVERSED : CUBIT_FORWARD);
    2192                 :            :         coedge->set_sense(sense);
    2193                 :            :       }
    2194                 :            :       loop->coedges(coedges_new);
    2195                 :            :     } 
    2196                 :            : */
    2197 [ +  - ][ +  - ]:      38044 :     TopoDS_Shape parent = aShape;
    2198                 :            :     int current_id;
    2199         [ +  - ]:      19022 :     add_shape_to_map(sh, parent, current_id);
    2200 [ +  - ][ +  - ]:      76088 :     if(!OCCMap->IsBound(sh) ||
         [ +  + ][ +  + ]
    2201 [ +  - ][ +  - ]:      57066 :      OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
           [ #  #  #  # ]
    2202 [ +  - ][ +  - ]:      17281 :        OccToCGM->insert(valType(current_id, (TopologyBridge*)loop));
    2203         [ +  - ]:      19022 :   } 
    2204                 :            : 
    2205         [ +  - ]:      17832 :   return surface;
    2206                 :            : }
    2207                 :            : 
    2208                 :      19022 : OCCLoop* OCCQueryEngine::populate_topology_bridge(const TopoDS_Wire& aShape,
    2209                 :            :                                                   CubitBoolean standalone)
    2210                 :            : {
    2211 [ +  - ][ -  + ]:      19022 :   if(aShape.IsNull())
    2212                 :          0 :     return (OCCLoop*)NULL;
    2213                 :            : 
    2214         [ +  - ]:      19022 :   BRepTools_WireExplorer Ex;
    2215                 :            : 
    2216                 :            :   OCCLoop *loop ;
    2217 [ +  - ][ +  + ]:      41526 :   if (!OCCMap->IsBound(aShape) ||
         [ -  + ][ +  + ]
    2218 [ +  - ][ +  - ]:      22504 :       OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
           [ #  #  #  # ]
    2219                 :            :   {
    2220 [ +  - ][ +  - ]:      17281 :     TopoDS_Wire *powire = new TopoDS_Wire;
    2221         [ +  - ]:      17281 :     *powire = aShape;
    2222 [ +  - ][ +  - ]:      17281 :     loop = new OCCLoop(powire);
    2223         [ -  + ]:      17281 :     if(standalone)
    2224                 :            :     {
    2225                 :            :       int k;
    2226 [ #  # ][ #  # ]:          0 :       if(!OCCMap->IsBound(aShape))
    2227                 :            :       {
    2228                 :          0 :         iTotalTBCreated++;
    2229                 :          0 :         k = iTotalTBCreated;
    2230         [ #  # ]:          0 :         OCCMap->Bind(aShape, iTotalTBCreated);
    2231                 :            :       }
    2232                 :            :       else
    2233         [ #  # ]:          0 :         k = OCCMap->Find(aShape);
    2234 [ #  # ][ #  # ]:          0 :       OccToCGM->insert(valType(k, (TopologyBridge*)loop));
    2235         [ #  # ]:      17281 :       WireList->append(loop);
    2236                 :            :     }
    2237                 :            :   }
    2238                 :            :   else
    2239                 :            :   {
    2240         [ +  - ]:       1741 :     int k = OCCMap->Find(aShape);
    2241 [ +  - ][ +  - ]:       1741 :     loop = (OCCLoop*)(OccToCGM->find(k))->second;
    2242 [ +  - ][ +  - ]:       1741 :     loop->set_TopoDS_Wire(aShape);
                 [ +  - ]
    2243                 :            :   }
    2244                 :            : 
    2245         [ +  - ]:      19022 :   CubitVector v;
    2246                 :            : 
    2247 [ +  - ][ +  - ]:      38044 :   DLIList <OCCCoEdge*> coedges_old, coedges_new;
         [ +  - ][ +  - ]
    2248 [ +  - ][ +  - ]:      19022 :   coedges_old = loop->coedges();
                 [ +  - ]
    2249                 :            : 
    2250 [ +  - ][ +  - ]:      92486 :   for (Ex.Init(aShape); Ex.More(); Ex.Next())
         [ +  - ][ +  + ]
    2251                 :            :   {
    2252         [ +  - ]:      73464 :     const TopoDS_Edge& anEdgeForPop = Ex.Current();
    2253         [ +  - ]:      73464 :     TopoDS_Shape crv = anEdgeForPop;
    2254         [ +  - ]:      73464 :     Curve* curve = populate_topology_bridge(anEdgeForPop);
    2255         [ +  + ]:      73464 :     if(!curve)
    2256                 :       1035 :       continue;
    2257 [ +  - ][ +  - ]:     145893 :     TopoDS_Shape parent = aShape;
         [ +  - ][ +  + ]
    2258                 :            :     int current_id;
    2259         [ +  - ]:      72429 :     add_shape_to_map(crv, parent, current_id);
    2260 [ +  - ][ +  - ]:     289716 :     if(!OCCMap->IsBound(crv) ||
         [ +  + ][ +  + ]
    2261 [ +  - ][ +  - ]:     217287 :      OccToCGM->find(OCCMap->Find(crv)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
           [ #  #  #  # ]
    2262 [ +  - ][ +  - ]:      34199 :        OccToCGM->insert(valType(current_id, (TopologyBridge*)curve));
    2263                 :            : 
    2264         [ -  + ]:      72429 :     OCCCurve *occ_curve = CAST_TO(curve, OCCCurve);
    2265 [ +  - ][ +  - ]:     144858 :     DLIList<OCCLoop*> loops = occ_curve->loops();
    2266                 :      72429 :     CubitBoolean exist = CUBIT_FALSE;
    2267                 :      72429 :     OCCCoEdge * coedge = NULL;
    2268         [ +  - ]:      72429 :     int size = coedges_old.size();
    2269         [ +  - ]:      72429 :     CubitSense sense = (crv.Orientation() == TopAbs_FORWARD ?
    2270                 :      72429 :         CUBIT_FORWARD : CUBIT_REVERSED);
    2271                 :            : 
    2272                 :            :     //for the cylinder side face, there are 4 coedges, 2 of them are seam
    2273                 :            :     //edges and should have opposite sense.
    2274 [ +  - ][ +  + ]:     197437 :     for(int i = 0; i < coedges_new.size(); i++)
    2275                 :            :     {
    2276         [ +  - ]:     126014 :       coedge =  coedges_new.get_and_step();
    2277         [ +  - ]:     126014 :       Curve* test_c = coedge->curve();
    2278         [ +  + ]:     126014 :       if(test_c == curve)
    2279                 :            :       {       
    2280 [ +  - ][ -  + ]:       1006 :         if(sense == coedge->sense())
    2281         [ #  # ]:          0 :           sense = (sense == CUBIT_FORWARD ? CUBIT_REVERSED : CUBIT_FORWARD);
    2282                 :            :         
    2283                 :       1006 :         break;    
    2284                 :            :       }
    2285                 :            :     }
    2286                 :            : 
    2287         [ +  + ]:      76763 :     for(int i = 0; i < size; i++)
    2288                 :            :     {
    2289         [ +  - ]:       9868 :       coedge = coedges_old.get_and_step();
    2290 [ +  - ][ +  + ]:       9868 :       if(coedge->curve() == curve && coedge->sense() ==  sense)
         [ +  - ][ +  - ]
                 [ +  + ]
    2291                 :            :       {
    2292         [ +  - ]:       5534 :         coedge->set_mark(1);
    2293                 :       5534 :         exist = CUBIT_TRUE;
    2294         [ +  - ]:       5534 :         coedge->set_sense(sense);
    2295         [ +  - ]:       5534 :         coedges_new.append(coedge);
    2296                 :       5534 :         break;
    2297                 :            :       }
    2298                 :            :     }   
    2299                 :            :     
    2300         [ +  + ]:      72429 :     if(!exist )
    2301                 :            :     {
    2302                 :            :       //search through the curve loops
    2303 [ +  - ][ +  + ]:      99294 :       for(int i = 0; i < loops.size() ; i++)
    2304                 :            :       {
    2305         [ +  - ]:      32399 :         OCCLoop* occ_loop = loops.get_and_step();
    2306         [ +  - ]:      32399 :         TopoDS_Wire* wire = occ_loop->get_TopoDS_Wire();
    2307 [ +  + ][ +  - ]:      32399 :         if (size > 0 && (wire->IsNull() || !OCCMap->IsBound(*wire)))
         [ +  - ][ +  - ]
         [ -  + ][ -  + ]
    2308                 :            :         { 
    2309         [ #  # ]:          0 :           DLIList<OCCCoEdge*> coedge_list = occ_loop->coedges();
    2310 [ #  # ][ #  # ]:          0 :           for(int j = 0; j < coedge_list.size(); j++)
    2311                 :            :           {
    2312         [ #  # ]:          0 :             OCCCoEdge * test_coedge = coedge_list.get_and_step();
    2313         [ #  # ]:          0 :             occ_loop->remove_coedge(test_coedge);
    2314         [ #  # ]:          0 :             occ_curve->remove_loop(occ_loop);
    2315 [ #  # ][ #  # ]:          0 :             delete test_coedge;
    2316                 :            :           }
    2317 [ #  # ][ #  # ]:          0 :           if(!wire->IsNull())
    2318         [ #  # ]:          0 :             wire->Nullify();
    2319 [ #  # ][ #  # ]:          0 :           WireList->remove(occ_loop);
    2320                 :            :         }
    2321                 :            :       }
    2322                 :            : 
    2323 [ +  - ][ +  - ]:      66895 :       if(occ_curve->loops().size() == 2)
         [ +  - ][ +  + ]
    2324                 :            :       {
    2325                 :            :         // If there are some assumptions made about manifold geometry . . .
    2326                 :            :         //there must be a loop which doesn't have this curve anymore
    2327                 :            :         //this is been found in subtract cases while one solid becomes
    2328                 :            :         //2 solid, and one face becomes two faces. One face uses/updates
    2329                 :            :         //the old face while the other face generates face and wire from
    2330                 :            :         //new. However, in order to uses the curves, the old curve is kept
    2331                 :            :         //as possible, so curve's loops get kept, but since it's going to 
    2332                 :            :         //associate with new loop, the old loop should be removed from the 
    2333                 :            :         //loop list.
    2334         [ +  - ]:        110 :         DLIList<OCCLoop*> old_loops = occ_curve->loops();
    2335         [ +  + ]:        330 :         for (int i = 0; i < 2; i++)
    2336                 :            :         {
    2337                 :        220 :           int found = 0;
    2338         [ +  - ]:        220 :           OCCLoop* old_loop = old_loops.get_and_step();
    2339         [ +  - ]:        220 :           TopoDS_Wire* thewire = old_loop->get_TopoDS_Wire();
    2340 [ +  - ][ +  - ]:        220 :           if (thewire < (void*) 0x1000 || thewire->IsNull())
         [ -  + ][ -  + ]
    2341                 :            :           {
    2342                 :          0 :             found = 1;
    2343                 :          0 :             break;
    2344                 :            :           }
    2345         [ +  - ]:        220 :           DLIList<OCCCoEdge*> test_coedges = old_loop->coedges();
    2346 [ +  - ][ +  - ]:        550 :           for(int j = 0; j < test_coedges.size() ; j++)
    2347                 :            :           {
    2348 [ +  - ][ +  - ]:        550 :             if(test_coedges.get()->curve() != curve)
                 [ +  + ]
    2349         [ +  - ]:        330 :               test_coedges.step();
    2350                 :            :             else
    2351                 :            :             {
    2352                 :        220 :               found = 1;
    2353                 :        220 :               break;
    2354                 :            :             }
    2355                 :            :           }
    2356         [ -  + ]:        220 :           if(!found)
    2357         [ #  # ]:          0 :             occ_curve->remove_loop(old_loop); 
    2358 [ +  - ][ +  - ]:        330 :         }  
    2359                 :            :       }
    2360                 :            :       //for unite case, it's possible that the a curve has 3 coedges because
    2361                 :            :       //opencascade do not perform unite on surfaces.
    2362 [ +  - ][ +  - ]:      66895 :       coedge = new OCCCoEdge( curve, loop, sense);
    2363         [ +  - ]:      66895 :       coedges_new.append(coedge);
    2364         [ +  - ]:      66895 :       occ_curve->add_loop(loop);
    2365                 :            :     }
    2366                 :      73464 :   }
    2367                 :            : 
    2368                 :            :   //Double check edge sense to make sure it consists with loop direction
    2369                 :            :   //coedges size = 2 case is checked in the face level so the face normal will
    2370                 :            :   //be considered.
    2371 [ +  - ][ +  + ]:      19022 :   if(coedges_new.size() > 2)
    2372                 :            :   {
    2373         [ +  - ]:      16143 :     OCCCoEdge* coedge = coedges_new.get_and_step();
    2374                 :            :     double    d1, d1_, d2, d2_;
    2375         [ +  - ]:      16143 :     OCCCoEdge* next_coedge = coedges_new.get();
    2376                 :            :     //because of tolerance issue, now check current loop end vertices distance
    2377                 :            :     //compared with reversed loop's end vertices distance, which ever shorter
    2378                 :            :     //will be the direction.
    2379                 :            :     //current loop's parameter not using " _ ", reversed loop's parameter
    2380                 :            :     //uses " _ ".
    2381 [ +  - ][ +  + ]:      16143 :     if (coedge->sense() == CUBIT_FORWARD)
    2382                 :            :     { 
    2383 [ +  - ][ +  - ]:       5079 :       d1 = coedge->curve()->end_param();
    2384 [ +  - ][ +  - ]:       5079 :       d1_ = coedge->curve()->start_param();
    2385                 :            :     }
    2386                 :            :     else
    2387                 :            :     {
    2388 [ +  - ][ +  - ]:      11064 :       d1 = coedge->curve()->start_param();
    2389 [ +  - ][ +  - ]:      11064 :       d1_ = coedge->curve()->end_param();
    2390                 :            :     }
    2391 [ +  - ][ +  + ]:      16143 :     if( next_coedge->sense() == CUBIT_FORWARD)
    2392                 :            :     {
    2393 [ +  - ][ +  - ]:      12149 :       d2_ = next_coedge->curve()->end_param();
    2394 [ +  - ][ +  - ]:      12149 :       d2 = next_coedge->curve()->start_param();
    2395                 :            :     }
    2396                 :            :     else
    2397                 :            :     {
    2398 [ +  - ][ +  - ]:       3994 :       d2 = next_coedge->curve()->end_param();
    2399 [ +  - ][ +  - ]:       3994 :       d2_ = next_coedge->curve()->start_param();
    2400                 :            :     } 
    2401 [ +  - ][ +  - ]:      16143 :     CubitVector v1, v1_, v2, v2_;
         [ +  - ][ +  - ]
    2402 [ +  - ][ +  - ]:      16143 :     coedge->curve()->position_from_u(d1, v1);
    2403 [ +  - ][ +  - ]:      16143 :     coedge->curve()->position_from_u(d1_, v1_);
    2404 [ +  - ][ +  - ]:      16143 :     next_coedge->curve()->position_from_u(d2, v2);
    2405 [ +  - ][ +  - ]:      16143 :     next_coedge->curve()->position_from_u(d2_, v2_);
    2406 [ +  - ][ +  - ]:      16143 :     if(v1.distance_between(v2) > v1_.distance_between(v2_))
                 [ -  + ]
    2407                 :            :     {
    2408                 :            :       //Reverse all coedges' senses.
    2409 [ #  # ][ #  # ]:      16143 :       for (int i = 0; i < coedges_new.size(); i ++)
    2410                 :            :       {
    2411         [ #  # ]:          0 :         coedge = coedges_new.get_and_step();
    2412 [ #  # ][ #  # ]:          0 :         CubitSense sense = (coedge->sense() == CUBIT_FORWARD ? CUBIT_REVERSED : CUBIT_FORWARD);
    2413         [ #  # ]:          0 :         coedge->set_sense(sense);
    2414                 :            :       }
    2415                 :            :     }
    2416                 :            :   }
    2417                 :            : 
    2418                 :            : /*
    2419                 :            :   if(aShape.Orientation() == TopAbs_REVERSED)
    2420                 :            :     coedges_new.reverse();
    2421                 :            :   //Reverse all coedges' senses.
    2422                 :            :   for (int i = 0; i < coedges_new.size(); i ++)
    2423                 :            :   {
    2424                 :            :     OCCCoEdge* coedge = coedges_new.get_and_step();
    2425                 :            :     CubitSense sense = (coedge->sense() == CUBIT_FORWARD ? CUBIT_REVERSED : CUBIT_FORWARD);
    2426                 :            :     coedge->set_sense(sense);
    2427                 :            :   }
    2428                 :            : */
    2429 [ +  - ][ +  - ]:      19022 :   loop->coedges(coedges_new);
                 [ +  - ]
    2430                 :            : 
    2431                 :            :   //remove unused coedges
    2432 [ +  - ][ +  + ]:      24798 :   for(int i = 0; i < coedges_old.size(); i++)
    2433                 :            :   {
    2434         [ +  - ]:       5776 :     OCCCoEdge *coedge = coedges_old.get_and_step();
    2435 [ +  - ][ +  + ]:       5776 :     if(coedge->get_mark() == 0)
    2436 [ +  - ][ +  - ]:        242 :       delete coedge;
    2437                 :            :     else
    2438         [ +  - ]:       5534 :       coedge->set_mark(0);
    2439                 :            :   }
    2440         [ +  - ]:      19022 :   return loop;
    2441                 :            : }
    2442                 :            : 
    2443                 :      76548 : Curve* OCCQueryEngine::populate_topology_bridge(const TopoDS_Edge& aShape,
    2444                 :            :                                                 CubitBoolean stand_along )
    2445                 :            : {
    2446 [ +  - ][ -  + ]:      76548 :   if(aShape.IsNull())
    2447                 :          0 :     return (Curve*)NULL;
    2448                 :            :   Curve *curve;
    2449         [ +  - ]:      76548 :   GProp_GProps myProps;
    2450         [ +  - ]:      76548 :   BRepGProp::LinearProperties(aShape, myProps);
    2451         [ +  - ]:      76548 :   double length =  myProps.Mass();
    2452         [ +  - ]:      76548 :   TopExp_Explorer Ex;
    2453 [ +  - ][ +  + ]:      76548 :   if(length < get_sme_resabs_tolerance())
    2454                 :            :   {
    2455                 :            :     //check if the two vertices are acctually the same point.
    2456 [ +  - ][ +  + ]:       3105 :     CubitVector v[2];
    2457                 :       1035 :     int i = 0;
    2458 [ +  - ][ +  - ]:       3105 :     for (Ex.Init(aShape, TopAbs_VERTEX); Ex.More(); Ex.Next())
         [ +  - ][ +  + ]
    2459                 :            :     {
    2460 [ +  - ][ +  - ]:       2070 :       TopoDS_Vertex vt = TopoDS::Vertex(Ex.Current());
                 [ +  - ]
    2461         [ +  - ]:       2070 :       gp_Pnt pt = BRep_Tool::Pnt(vt);
    2462 [ +  - ][ +  - ]:       2070 :       v[i] = CubitVector(pt.X(), pt.Y(), pt.Z());
         [ +  - ][ +  - ]
                 [ +  - ]
    2463                 :       2070 :       i++;
    2464         [ +  - ]:       2070 :     }  
    2465                 :            :       
    2466 [ +  - ][ +  - ]:       1035 :     if(v[0] == v[1])
    2467                 :       1035 :       return (Curve*) NULL;
    2468                 :            :     else  
    2469 [ #  # ][ #  # ]:          0 :       PRINT_WARNING("Generated a sliver curve. \n");
         [ #  # ][ #  # ]
    2470                 :            :   }
    2471                 :            : 
    2472 [ +  - ][ +  + ]:     228168 :   if (!OCCMap->IsBound(aShape) ||
         [ +  + ][ +  + ]
    2473 [ +  - ][ +  - ]:     152655 :       OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
           [ #  #  #  # ]
    2474                 :            :   {
    2475 [ +  - ][ +  - ]:      37272 :     TopoDS_Edge *poedge = new TopoDS_Edge;
    2476         [ +  - ]:      37272 :     *poedge = aShape;
    2477 [ +  - ][ +  - ]:      37272 :     curve = new OCCCurve(poedge);
    2478         [ +  - ]:      37272 :     CurveList->append((OCCCurve*)curve);
    2479         [ +  + ]:      37272 :     if(stand_along)
    2480                 :            :     {
    2481                 :            :       int k;
    2482 [ +  - ][ +  - ]:       3062 :       if(!OCCMap->IsBound(aShape)) 
    2483                 :            :       {
    2484                 :       3062 :         iTotalTBCreated++;
    2485                 :       3062 :         k = iTotalTBCreated;
    2486         [ +  - ]:       3062 :         OCCMap->Bind(*poedge, iTotalTBCreated);
    2487                 :            :       }
    2488                 :            :       else 
    2489         [ #  # ]:          0 :         k = OCCMap->Find(aShape);
    2490 [ +  - ][ +  - ]:      37272 :       OccToCGM->insert(valType(k, (TopologyBridge*)curve));
    2491                 :            :     }
    2492                 :            :   }
    2493                 :            :   else 
    2494                 :            :   {
    2495         [ +  - ]:      38241 :     int i = OCCMap->Find(aShape);
    2496 [ +  - ][ +  - ]:      38241 :     curve = (Curve*)(OccToCGM->find(i))->second;
    2497 [ +  - ][ -  + ]:      38241 :     CAST_TO(curve, OCCCurve)->set_TopoDS_Edge(aShape);
         [ +  - ][ +  - ]
    2498                 :            :   }
    2499                 :            : 
    2500 [ +  - ][ +  - ]:     226517 :   for (Ex.Init(aShape, TopAbs_VERTEX); Ex.More(); Ex.Next())
         [ +  - ][ +  + ]
    2501                 :            :   {
    2502 [ +  - ][ +  - ]:     151004 :     TopoDS_Shape sh = Ex.Current();
    2503                 :            : 
    2504                 :            :    /* bool alreadyWrapped=false;
    2505                 :            :     if(OCCMap->IsBound(sh))
    2506                 :            :     {
    2507                 :            :       alreadyWrapped=true;
    2508                 :            :     }*/
    2509                 :            : 
    2510 [ +  - ][ +  - ]:     151004 :     TBPoint* point = populate_topology_bridge(TopoDS::Vertex(Ex.Current()));
                 [ +  - ]
    2511 [ -  + ][ -  + ]:     151004 :     CAST_TO(point, OCCPoint)->add_curve(CAST_TO(curve, OCCCurve));
                 [ +  - ]
    2512 [ +  - ][ +  - ]:     302008 :     TopoDS_Shape parent = aShape;
    2513                 :            :     int current_id;
    2514         [ +  - ]:     151004 :     add_shape_to_map(sh, parent, current_id);
    2515 [ +  - ][ +  - ]:     604016 :     if(!OCCMap->IsBound(sh) ||
         [ +  + ][ +  + ]
    2516 [ +  - ][ +  - ]:     453012 :      OccToCGM->find(OCCMap->Find(sh)) == OccToCGM->end())
         [ +  - ][ +  - ]
         [ +  - ][ -  + ]
           [ #  #  #  # ]
    2517 [ +  - ][ +  - ]:      26882 :        OccToCGM->insert(valType(current_id, (TopologyBridge*)point));
    2518                 :            :      
    2519                 :            :   
    2520                 :            :    /* if(alreadyWrapped)
    2521                 :            :        PRINT_INFO("Vertex Already Wrapped:     "); 
    2522                 :            :     else
    2523                 :            :        PRINT_INFO("Vertex Wrapped:     ");  
    2524                 :            :     PRINT_INFO("     Shape ID = %d",  OCCMap->Find(sh) ); 
    2525                 :            :     PRINT_INFO("     TBPoint Address: %p", point );  
    2526                 :            :     PRINT_INFO("     Shape Orientation: %s\n", sh.Orientation()==TopAbs_FORWARD ? "Forward" : "Reversed" ); 
    2527                 :            : */
    2528                 :            : 
    2529         [ +  - ]:     151004 :   }
    2530                 :            : 
    2531         [ +  - ]:      76548 :   return curve;
    2532                 :            : }
    2533                 :            : 
    2534                 :     151389 : TBPoint* OCCQueryEngine::populate_topology_bridge(const TopoDS_Vertex& aShape,
    2535                 :            :                                                 CubitBoolean stand_along)
    2536                 :            : {
    2537         [ -  + ]:     151389 :   if(aShape.IsNull())
    2538                 :          0 :     return (TBPoint*)NULL;
    2539                 :            :   OCCPoint *point;
    2540 [ +  + ][ +  - ]:     551132 :   if (iTotalTBCreated == 0 || !OCCMap->IsBound(aShape) ||
         [ +  + ][ +  + ]
                 [ +  + ]
    2541 [ +  - ][ +  - ]:     399743 :       OccToCGM->find(OCCMap->Find(aShape)) == OccToCGM->end()) 
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
           [ #  #  #  # ]
    2542                 :            :   {
    2543         [ +  - ]:      27267 :     TopoDS_Vertex *povertex = new TopoDS_Vertex;
    2544                 :      27267 :     *povertex = aShape;
    2545         [ +  - ]:      27267 :     point = new OCCPoint(povertex);
    2546         [ +  + ]:      27267 :     if(stand_along)
    2547                 :            :     { 
    2548                 :            :       int k;
    2549 [ +  - ][ +  - ]:        385 :       if(!OCCMap->IsBound(aShape)) 
    2550                 :            :       {
    2551                 :        385 :         iTotalTBCreated++;
    2552                 :        385 :         k = iTotalTBCreated;
    2553         [ +  - ]:        385 :         OCCMap->Bind(*povertex, iTotalTBCreated);
    2554                 :            :       }
    2555                 :            :       else 
    2556         [ #  # ]:          0 :         k = OCCMap->Find(aShape);
    2557 [ +  - ][ +  - ]:      27267 :       OccToCGM->insert(valType(k, (TopologyBridge*)point));
    2558                 :            :     }
    2559                 :            : 
    2560                 :            :   } 
    2561                 :            :   else 
    2562                 :            :   {
    2563         [ +  - ]:     124122 :     int i = OCCMap->Find(aShape);
    2564 [ +  - ][ +  - ]:     124122 :     point = (OCCPoint*)(OccToCGM->find(i))->second;
    2565 [ +  - ][ +  - ]:     124122 :     point->set_TopoDS_Vertex(aShape);
                 [ +  - ]
    2566                 :            :   }
    2567                 :     151389 :   return point;
    2568                 :            : }
    2569                 :            : 
    2570                 :     802860 : TopologyBridge* OCCQueryEngine::occ_to_cgm(const TopoDS_Shape& shape)
    2571                 :            : {
    2572 [ +  - ][ +  + ]:     802860 :   if(!OCCMap->IsBound(shape))
    2573                 :      39455 :     return (TopologyBridge*) NULL;
    2574                 :            : 
    2575         [ +  - ]:     763405 :   int k = OCCMap->Find(shape);
    2576 [ +  - ][ +  - ]:     802860 :   return (OccToCGM->find(k))->second;
    2577                 :            : }       
    2578                 :            : 
    2579                 :            : //-----------------------------------------------------------------------
    2580                 :            : // Purpose       : Deletes all solid model entities associated with the
    2581                 :            : //                 Bodies in the input list.
    2582                 :            : //
    2583                 :            : // Special Notes :
    2584                 :            : //
    2585                 :            : // Creator       : Jane Hu
    2586                 :            : //
    2587                 :            : // Creation Date : 7/23/11
    2588                 :            : //-------------------------------------------------------------------------
    2589                 :         97 : void OCCQueryEngine::delete_solid_model_entities(DLIList<BodySM*>&bodyList)const
    2590                 :            : {
    2591                 :         97 :   delete_bodies(bodyList, true);
    2592                 :         97 : }
    2593                 :            :  
    2594                 :            : //-------------------------------------------------------------------------
    2595                 :            : // Purpose       : Deletes all solid model entities associated with the
    2596                 :            : //                 Bodies in the input list depending on remove_lower_entities
    2597                 :            : //                 flag.
    2598                 :            : //
    2599                 :            : // Special Notes :
    2600                 :            : //
    2601                 :            : // Creator       : Steve Owen
    2602                 :            : //
    2603                 :            : // Creation Date : 4/23/01
    2604                 :            : //-------------------------------------------------------------------------
    2605                 :         97 : void OCCQueryEngine::delete_bodies(DLIList<BodySM*>&bodyList,
    2606                 :            :                                    bool remove_lower_entities ) const
    2607                 :            : {
    2608                 :         97 :   BodySM* BodyPtr = NULL;
    2609         [ +  + ]:        194 :   for (int i = 0; i < bodyList.size(); i++ )
    2610                 :            :     {
    2611                 :         97 :       BodyPtr = bodyList.get_and_step();
    2612                 :         97 :       this->delete_body(BodyPtr, remove_lower_entities);
    2613                 :            :     }
    2614                 :            : 
    2615                 :         97 :   return;
    2616                 :            : }
    2617                 :            : 
    2618                 :       1672 : CubitStatus OCCQueryEngine::delete_solid_model_entities(
    2619                 :            :     GeometryEntity* ref_entity_ptr,
    2620                 :            :     bool remove_lower_entities) const
    2621                 :            : {
    2622                 :            :      //Lump
    2623         [ -  + ]:       1672 :    Lump* lump = CAST_TO(ref_entity_ptr, Lump);
    2624         [ +  + ]:       1672 :    if(lump != NULL)
    2625                 :            :    {
    2626 [ -  + ][ +  - ]:         66 :      BodySM* body = CAST_TO(lump, OCCLump)->get_body();
    2627 [ -  + ][ +  - ]:         66 :      DLIList<Lump*> lumps = CAST_TO(body, OCCBody)->lumps();
    2628                 :            :  
    2629         [ +  - ]:         66 :      if (remove_lower_entities)
    2630         [ +  - ]:         66 :        return delete_solid_model_entities(body);
    2631                 :            : 
    2632 [ #  # ][ #  # ]:          0 :      DLIList<TopologyBridge*> children;
    2633 [ #  # ][ #  # ]:          0 :      for(int i = 0; i < lumps.size(); i++)
    2634                 :            :      {
    2635         [ #  # ]:          0 :        lump = lumps.get_and_step();
    2636 [ #  # ][ #  # ]:          0 :        CAST_TO(lump, OCCLump)->get_children_virt(children);
    2637                 :            :      }
    2638                 :            : 
    2639         [ #  # ]:          0 :      CubitStatus stat = this->unhook_BodySM_from_OCC(body); 
    2640         [ #  # ]:          0 :      if(stat)
    2641                 :            :      {
    2642 [ #  # ][ #  # ]:          0 :        while (children.size())
    2643 [ #  # ][ #  # ]:          0 :           delete children.pop();
                 [ #  # ]
    2644 [ #  # ][ #  # ]:          0 :        while(lumps.size())
    2645 [ #  # ][ #  # ]:          0 :           delete lumps.pop();
                 [ #  # ]
    2646 [ #  # ][ #  # ]:          0 :        delete body;
    2647                 :            :      }
    2648         [ +  - ]:         66 :      return stat;
    2649                 :            :    }
    2650                 :            : 
    2651                 :            :      // Surface
    2652         [ -  + ]:       1606 :    Surface* ref_face_ptr = CAST_TO(ref_entity_ptr, Surface);
    2653         [ +  + ]:       1606 :    if (ref_face_ptr != NULL)
    2654                 :            :    {
    2655         [ -  + ]:        242 :      if (remove_lower_entities)
    2656                 :          0 :        return ( this->delete_solid_model_entities(ref_face_ptr) );
    2657                 :        242 :      CubitStatus stat = this->unhook_Surface_from_OCC(ref_face_ptr);
    2658         [ +  - ]:        242 :      if(stat)
    2659         [ +  - ]:        242 :        delete ref_face_ptr;
    2660                 :        242 :      return stat;
    2661                 :            :    }
    2662                 :            : 
    2663                 :            :      // Curve
    2664         [ -  + ]:       1364 :    Curve* ref_edge_ptr = CAST_TO(ref_entity_ptr, Curve);
    2665         [ +  + ]:       1364 :    if (ref_edge_ptr != NULL)
    2666                 :            :    {
    2667         [ -  + ]:        836 :       if (remove_lower_entities)
    2668                 :          0 :         return ( this->delete_solid_model_entities(ref_edge_ptr));
    2669                 :        836 :       CubitStatus stat = this->unhook_Curve_from_OCC(ref_edge_ptr);
    2670         [ +  - ]:        836 :       if(stat)
    2671         [ +  - ]:        836 :         delete ref_edge_ptr;
    2672                 :        836 :       return stat;
    2673                 :            :    }
    2674                 :            : 
    2675                 :            :      // Point
    2676         [ -  + ]:        528 :    TBPoint* ref_vertex_ptr = CAST_TO(ref_entity_ptr, TBPoint);
    2677         [ +  - ]:        528 :    if (ref_vertex_ptr != NULL)
    2678                 :            :    {
    2679                 :        528 :       return ( this->delete_solid_model_entities(ref_vertex_ptr) );
    2680                 :            :    }
    2681                 :            : 
    2682                 :            :      // Oops!
    2683         [ #  # ]:          0 :    PRINT_ERROR("In OCCQueryEngine::delete_solid_model_entities\n"
    2684                 :            :                "       Can only delete solid model entities underlying \n"
    2685         [ #  # ]:          0 :                "RefFaces, RefEdges and RefVertices.\n");
    2686                 :       1672 :    return CUBIT_FAILURE;
    2687                 :            : 
    2688                 :            : }
    2689                 :            : //-------------------------------------------------------------------------
    2690                 :            : // Purpose       : Delete a OCCBody and child entities.
    2691                 :            : //
    2692                 :            : // Special Notes :
    2693                 :            : //
    2694                 :            : // Creator       : Jane Hu
    2695                 :            : //
    2696                 :            : // Creation Date : 10/29/07
    2697                 :            : //-------------------------------------------------------------------------
    2698                 :            : CubitStatus
    2699                 :       1474 : OCCQueryEngine::delete_solid_model_entities( BodySM* bodysm) const
    2700                 :            : {
    2701                 :       1474 :   return delete_body(bodysm, true);
    2702                 :            : }
    2703                 :            : //-------------------------------------------------------------------------
    2704                 :            : // Purpose       : Delete a OCCBody and child entities depending on
    2705                 :            : //                 remove_lower_entities flag.
    2706                 :            : //
    2707                 :            : // Special Notes :
    2708                 :            : //
    2709                 :            : // Creator       : Jane Hu
    2710                 :            : //
    2711                 :            : // Creation Date : 10/29/07
    2712                 :            : //-------------------------------------------------------------------------
    2713                 :            : CubitStatus
    2714                 :       1571 : OCCQueryEngine::delete_body( BodySM* bodysm,
    2715                 :            :                              bool remove_lower_entities) const
    2716                 :            : {
    2717                 :       1571 :   OCCBody* occ_body = static_cast<OCCBody*>(bodysm);
    2718         [ -  + ]:       1571 :   if (!occ_body)
    2719                 :          0 :     return CUBIT_FAILURE;
    2720                 :            : 
    2721         [ +  - ]:       1571 :   DLIList<Lump*> lumps;
    2722 [ +  - ][ +  - ]:       3142 :   DLIList<ShellSM*> shell_list;
    2723 [ +  - ][ +  - ]:       3142 :   DLIList<OCCSurface*> surfaces = occ_body->my_sheet_surfaces();
    2724 [ +  - ][ +  + ]:       1846 :   for(int i = 0;  i <surfaces.size(); i++)
    2725                 :            :   { 
    2726         [ +  - ]:        275 :     OCCSurface* occ_surface = surfaces.get_and_step();
    2727         [ +  - ]:        275 :     occ_surface->set_body((OCCBody*)NULL);
    2728         [ +  - ]:        275 :     if(remove_lower_entities)
    2729                 :            :     {
    2730 [ +  - ][ +  - ]:        275 :       delete occ_surface->my_lump();
                 [ +  - ]
    2731         [ +  - ]:        275 :       OCCShell* shell = occ_surface->my_shell();
    2732         [ +  - ]:        275 :       delete_solid_model_entities(occ_surface);
    2733 [ +  - ][ +  - ]:        275 :       delete shell;
    2734                 :            :     }
    2735                 :            :   }
    2736                 :            : 
    2737 [ +  - ][ +  - ]:       3142 :   DLIList<OCCShell*> shells = occ_body->shells();
    2738 [ +  - ][ -  + ]:       1571 :   for(int i = 0;  i <shells.size(); i++)
    2739                 :            :   {
    2740         [ #  # ]:          0 :     OCCShell* occ_shell = shells.get_and_step();
    2741         [ #  # ]:          0 :     occ_shell->set_body((OCCBody*)NULL);
    2742         [ #  # ]:          0 :     if(remove_lower_entities)
    2743                 :            :     {
    2744 [ #  # ][ #  # ]:          0 :       delete occ_shell->my_lump();
                 [ #  # ]
    2745         [ #  # ]:          0 :       DLIList<TopologyBridge*> tb_surfaces;
    2746         [ #  # ]:          0 :       occ_shell->get_children_virt(tb_surfaces);
    2747         [ #  # ]:          0 :       unhook_ShellSM_from_OCC(occ_shell);
    2748 [ #  # ][ #  # ]:          0 :       for(int k = 0; k < tb_surfaces.size(); k++)
    2749 [ #  # ][ #  # ]:          0 :         delete_solid_model_entities(CAST_TO(tb_surfaces.get_and_step(), Surface));
                 [ #  # ]
    2750 [ #  # ][ #  # ]:          0 :       delete occ_shell;
                 [ #  # ]
    2751                 :            :     }
    2752                 :            :   }
    2753                 :            : 
    2754 [ +  - ][ +  - ]:       3142 :   DLIList<TopologyBridge*> children;
    2755 [ +  - ][ +  - ]:       1571 :   lumps = occ_body->lumps();
                 [ +  - ]
    2756         [ +  - ]:       1571 :   int size = lumps.size();
    2757                 :            : 
    2758         [ +  + ]:       3085 :   for(int i =0; i < size; i++)
    2759                 :            :   {
    2760         [ +  - ]:       1514 :     Lump* lump = lumps.get_and_step();
    2761         [ -  + ]:       1514 :     OCCLump* occ_lump = CAST_TO(lump, OCCLump);
    2762         [ -  + ]:       1514 :     if (!occ_lump)
    2763                 :          0 :        continue;
    2764         [ +  - ]:       1514 :     occ_lump->remove_body();
    2765         [ +  - ]:       1514 :     if(remove_lower_entities)
    2766                 :            :     {
    2767         [ +  - ]:       1514 :       children.clean_out();
    2768         [ +  - ]:       1514 :       occ_lump->get_children_virt(children);
    2769 [ +  - ][ +  + ]:       2907 :       for(int j = 0; j < children.size(); j++)
    2770                 :            :       {
    2771 [ +  - ][ -  + ]:       1393 :         ShellSM* shell = CAST_TO(children.get_and_step(), ShellSM);
    2772                 :            :       
    2773         [ +  - ]:       1393 :         if (shell)
    2774         [ +  - ]:       1393 :           shell_list.append(shell);
    2775         [ +  - ]:       1393 :         DLIList<TopologyBridge*> tb_surfaces;
    2776         [ +  - ]:       1393 :         shell->get_children_virt(tb_surfaces);
    2777 [ +  - ][ +  + ]:      10792 :         for(int k = 0; k < tb_surfaces.size(); k++)
    2778 [ +  - ][ -  + ]:       9399 :           delete_solid_model_entities(CAST_TO(tb_surfaces.get_and_step(), Surface));
                 [ +  - ]
    2779         [ +  - ]:       1393 :       }
    2780                 :            :     }
    2781                 :            :   }
    2782                 :       1571 :   CubitStatus stat = CUBIT_SUCCESS;
    2783         [ +  - ]:       1571 :   stat = unhook_BodySM_from_OCC(bodysm, remove_lower_entities);
    2784                 :            : 
    2785         [ +  - ]:       1571 :   if(remove_lower_entities)
    2786                 :            :   {
    2787 [ +  - ][ +  + ]:       2964 :     for(int j = 0; j < shell_list.size(); j++)
    2788 [ +  - ][ +  - ]:       1393 :        delete shell_list.get_and_step();
                 [ +  - ]
    2789                 :            : 
    2790 [ +  - ][ +  + ]:       3085 :     for(int i =0; i < lumps.size(); i++)
    2791 [ +  - ][ +  - ]:       1514 :        delete lumps.get_and_step(); 
                 [ +  - ]
    2792                 :            :   }
    2793                 :            : 
    2794         [ +  - ]:       1571 :   BodyList->remove(occ_body);
    2795 [ +  - ][ +  - ]:       1571 :   delete bodysm;
    2796         [ +  - ]:       1571 :   return stat;
    2797                 :            : }
    2798                 :            : 
    2799                 :            : CubitStatus
    2800                 :       1582 : OCCQueryEngine::unhook_BodySM_from_OCC( BodySM* bodysm ,
    2801                 :            :                                         bool remove_lower_entities)const
    2802                 :            : {
    2803         [ -  + ]:       1582 :   OCCBody* occ_body = dynamic_cast<OCCBody*>(bodysm);
    2804         [ -  + ]:       1582 :   if (!occ_body)
    2805                 :          0 :     return CUBIT_FAILURE;
    2806                 :            : 
    2807         [ +  - ]:       1582 :   TopoDS_Shape* shape = occ_body->get_TopoDS_Shape();
    2808                 :            : 
    2809 [ +  + ][ +  - ]:       1582 :   if (shape && !shape->IsNull())
         [ +  - ][ +  + ]
    2810                 :            :   {
    2811                 :            :     //remove the entry from label tree
    2812         [ +  - ]:         97 :     OCCAttribSet::remove_attribute(*shape) ;
    2813                 :            : 
    2814                 :            :     //remove the entry from the map
    2815                 :            :     int k;
    2816 [ +  - ][ +  - ]:         97 :     if(shape && !shape->IsNull() && OCCMap->IsBound(*shape))
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    2817                 :            :     {
    2818         [ +  - ]:         97 :         k = OCCMap->Find(*shape);
    2819         [ +  - ]:         97 :         OCCMap->UnBind(*shape);
    2820                 :            : 
    2821 [ +  - ][ -  + ]:         97 :         if(!OccToCGM->erase(k))
    2822 [ #  # ][ #  # ]:         97 :           PRINT_ERROR("The OccBody and iCreatedTotal %i pair is not in the map!", k);
         [ #  # ][ #  # ]
    2823                 :            :     }
    2824                 :            :   }
    2825                 :            : 
    2826         [ +  - ]:       1582 :   DLIList<Lump*> lumps = occ_body->lumps();
    2827 [ +  - ][ +  + ]:       3096 :   for(int i =0; i < lumps.size()&& remove_lower_entities; i++)
         [ +  + ][ +  + ]
    2828                 :            :   {
    2829         [ +  - ]:       1514 :      Lump* lump = lumps.get_and_step();
    2830                 :            :      //OCCLump* occ_lump = CAST_TO(lump, OCCLump);
    2831                 :            :      //if(occ_lump)
    2832                 :            :      //  occ_lump->remove_body();
    2833                 :            : 
    2834         [ +  - ]:       1514 :      unhook_Lump_from_OCC(lump);
    2835                 :            :   }
    2836                 :            : 
    2837 [ +  + ][ +  - ]:       1582 :   if (shape && !shape->IsNull())
         [ +  - ][ +  + ]
    2838         [ +  - ]:         97 :     shape->Nullify();
    2839         [ +  - ]:       1582 :   return CUBIT_SUCCESS;
    2840                 :            : } 
    2841                 :            :   
    2842                 :            : //-------------------------------------------------------------------------
    2843                 :            : // Purpose       : unhook a OCClumps and child entities.
    2844                 :            : //
    2845                 :            : // Special Notes :
    2846                 :            : //
    2847                 :            : // Creator       : Jane Hu
    2848                 :            : //
    2849                 :            : // Creation Date : 11/29/07
    2850                 :            : //-------------------------------------------------------------------------
    2851                 :            : CubitStatus
    2852                 :       1514 : OCCQueryEngine::unhook_Lump_from_OCC( Lump* lump ) const
    2853                 :            : {
    2854         [ -  + ]:       1514 :   if (lump == NULL)
    2855                 :          0 :     return CUBIT_FAILURE;
    2856                 :            : 
    2857         [ -  + ]:       1514 :   OCCLump* occ_lump = dynamic_cast<OCCLump*>(lump);
    2858         [ -  + ]:       1514 :   if (!occ_lump)
    2859                 :          0 :     return CUBIT_FAILURE;
    2860                 :            : 
    2861         [ +  - ]:       1514 :   TopoDS_Solid* solid = occ_lump->get_TopoDS_Solid();
    2862                 :            : 
    2863         [ -  + ]:       1514 :   if(!solid)
    2864                 :          0 :     return CUBIT_FAILURE;
    2865                 :            : 
    2866                 :            :   //remove the entry from label tree
    2867         [ +  - ]:       1514 :   OCCAttribSet::remove_attribute(*solid) ;
    2868                 :            : 
    2869                 :            :   //remove the entry from the map
    2870                 :            :   int k;
    2871 [ +  - ][ +  + ]:       1514 :   if(OCCMap->IsBound(*solid))
    2872                 :            :     {
    2873         [ +  - ]:       1393 :       k = OCCMap->Find(*solid);
    2874                 :            : 
    2875         [ +  - ]:       1393 :       OCCMap->UnBind(*solid);
    2876                 :            : 
    2877 [ +  - ][ -  + ]:       1393 :       if(!OccToCGM->erase(k))
    2878 [ #  # ][ #  # ]:          0 :         PRINT_ERROR("The OccLump and iCreatedTotal pair is not in the map!");
         [ #  # ][ #  # ]
    2879                 :            :     }
    2880                 :            :   
    2881         [ +  - ]:       1514 :   DLIList<TopologyBridge*> children;
    2882         [ +  - ]:       1514 :   occ_lump->get_children_virt(children);
    2883 [ +  - ][ +  + ]:       2907 :   for(int i = 0; i < children.size(); i++)
    2884                 :            :   {
    2885 [ +  - ][ -  + ]:       1393 :      ShellSM* shell = CAST_TO(children.get_and_step(), ShellSM); 
    2886         [ +  - ]:       1393 :      unhook_ShellSM_from_OCC(shell);
    2887                 :            :   }
    2888 [ +  - ][ -  + ]:       1514 :   if (occ_lump->get_body() != NULL)
    2889 [ #  # ][ #  # ]:          0 :     BodyList->remove(CAST_TO(occ_lump->get_body(), OCCBody));
                 [ #  # ]
    2890                 :            : 
    2891 [ +  - ][ +  - ]:       1514 :   if(!solid->IsNull())
    2892         [ +  - ]:       1514 :      solid->Nullify();
    2893         [ +  - ]:       1514 :   return CUBIT_SUCCESS;
    2894                 :            : } 
    2895                 :            : 
    2896                 :            : //-------------------------------------------------------------------------
    2897                 :            : // Purpose       : unhook a ShellSM from its underlining OCC entity.
    2898                 :            : //
    2899                 :            : // Special Notes :
    2900                 :            : //
    2901                 :            : // Creator       : Jane Hu
    2902                 :            : //
    2903                 :            : // Creation Date : 12/12/07
    2904                 :            : //-------------------------------------------------------------------------
    2905                 :            : CubitStatus
    2906                 :       1514 : OCCQueryEngine::unhook_ShellSM_from_OCC( ShellSM* shell) const
    2907                 :            : {
    2908         [ -  + ]:       1514 :   OCCShell* occ_shell = dynamic_cast<OCCShell*>(shell);
    2909         [ -  + ]:       1514 :   if (!occ_shell)
    2910                 :          0 :     return CUBIT_FAILURE;
    2911                 :            : 
    2912         [ +  - ]:       1514 :   TopoDS_Shell* Shell = occ_shell->get_TopoDS_Shell();
    2913                 :            : 
    2914         [ -  + ]:       1514 :   if(!Shell)
    2915                 :          0 :     return CUBIT_FAILURE;
    2916                 :            : 
    2917                 :            :   //remove the entry from the map
    2918                 :            :   int k;
    2919 [ +  - ][ +  + ]:       1514 :   if(OCCMap->IsBound(*Shell))
    2920                 :            :     {
    2921         [ +  - ]:       1393 :       k = OCCMap->Find(*Shell);
    2922                 :            : 
    2923         [ +  - ]:       1393 :       OCCMap->UnBind(*Shell);
    2924                 :            : 
    2925 [ +  - ][ -  + ]:       1393 :       if(!OccToCGM->erase(k))
    2926 [ #  # ][ #  # ]:          0 :         PRINT_ERROR("The OccShell and iCreatedTotal pair is not in the map!");
         [ #  # ][ #  # ]
    2927                 :            :     }
    2928                 :            : 
    2929 [ +  - ][ +  - ]:       1514 :   if(!Shell->IsNull())
    2930         [ +  - ]:       1514 :     Shell->Nullify();
    2931                 :       1514 :   return CUBIT_SUCCESS;
    2932                 :            : }
    2933                 :            : 
    2934                 :            : //-------------------------------------------------------------------------
    2935                 :            : // Purpose       : Delete a OCCSurface and child entities.
    2936                 :            : //
    2937                 :            : // Special Notes :
    2938                 :            : //
    2939                 :            : // Creator       : Jane Hu
    2940                 :            : //
    2941                 :            : // Creation Date : 10/29/07
    2942                 :            : //-------------------------------------------------------------------------
    2943                 :            : CubitStatus
    2944                 :       9740 : OCCQueryEngine::delete_solid_model_entities( Surface* surface)const
    2945                 :            : {
    2946         [ -  + ]:       9740 :   OCCSurface* fsurf = dynamic_cast<OCCSurface*>(surface);
    2947         [ -  + ]:       9740 :   if (!fsurf)
    2948                 :          0 :     return CUBIT_FAILURE;
    2949                 :            : 
    2950         [ +  - ]:       9740 :   OCCBody* sheet_body = fsurf->my_body();
    2951         [ -  + ]:       9740 :   if(sheet_body != NULL)
    2952         [ #  # ]:          0 :     BodyList->remove(sheet_body);
    2953                 :            : 
    2954         [ +  - ]:       9740 :   double d = fsurf->measure();
    2955         [ -  + ]:       9740 :   if(d < 0.0)
    2956 [ #  # ][ #  # ]:          0 :     PRINT_WARNING("Negative area surface is being deleted. \n");
         [ #  # ][ #  # ]
    2957                 :            : 
    2958         [ +  - ]:       9740 :   DLIList<TopologyBridge*> children;
    2959         [ +  - ]:       9740 :   fsurf->get_children_virt(children);
    2960 [ +  - ][ +  + ]:      19948 :   for(int i = 0; i < children.size(); i++)
    2961                 :            :   {
    2962 [ +  - ][ -  + ]:      10208 :      LoopSM* loop = CAST_TO(children.get_and_step(), LoopSM);
    2963         [ +  - ]:      10208 :      delete_loop(loop);
    2964                 :            :   }
    2965         [ +  - ]:       9740 :   CubitStatus stat = unhook_Surface_from_OCC(surface);
    2966         [ +  - ]:       9740 :   if (stat)
    2967 [ +  - ][ +  - ]:       9740 :     delete surface;
    2968         [ +  - ]:       9740 :   return stat;
    2969                 :            : }
    2970                 :            : 
    2971                 :            : //-------------------------------------------------------------------------
    2972                 :            : // Purpose       : unhook a Surface from its underlining OCC entity.
    2973                 :            : //
    2974                 :            : // Special Notes :
    2975                 :            : //
    2976                 :            : // Creator       : Jane Hu
    2977                 :            : //
    2978                 :            : // Creation Date : 12/12/07
    2979                 :            : //-------------------------------------------------------------------------
    2980                 :            : CubitStatus
    2981                 :       9982 : OCCQueryEngine::unhook_Surface_from_OCC( Surface* surface) const
    2982                 :            : {
    2983         [ -  + ]:       9982 :   OCCSurface* fsurf = dynamic_cast<OCCSurface*>(surface);
    2984         [ -  + ]:       9982 :   if (!fsurf)
    2985                 :          0 :     return CUBIT_FAILURE;
    2986                 :            : 
    2987         [ +  - ]:       9982 :   TopoDS_Face *face = fsurf->get_TopoDS_Face();
    2988                 :            : 
    2989         [ -  + ]:       9982 :   if(!face)
    2990                 :          0 :     return CUBIT_FAILURE;
    2991                 :            : 
    2992                 :            :   //remove the entry from label tree
    2993         [ +  - ]:       9982 :   OCCAttribSet::remove_attribute(*face) ;
    2994                 :            : 
    2995                 :            :   //remove the entry from the map
    2996                 :            :   int k;
    2997 [ +  - ][ +  + ]:       9982 :   if(OCCMap->IsBound(*face))
    2998                 :            :     {
    2999         [ +  - ]:       9674 :       k = OCCMap->Find(*face);
    3000                 :            : 
    3001         [ +  - ]:       9674 :       OCCMap->UnBind(*face);
    3002                 :            : 
    3003 [ +  - ][ -  + ]:       9674 :       if(!OccToCGM->erase(k))
    3004 [ #  # ][ #  # ]:          0 :         PRINT_WARNING("The OccSurface and iCreatedTotal pair is not in the map!");
         [ #  # ][ #  # ]
    3005                 :            :     }
    3006         [ +  - ]:       9982 :   SurfaceList->remove(fsurf);
    3007 [ +  - ][ +  - ]:       9982 :   if(!face->IsNull())
    3008         [ +  - ]:       9982 :     face->Nullify();
    3009                 :       9982 :   return CUBIT_SUCCESS;
    3010                 :            : }
    3011                 :            : 
    3012                 :            : //-------------------------------------------------------------------------
    3013                 :            : // Purpose       : Delete a OCCLoop and child entities.
    3014                 :            : //
    3015                 :            : // Special Notes :
    3016                 :            : //
    3017                 :            : // Creator       : Jane Hu
    3018                 :            : //
    3019                 :            : // Creation Date : 10/29/07
    3020                 :            : //-------------------------------------------------------------------------
    3021                 :            : CubitStatus
    3022                 :      10208 : OCCQueryEngine::delete_loop( LoopSM* loopsm)const
    3023                 :            : {
    3024         [ -  + ]:      10208 :   OCCLoop* occ_loop = dynamic_cast<OCCLoop*>(loopsm);
    3025         [ -  + ]:      10208 :   if (!occ_loop)
    3026                 :          0 :     return CUBIT_FAILURE;
    3027                 :            : 
    3028         [ +  - ]:      10208 :   DLIList<OCCCoEdge*> children;
    3029 [ +  - ][ +  - ]:      10208 :   children = occ_loop->coedges();
                 [ +  - ]
    3030         [ +  - ]:      10208 :   int size = children.size();
    3031 [ +  - ][ +  - ]:      20416 :   DLIList<Curve*> curves;
    3032         [ +  + ]:      49215 :   while(size > 0)
    3033                 :            :   {
    3034         [ +  - ]:      39007 :      OCCCoEdge* coedge = children.pop();
    3035         [ +  - ]:      39007 :      Curve* curve = coedge->curve();
    3036         [ +  - ]:      39007 :      curves.append_unique(curve);
    3037         [ +  - ]:      39007 :      size = children.size();
    3038                 :            :   }
    3039                 :            :    
    3040         [ +  - ]:      10208 :   CubitStatus status = unhook_LoopSM_from_OCC(loopsm);
    3041                 :            : 
    3042 [ +  - ][ +  + ]:      48530 :   for(int i = 0; i < curves.size(); i ++)
    3043                 :            :   {
    3044 [ +  - ][ -  + ]:      38322 :     OCCCurve* occ_curve = CAST_TO(curves.get_and_step(), OCCCurve);
    3045         [ +  - ]:      38322 :     unhook_coedges_of_a_curve(occ_curve, occ_loop);
    3046         [ +  - ]:      38322 :     occ_curve->remove_loop(occ_loop);
    3047         [ +  - ]:      38322 :     delete_solid_model_entities(occ_curve);
    3048                 :            :   }
    3049                 :            : 
    3050         [ +  - ]:      10208 :   if (status)
    3051                 :            :   {
    3052         [ +  - ]:      10208 :     WireList->remove(occ_loop);
    3053 [ +  - ][ +  - ]:      10208 :     delete loopsm;
    3054                 :            :   }
    3055         [ +  - ]:      10208 :   return status;
    3056                 :            : }
    3057                 :            : 
    3058                 :            : //-------------------------------------------------------------------------
    3059                 :            : // Purpose       : unhook a LoopSM from its underlining OCC entity.
    3060                 :            : //
    3061                 :            : // Special Notes :
    3062                 :            : //
    3063                 :            : // Creator       : Jane Hu
    3064                 :            : //
    3065                 :            : // Creation Date : 12/12/07
    3066                 :            : //-------------------------------------------------------------------------
    3067                 :            : CubitStatus
    3068                 :      10853 : OCCQueryEngine::unhook_LoopSM_from_OCC( LoopSM* loopsm) const
    3069                 :            : {
    3070         [ -  + ]:      10853 :   OCCLoop* occ_loop = dynamic_cast<OCCLoop*>(loopsm);
    3071         [ -  + ]:      10853 :   if (!occ_loop)
    3072                 :          0 :     return CUBIT_FAILURE;
    3073                 :            : 
    3074         [ +  - ]:      10853 :   TopoDS_Wire* wire = occ_loop->get_TopoDS_Wire();
    3075                 :            : 
    3076         [ -  + ]:      10853 :   if(!wire)
    3077                 :          0 :     return CUBIT_FAILURE;
    3078                 :            : 
    3079                 :            :   //remove the entry from the map
    3080                 :            :   int k;
    3081 [ +  - ][ +  + ]:      10853 :   if(OCCMap->IsBound(*wire))
    3082                 :            :     {
    3083         [ +  - ]:      10208 :       k = OCCMap->Find(*wire);
    3084                 :            : 
    3085         [ +  - ]:      10208 :       OCCMap->UnBind(*wire);
    3086                 :            : 
    3087 [ +  - ][ -  + ]:      10208 :       if(!OccToCGM->erase(k))
    3088 [ #  # ][ #  # ]:          0 :         PRINT_ERROR("The OccLoop and iCreatedTotal pair is not in the map!");
         [ #  # ][ #  # ]
    3089                 :            :     }
    3090                 :            : 
    3091 [ +  - ][ +  - ]:      10853 :   if(!wire->IsNull())
    3092         [ +  - ]:      10853 :     wire->Nullify(); 
    3093                 :      10853 :   return CUBIT_SUCCESS;
    3094                 :            : }
    3095                 :            : 
    3096                 :            : //-------------------------------------------------------------------------
    3097                 :            : // Purpose      : unhook a list of OCCCoEdges from their underlining OCC entity.
    3098                 :            : //
    3099                 :            : // Special Notes :
    3100                 :            : //
    3101                 :            : // Creator       : Jane Hu
    3102                 :            : //
    3103                 :            : // Creation Date : 12/12/07
    3104                 :            : //-------------------------------------------------------------------------
    3105                 :            : CubitStatus
    3106                 :      60295 : OCCQueryEngine::unhook_CoEdges_from_OCC( DLIList<OCCCoEdge*>& coedges) const
    3107                 :            : {
    3108                 :      60295 :   int size = coedges.size();
    3109         [ +  + ]:     100974 :   while(size > 0)
    3110                 :            :   {
    3111                 :      40679 :      OCCCoEdge* coedge = coedges.pop();
    3112                 :            : 
    3113                 :      40679 :      LoopSM* loopsm = coedge->loop();
    3114         [ -  + ]:      40679 :      OCCLoop* loop = CAST_TO(loopsm, OCCLoop);
    3115         [ -  + ]:      40679 :      assert(loop);
    3116                 :      40679 :      loop->remove_coedge(coedge);
    3117                 :            :  
    3118         [ +  - ]:      40679 :      delete coedge;
    3119                 :            : 
    3120                 :      40679 :      size = coedges.size();
    3121                 :            :   }
    3122                 :      60295 :   return CUBIT_SUCCESS;
    3123                 :            : }
    3124                 :            : 
    3125                 :            : //-------------------------------------------------------------------------
    3126                 :            : // Purpose       : Delete a OCCCurve and child entities.
    3127                 :            : //
    3128                 :            : // Special Notes :
    3129                 :            : //
    3130                 :            : // Creator       : Jason Kraftcheck
    3131                 :            : //
    3132                 :            : // Creation Date : 09/29/03
    3133                 :            : //-------------------------------------------------------------------------
    3134                 :            : CubitStatus
    3135                 :      38883 : OCCQueryEngine::delete_solid_model_entities( Curve* curve)const
    3136                 :            : {
    3137         [ -  + ]:      38883 :   OCCCurve* fcurve = CAST_TO(curve, OCCCurve);
    3138         [ -  + ]:      38883 :   if (!fcurve )
    3139                 :          0 :     return CUBIT_FAILURE;
    3140                 :            : 
    3141 [ +  - ][ +  - ]:      38883 :   if(fcurve->loops().size() > 0 && fcurve->loops().get() != NULL)
         [ +  + ][ +  - ]
         [ +  - ][ +  - ]
         [ +  + ][ +  - ]
         [ +  - ][ +  - ]
           [ +  +  #  #  
                   #  # ]
    3142                 :      17746 :     return CUBIT_FAILURE;
    3143                 :            : 
    3144         [ +  - ]:      21137 :   DLIList<TopologyBridge*> children;
    3145         [ +  - ]:      21137 :   fcurve->get_children_virt(children);
    3146 [ +  - ][ +  + ]:      62316 :   for(int i = 0; i < children.size(); i++)
    3147                 :            :   {
    3148 [ +  - ][ -  + ]:      41179 :      TBPoint* point = CAST_TO(children.get_and_step(), TBPoint);
    3149 [ -  + ][ +  - ]:      41179 :      CAST_TO(point, OCCPoint)->remove_curve(fcurve);
    3150         [ +  - ]:      41179 :      delete_solid_model_entities(point);
    3151                 :            :   }
    3152                 :            :   
    3153         [ +  - ]:      21137 :   CubitStatus stat = unhook_Curve_from_OCC(curve);
    3154         [ -  + ]:      21137 :   if (!stat)
    3155                 :          0 :     return CUBIT_FAILURE;
    3156                 :            : 
    3157         [ +  - ]:      21137 :   CurveList->remove(fcurve);
    3158 [ +  - ][ +  - ]:      21137 :   delete fcurve;
    3159         [ +  - ]:      38883 :   return stat;
    3160                 :            : }
    3161                 :            : 
    3162                 :            : //-------------------------------------------------------------------------
    3163                 :            : // Purpose       : unhook a Curve from its underlining OCC entity.
    3164                 :            : //
    3165                 :            : // Special Notes :
    3166                 :            : //
    3167                 :            : // Creator       : Jane Hu
    3168                 :            : //
    3169                 :            : // Creation Date : 12/12/07
    3170                 :            : //-------------------------------------------------------------------------
    3171                 :            : CubitStatus
    3172                 :      21973 : OCCQueryEngine::unhook_Curve_from_OCC( Curve* curve ) const
    3173                 :            : {
    3174         [ -  + ]:      21973 :   OCCCurve* fcurve = dynamic_cast<OCCCurve*>(curve);
    3175         [ -  + ]:      21973 :   if (!fcurve )
    3176                 :          0 :     return CUBIT_FAILURE;
    3177                 :            : 
    3178         [ +  - ]:      21973 :   DLIList<TopologyBridge*> children;
    3179         [ +  - ]:      21973 :   fcurve->get_children_virt(children);
    3180 [ +  - ][ +  + ]:      49145 :   for(int i = 0; i < children.size(); i++)
    3181                 :            :   {
    3182 [ +  - ][ -  + ]:      27172 :      TBPoint* point = CAST_TO(children.get_and_step(), TBPoint);
    3183 [ -  + ][ +  - ]:      27172 :      CAST_TO(point, OCCPoint)->remove_curve(fcurve);
    3184                 :            :   }
    3185                 :            : 
    3186         [ +  - ]:      21973 :   unhook_coedges_of_a_curve(fcurve, NULL);
    3187                 :            :     
    3188         [ +  - ]:      21973 :   fcurve->clean_loops();
    3189         [ +  - ]:      21973 :   TopoDS_Edge* edge = fcurve->get_TopoDS_Edge();
    3190         [ -  + ]:      21973 :   if (!edge)
    3191                 :          0 :     return CUBIT_FAILURE;
    3192                 :            : 
    3193                 :            :   //remove the entry from label tree
    3194         [ +  - ]:      21973 :   OCCAttribSet::remove_attribute(*edge) ;
    3195                 :            :   
    3196                 :            :   //remove the entry from the map
    3197                 :            :   int k;
    3198 [ +  - ][ +  - ]:      21973 :   if(edge && !edge->IsNull() && OCCMap->IsBound(*edge))
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
    3199                 :            :     {
    3200         [ +  - ]:      21126 :       k = OCCMap->Find(*edge);
    3201                 :            : 
    3202         [ +  - ]:      21126 :       OCCMap->UnBind(*edge);
    3203                 :            : 
    3204 [ +  - ][ -  + ]:      21126 :       if(!OccToCGM->erase(k))
    3205 [ #  # ][ #  # ]:          0 :         PRINT_WARNING("The OccCurve and iCreatedTotal pair is not in the map!");
         [ #  # ][ #  # ]
    3206                 :            :     }
    3207         [ +  - ]:      21973 :   CurveList->remove(fcurve); 
    3208 [ +  - ][ +  - ]:      21973 :   if(!edge->IsNull())
    3209         [ +  - ]:      21973 :     edge->Nullify();
    3210         [ +  - ]:      21973 :   return CUBIT_SUCCESS;
    3211                 :            : }
    3212                 :            : //-------------------------------------------------------------------------
    3213                 :            : // Purpose       : Delete a OCCPoint and child entities.
    3214                 :            : //
    3215                 :            : // Special Notes :
    3216                 :            : //
    3217                 :            : // Creator       : Jason Kraftcheck
    3218                 :            : //
    3219                 :            : // Creation Date : 09/29/03
    3220                 :            : //-------------------------------------------------------------------------
    3221                 :            : CubitStatus
    3222                 :      41729 : OCCQueryEngine::delete_solid_model_entities( TBPoint* point) const
    3223                 :            : {
    3224         [ -  + ]:      41729 :   OCCPoint* fpoint = dynamic_cast<OCCPoint*>(point);
    3225         [ -  + ]:      41729 :   if (!fpoint)
    3226                 :          0 :     return CUBIT_FAILURE;
    3227                 :            : 
    3228         [ +  + ]:      41729 :   if(fpoint->num_curves() > 0)
    3229                 :      26380 :     return CUBIT_FAILURE;
    3230                 :            : 
    3231                 :      15349 :   CubitStatus stat = unhook_Point_from_OCC(point);
    3232                 :            :   
    3233         [ +  - ]:      15349 :   if(stat)
    3234         [ +  - ]:      15349 :     delete point;
    3235                 :      15349 :   return stat;
    3236                 :            : }
    3237                 :            : 
    3238                 :            : //-------------------------------------------------------------------------
    3239                 :            : // Purpose       : unhook a Point from its underlining OCC entity.
    3240                 :            : //
    3241                 :            : // Special Notes :
    3242                 :            : //
    3243                 :            : // Creator       : Jane Hu
    3244                 :            : //
    3245                 :            : // Creation Date : 12/12/07
    3246                 :            : //-------------------------------------------------------------------------
    3247                 :            : CubitStatus
    3248                 :      15349 : OCCQueryEngine::unhook_Point_from_OCC( TBPoint* point) const 
    3249                 :            : {
    3250         [ -  + ]:      15349 :   OCCPoint* fpoint = dynamic_cast<OCCPoint*>(point);
    3251         [ -  + ]:      15349 :   if (!fpoint)
    3252                 :          0 :     return CUBIT_FAILURE;
    3253                 :            : 
    3254         [ +  - ]:      15349 :   TopoDS_Vertex* vertex = fpoint->get_TopoDS_Vertex();
    3255         [ -  + ]:      15349 :   if (!vertex)
    3256                 :          0 :     return CUBIT_FAILURE;
    3257                 :            : 
    3258                 :            :   //remove the entry from label tree
    3259         [ +  - ]:      15349 :   OCCAttribSet::remove_attribute(*vertex) ;
    3260                 :            : 
    3261                 :            :   //remove the entry from the map
    3262                 :            :   int k;
    3263 [ +  - ][ +  + ]:      15349 :   if(OCCMap->IsBound(*vertex))
    3264                 :            :     {
    3265         [ +  - ]:      14821 :       k = OCCMap->Find(*vertex);
    3266                 :            : 
    3267         [ +  - ]:      14821 :       OCCMap->UnBind(*vertex);
    3268                 :            : 
    3269 [ +  - ][ -  + ]:      14821 :       if(!OccToCGM->erase(k))
    3270 [ #  # ][ #  # ]:          0 :         PRINT_ERROR("The OccPoint and iCreatedTotal pair is not in the map!");
         [ #  # ][ #  # ]
    3271                 :            :     }
    3272 [ +  - ][ +  - ]:      15349 :   if(!vertex->IsNull())
    3273         [ +  - ]:      15349 :     vertex->Nullify();
    3274                 :      15349 :   return CUBIT_SUCCESS;
    3275                 :            : }
    3276                 :            : 
    3277                 :            : 
    3278                 :            : //-------------------------------------------------------------------------
    3279                 :            : // Purpose       : fire a ray at the specified body, returning the entities hit.
    3280                 :            : //
    3281                 :            : // Special Notes :
    3282                 :            : //
    3283                 :            : // Creator       : Jane Hu
    3284                 :            : //
    3285                 :            : // Creation Date : 12/12/07
    3286                 :            : //-------------------------------------------------------------------------
    3287                 :          0 : CubitStatus OCCQueryEngine::fire_ray(  CubitVector &origin,
    3288                 :            :                         CubitVector &direction,
    3289                 :            :                         DLIList<TopologyBridge*> &at_entity_list,
    3290                 :            :                         DLIList<double> &ray_params,
    3291                 :            :                         int max_hits ,
    3292                 :            :                         double ray_radius ,
    3293                 :            :                         DLIList<TopologyBridge*> *hit_entity_list_ptr )const
    3294                 :            : {
    3295                 :          0 :   CubitStatus status = CUBIT_SUCCESS;
    3296                 :            : 
    3297                 :            :   //- fire a ray at the specified body, returning the entities hit and
    3298                 :            :   //- the parameters along the ray; return CUBIT_FAILURE if error
    3299                 :            :   // - line body intersection. 
    3300 [ #  # ][ #  # ]:          0 :   gp_Pnt p(origin.x(), origin.y(), origin.z());
         [ #  # ][ #  # ]
    3301 [ #  # ][ #  # ]:          0 :   gp_Dir dir(direction.x(), direction.y(), direction.z());
         [ #  # ][ #  # ]
    3302         [ #  # ]:          0 :   gp_Lin L(p, dir);
    3303 [ #  # ][ #  # ]:          0 :   TopoDS_Edge edge = BRepBuilderAPI_MakeEdge(L); 
                 [ #  # ]
    3304                 :            :   
    3305 [ #  # ][ #  # ]:          0 :   for(int i = 0; i < at_entity_list.size(); i++)
    3306                 :            :   {
    3307         [ #  # ]:          0 :     TopologyBridge* tb = at_entity_list.get_and_step();
    3308                 :            :     TopoDS_Shape *shape;
    3309         [ #  # ]:          0 :     OCCBody *occBody = CAST_TO(tb, OCCBody);
    3310         [ #  # ]:          0 :     if (occBody )
    3311                 :            :     {
    3312         [ #  # ]:          0 :       occBody->get_TopoDS_Shape(shape);
    3313                 :            :     
    3314         [ #  # ]:          0 :       BRepExtrema_DistShapeShape distShapeShape(edge, *shape);
    3315                 :            :       //distShapeShape.Perform();
    3316 [ #  # ][ #  # ]:          0 :       if (!distShapeShape.IsDone())
    3317                 :            :       {
    3318 [ #  # ][ #  # ]:          0 :         PRINT_ERROR("Cannot calculate the intersection points for the input body.\n");
         [ #  # ][ #  # ]
    3319                 :          0 :         return CUBIT_FAILURE;
    3320                 :            :       }
    3321                 :            : 
    3322 [ #  # ][ #  # ]:          0 :       if (distShapeShape.Value() < get_sme_resabs_tolerance())
                 [ #  # ]
    3323                 :            :       {
    3324         [ #  # ]:          0 :         int numPnt = distShapeShape.NbSolution();
    3325         [ #  # ]:          0 :         for (int i = 1; i <= numPnt; i++)
    3326                 :            :         {
    3327                 :            :           double para;
    3328         [ #  # ]:          0 :           distShapeShape.ParOnEdgeS1(i , para);
    3329         [ #  # ]:          0 :           ray_params.append(para);
    3330                 :            :         }
    3331 [ #  # ][ #  # ]:          0 :         hit_entity_list_ptr->append(tb);
                 [ #  # ]
    3332                 :          0 :       } 
    3333                 :            :     }
    3334                 :            :   }
    3335         [ #  # ]:          0 :   return status;
    3336                 :            : }
    3337                 :            : 
    3338                 :     119540 : double OCCQueryEngine::get_sme_resabs_tolerance() const
    3339                 :            : {
    3340                 :     119540 :   return Precision::Confusion(); 
    3341                 :            : }
    3342                 :            : // Gets solid modeler's resolution absolute tolerance
    3343                 :            : 
    3344                 :          0 : double OCCQueryEngine::set_sme_resabs_tolerance( double p)
    3345                 :            : {
    3346                 :          0 :   double old_p = get_sme_resabs_tolerance();
    3347                 :          0 :   BRepBuilderAPI::Precision(p);
    3348                 :          0 :   return old_p;
    3349                 :            : }
    3350                 :            : 
    3351                 :          0 : CubitStatus OCCQueryEngine::set_int_option( const char* , int )
    3352                 :            : {
    3353 [ #  # ][ #  # ]:          0 :   PRINT_ERROR("OCCQueryEngine::set_int_option not yet implemented.\n");
    3354                 :          0 :   return CUBIT_FAILURE;
    3355                 :            : }
    3356                 :            : 
    3357                 :          0 : CubitStatus OCCQueryEngine::set_dbl_option( const char* , double )
    3358                 :            : {
    3359 [ #  # ][ #  # ]:          0 :   PRINT_ERROR("OCCQueryEngine::set_dbl_option not yet implemented.\n");
    3360                 :          0 :   return CUBIT_FAILURE;
    3361                 :            : }
    3362                 :            : 
    3363                 :          0 : CubitStatus OCCQueryEngine::set_str_option( const char* , const char* )
    3364                 :            : {
    3365 [ #  # ][ #  # ]:          0 :   PRINT_ERROR("OCCQueryEngine::set_str_option not yet implemented.\n");
    3366                 :          0 :   return CUBIT_FAILURE;
    3367                 :            : }
    3368                 :            : //- Set solid modeler options
    3369                 :            : 
    3370                 :            : 
    3371                 :            : //===========================================================================
    3372                 :            : //Function Name: ensure_is_ascii_stl_file
    3373                 :            : //Member Type:
    3374                 :            : //Description: returns CUBIT_TRUE in is_ascii if fp is an ascii stl file
    3375                 :            : //Author: Plamen Stoyanov (USF)
    3376                 :            : //===========================================================================
    3377                 :          0 : CubitStatus OCCQueryEngine::ensure_is_ascii_stl_file(FILE * fp, CubitBoolean &is_ascii)
    3378                 :            : {
    3379                 :            : 
    3380                 :          0 :   char line[128]="";
    3381                 :            : 
    3382 [ #  # ][ #  # ]:          0 :   if (fgets(line, 128, fp)==NULL)
    3383                 :            :     {
    3384                 :          0 :       return CUBIT_FAILURE;
    3385                 :            :     }
    3386 [ #  # ][ #  # ]:          0 :   if (fgets(line, 128, fp)==NULL)
    3387                 :            :     {
    3388                 :          0 :       return CUBIT_FAILURE;
    3389                 :            :     }
    3390         [ #  # ]:          0 :   if (strlen(line)==127)
    3391                 :            :     {
    3392 [ #  # ][ #  # ]:          0 :       if (fgets(line, 128, fp)==NULL)
    3393                 :            :         {
    3394                 :          0 :           return CUBIT_FAILURE;
    3395                 :            :         }
    3396                 :            :     }
    3397                 :            : 
    3398                 :            : 
    3399                 :          0 :   unsigned int dummy_int=0;
    3400                 :            : 
    3401 [ #  # ][ #  # ]:          0 :   while (isspace(line[dummy_int])&& dummy_int<strlen(line)) dummy_int++;
    3402                 :            : 
    3403         [ #  # ]:          0 :   if (strlen(line)-dummy_int>5)
    3404                 :            :     {
    3405 [ #  # ][ #  # ]:          0 :       if (tolower(line[dummy_int++])=='f' &&
    3406         [ #  # ]:          0 :           tolower(line[dummy_int++])=='a' &&
    3407         [ #  # ]:          0 :           tolower(line[dummy_int++])=='c' &&
    3408 [ #  # ][ #  # ]:          0 :           tolower(line[dummy_int++])=='e' &&
    3409                 :          0 :           tolower(line[dummy_int])=='t')
    3410                 :            :         {
    3411 [ #  # ][ #  # ]:          0 :           if (fgets(line, 128, fp)==NULL)
    3412                 :            :             {
    3413                 :          0 :               return CUBIT_FAILURE;
    3414                 :            :             }
    3415                 :          0 :           dummy_int=0;
    3416 [ #  # ][ #  # ]:          0 :           while (isspace(line[dummy_int])&& dummy_int<strlen(line))
    3417                 :            :             {
    3418                 :          0 :               dummy_int++;
    3419                 :            :             }
    3420         [ #  # ]:          0 :           if (strlen(line)-dummy_int>5)
    3421                 :            :             {
    3422 [ #  # ][ #  # ]:          0 :               if (tolower(line[dummy_int++])=='o' &&
    3423         [ #  # ]:          0 :                   tolower(line[dummy_int++])=='u' &&
    3424         [ #  # ]:          0 :                   tolower(line[dummy_int++])=='t' &&
    3425 [ #  # ][ #  # ]:          0 :                   tolower(line[dummy_int++])=='e' &&
    3426                 :          0 :                   tolower(line[dummy_int])=='r')
    3427                 :            :                 {
    3428 [ #  # ][ #  # ]:          0 :                   if (fgets(line, 128, fp)==NULL)
    3429                 :            :                     {
    3430                 :          0 :                       return CUBIT_FAILURE;
    3431                 :            :                     }
    3432                 :          0 :                   dummy_int=0;
    3433 [ #  # ][ #  # ]:          0 :                   while (isspace(line[dummy_int])&& dummy_int<strlen(line)) {
    3434                 :          0 :                     dummy_int++;
    3435                 :            :                   }
    3436         [ #  # ]:          0 :                   if (strlen(line)-dummy_int>6)
    3437                 :            :                     {
    3438 [ #  # ][ #  # ]:          0 :                       if (tolower(line[dummy_int++])=='v' &&
    3439         [ #  # ]:          0 :                           tolower(line[dummy_int++])=='e' &&
    3440         [ #  # ]:          0 :                           tolower(line[dummy_int++])=='r' &&
    3441         [ #  # ]:          0 :                           tolower(line[dummy_int++])=='t' &&
    3442 [ #  # ][ #  # ]:          0 :                           tolower(line[dummy_int++])=='e'       &&
    3443                 :          0 :                           tolower(line[dummy_int])=='x')
    3444                 :            :                         {
    3445                 :          0 :                           is_ascii=CUBIT_TRUE;
    3446                 :            :                         }
    3447                 :            :                     }
    3448                 :            :                 }
    3449                 :            :             }
    3450                 :            :         }
    3451                 :            :     }
    3452                 :          0 :   return CUBIT_SUCCESS;
    3453                 :            : }
    3454                 :            : 
    3455                 :            : 
    3456                 :            : //=============================================================================
    3457                 :            : //Function:   create_super_facet_bounding_box(PUBLIC)
    3458                 :            : //Description: Find the bounding box of a list of BodySMs
    3459                 :            : //Author: jdfowle
    3460                 :            : //Date: 12/15/03
    3461                 :            : //=============================================================================
    3462                 :          0 : CubitStatus OCCQueryEngine::create_super_bounding_box(
    3463                 :            :                                                       DLIList<BodySM*>& body_list,
    3464                 :            :                                                       CubitBox& super_box )
    3465                 :            : {
    3466                 :            :   BodySM *bodySM;
    3467                 :            :   int i;
    3468                 :          0 :   CubitStatus status = CUBIT_SUCCESS;
    3469                 :            : 
    3470                 :          0 :   body_list.reset();
    3471         [ #  # ]:          0 :   for ( i = 0; i < body_list.size(); i++ ) {
    3472                 :          0 :     bodySM = body_list.get_and_step();  
    3473         [ #  # ]:          0 :     OCCBody* occBody = CAST_TO(bodySM, OCCBody);
    3474         [ #  # ]:          0 :     super_box |= occBody->get_bounding_box();
    3475                 :            :   }
    3476                 :            : 
    3477                 :          0 :   return status;
    3478                 :            : }
    3479                 :            : 
    3480                 :          0 : CubitStatus OCCQueryEngine::restore_transform( BodySM* body )
    3481                 :            : {
    3482                 :          0 :   return CUBIT_FAILURE;
    3483                 :            : }
    3484                 :            : 
    3485                 :        400 : CubitStatus OCCQueryEngine::translate( BodySM* body, const CubitVector& d )
    3486                 :            : {
    3487         [ -  + ]:        400 :   OCCBody* theBody = dynamic_cast<OCCBody*>(body);
    3488         [ +  - ]:        400 :   return theBody ? theBody->move( d.x(), d.y(), d.z() ) : CUBIT_FAILURE;
    3489                 :            : }
    3490                 :         11 : CubitStatus OCCQueryEngine::rotate( BodySM* body, const CubitVector& v, double a )
    3491                 :            : {
    3492                 :            :   // a is in degree.
    3493         [ -  + ]:         11 :   OCCBody* occ_bod = dynamic_cast<OCCBody*>(body);
    3494                 :         11 :   a *= CUBIT_PI/180;
    3495         [ +  - ]:         11 :   return occ_bod ? occ_bod->rotate( v.x(), v.y(), v.z(), a ) : CUBIT_FAILURE;
    3496                 :            : }
    3497                 :          0 : CubitStatus OCCQueryEngine::scale( BodySM* body, double factor )
    3498                 :            : {
    3499         [ #  # ]:          0 :   OCCBody* facetbod = dynamic_cast<OCCBody*>(body);
    3500         [ #  # ]:          0 :   return facetbod ? facetbod->scale( factor ) : CUBIT_FAILURE;
    3501                 :            : }
    3502                 :         11 : CubitStatus OCCQueryEngine::scale( BodySM* body, const CubitVector& f )
    3503                 :            : {
    3504         [ -  + ]:         11 :   OCCBody* facetbod = dynamic_cast<OCCBody*>(body);
    3505         [ +  - ]:         11 :   return facetbod ? facetbod->scale( f.x(), f.y(), f.z() ) : CUBIT_FAILURE;
    3506                 :            : }
    3507                 :            : 
    3508                 :            : //-------------------------------------------------------------------------
    3509                 :            : // Purpose       : Transform a Solid, Surface, Curve, or Vertex
    3510                 :            : //
    3511                 :            : // Special Notes :
    3512                 :            : //
    3513                 :            : // Creator       : Jane Hu
    3514                 :            : //
    3515                 :            : // Creation Date : 10/23/07
    3516                 :            : //-------------------------------------------------------------------------
    3517                 :          0 : CubitStatus OCCQueryEngine::translate( GeometryEntity* entity,
    3518                 :            :                                        const CubitVector& v )
    3519                 :            : {
    3520                 :            :   TopoDS_Shape * shape;
    3521 [ #  # ][ #  # ]:          0 :   if ((shape = get_TopoDS_Shape_of_entity(entity)) == NULL)
    3522                 :            :     {
    3523 [ #  # ][ #  # ]:          0 :       PRINT_ERROR( "problem occured getting OCC entity.\n"
                 [ #  # ]
    3524         [ #  # ]:          0 :                    "       Aborting.\n" );
    3525                 :          0 :       return CUBIT_FAILURE;
    3526                 :            :     }
    3527                 :            : 
    3528 [ #  # ][ #  # ]:          0 :   gp_Vec aVec(v.x(), v.y(),v.z());
         [ #  # ][ #  # ]
    3529         [ #  # ]:          0 :   gp_Trsf aTrsf;  
    3530         [ #  # ]:          0 :   aTrsf.SetTranslation(aVec);
    3531                 :            : 
    3532         [ #  # ]:          0 :   BRepBuilderAPI_Transform aBRepTrsf(*shape, aTrsf);
    3533                 :            :   
    3534         [ #  # ]:          0 :   update_entity_shape(entity, &aBRepTrsf);
    3535         [ #  # ]:          0 :   return CUBIT_SUCCESS;
    3536                 :            : }
    3537                 :            : 
    3538                 :          0 : CubitStatus OCCQueryEngine::update_entity_shape(GeometryEntity* entity_ptr,
    3539                 :            :                                         BRepBuilderAPI_ModifyShape* aBRepTrsf,
    3540                 :            :                                         BRepAlgoAPI_BooleanOperation *op)
    3541                 :            : {
    3542 [ #  # ][ #  # ]:          0 :   if (OCCBody *body_ptr = CAST_TO( entity_ptr, OCCBody))
    3543                 :            :     {
    3544                 :          0 :       body_ptr->update_OCC_entity(aBRepTrsf, op);
    3545                 :          0 :       return CUBIT_SUCCESS;
    3546                 :            :     }
    3547                 :            : 
    3548 [ #  # ][ #  # ]:          0 :   else if( OCCSurface *surface_ptr = CAST_TO( entity_ptr, OCCSurface))
    3549                 :            :     {
    3550                 :          0 :       surface_ptr->update_OCC_entity(aBRepTrsf, op);
    3551                 :          0 :       return CUBIT_SUCCESS;
    3552                 :            :     }
    3553                 :            : 
    3554 [ #  # ][ #  # ]:          0 :   else if( OCCCurve *curve_ptr = CAST_TO( entity_ptr, OCCCurve))
    3555                 :            :     {
    3556                 :          0 :        curve_ptr->update_OCC_entity(aBRepTrsf, op); 
    3557                 :          0 :        return CUBIT_SUCCESS;
    3558                 :            :     }
    3559                 :            : 
    3560 [ #  # ][ #  # ]:          0 :   else if( OCCPoint *point_ptr = CAST_TO( entity_ptr, OCCPoint))
    3561                 :            :     {
    3562                 :          0 :       point_ptr->update_OCC_entity(aBRepTrsf, op);
    3563                 :          0 :       return CUBIT_SUCCESS;
    3564                 :            :     }
    3565                 :            : 
    3566 [ #  # ][ #  # ]:          0 :   PRINT_ERROR("Non-OCC TopologyBridge at %s:%d.\n", __FILE__, __LINE__ );
    3567                 :          0 :   return CUBIT_FAILURE;
    3568                 :            : }
    3569                 :            : 
    3570                 :            : //a is angular value of rotation in radians
    3571                 :          0 : CubitStatus OCCQueryEngine::rotate( GeometryEntity* entity,
    3572                 :            :                                     const CubitVector& v, double a )
    3573                 :            : {
    3574                 :            :   TopoDS_Shape * shape;
    3575 [ #  # ][ #  # ]:          0 :   if ((shape = get_TopoDS_Shape_of_entity(entity)) == NULL)
    3576                 :            :     {
    3577 [ #  # ][ #  # ]:          0 :       PRINT_ERROR( "problem occured getting OCC entity.\n"
                 [ #  # ]
    3578         [ #  # ]:          0 :                    "       Aborting.\n" );
    3579                 :          0 :       return CUBIT_FAILURE;
    3580                 :            :     }
    3581                 :            : 
    3582         [ #  # ]:          0 :   gp_Pnt aOrigin(0,0,0);
    3583 [ #  # ][ #  # ]:          0 :   gp_Dir aDir(v.x(), v.y(), v.z());
         [ #  # ][ #  # ]
    3584         [ #  # ]:          0 :   gp_Ax1 anAxis(aOrigin, aDir);
    3585                 :            : 
    3586                 :            :   //a is angular value of rotation in radians 
    3587         [ #  # ]:          0 :   gp_Trsf aTrsf;
    3588         [ #  # ]:          0 :   aTrsf.SetRotation(anAxis, a);
    3589                 :            : 
    3590         [ #  # ]:          0 :   BRepBuilderAPI_Transform aBRepTrsf(*shape, aTrsf);
    3591         [ #  # ]:          0 :   update_entity_shape(entity, &aBRepTrsf);
    3592         [ #  # ]:          0 :   return CUBIT_SUCCESS;
    3593                 :            : }
    3594                 :            : 
    3595                 :          0 : CubitStatus OCCQueryEngine::scale( GeometryEntity* entity, double f )
    3596                 :            : {
    3597                 :            :   TopoDS_Shape * shape;
    3598 [ #  # ][ #  # ]:          0 :   if ((shape = get_TopoDS_Shape_of_entity(entity)) == NULL)
    3599                 :            :     {
    3600 [ #  # ][ #  # ]:          0 :       PRINT_ERROR( "problem occured getting OCC entity.\n"
                 [ #  # ]
    3601         [ #  # ]:          0 :                    "       Aborting.\n" );
    3602                 :          0 :       return CUBIT_FAILURE;
    3603                 :            :     }
    3604                 :            : 
    3605         [ #  # ]:          0 :   gp_Trsf aTrsf;
    3606         [ #  # ]:          0 :   aTrsf.SetScaleFactor(f);
    3607                 :            : 
    3608         [ #  # ]:          0 :   BRepBuilderAPI_Transform aBRepTrsf(*shape, aTrsf);
    3609         [ #  # ]:          0 :   update_entity_shape(entity, &aBRepTrsf);
    3610         [ #  # ]:          0 :   return CUBIT_SUCCESS;
    3611                 :            : }
    3612                 :            : 
    3613                 :          0 : CubitStatus OCCQueryEngine::scale( GeometryEntity* entity, 
    3614                 :            :                                    const CubitVector& v )
    3615                 :            : {
    3616                 :            :   TopoDS_Shape * shape;
    3617 [ #  # ][ #  # ]:          0 :   if ((shape = get_TopoDS_Shape_of_entity(entity)) == NULL)
    3618                 :            :     {
    3619 [ #  # ][ #  # ]:          0 :       PRINT_ERROR( "problem occured getting OCC entity.\n"
                 [ #  # ]
    3620         [ #  # ]:          0 :                    "       Aborting.\n" );
    3621                 :          0 :       return CUBIT_FAILURE;
    3622                 :            :     }
    3623                 :            : 
    3624         [ #  # ]:          0 :   gp_GTrsf gTrsf;
    3625 [ #  # ][ #  # ]:          0 :   gTrsf.SetValue(1,1, v.x());
    3626 [ #  # ][ #  # ]:          0 :   gTrsf.SetValue(2,2, v.y());
    3627 [ #  # ][ #  # ]:          0 :   gTrsf.SetValue(3,3, v.z());
    3628                 :            : 
    3629         [ #  # ]:          0 :   BRepBuilderAPI_GTransform gBRepTrsf(gTrsf);
    3630         [ #  # ]:          0 :   gBRepTrsf.Perform(*shape);
    3631         [ #  # ]:          0 :   update_entity_shape(entity, &gBRepTrsf);
    3632         [ #  # ]:          0 :   return CUBIT_SUCCESS;
    3633                 :            : }
    3634                 :            : 
    3635                 :            : // like other engines here v is the normal of symmetric plane.
    3636                 :          0 : CubitStatus OCCQueryEngine::reflect( GeometryEntity* entity, 
    3637                 :            :                                      const CubitVector&  v)
    3638                 :            : {
    3639                 :            :   TopoDS_Shape * shape;
    3640 [ #  # ][ #  # ]:          0 :   if ((shape = get_TopoDS_Shape_of_entity(entity)) == NULL)
    3641                 :            :     {
    3642 [ #  # ][ #  # ]:          0 :       PRINT_ERROR( "problem occured getting OCC entity.\n"
                 [ #  # ]
    3643         [ #  # ]:          0 :                    "       Aborting.\n" );
    3644                 :          0 :       return CUBIT_FAILURE;
    3645                 :            :     }
    3646                 :            :  
    3647         [ #  # ]:          0 :   gp_Pnt aOrigin(0,0,0);
    3648 [ #  # ][ #  # ]:          0 :   gp_Dir aDir(v.x(), v.y(), v.z());
         [ #  # ][ #  # ]
    3649         [ #  # ]:          0 :   gp_Ax2 anAx2(aOrigin, aDir);
    3650                 :            : 
    3651         [ #  # ]:          0 :   gp_Trsf aTrsf;
    3652         [ #  # ]:          0 :   aTrsf.SetMirror(anAx2);
    3653                 :            : 
    3654         [ #  # ]:          0 :   BRepBuilderAPI_Transform aBRepTrsf(*shape, aTrsf);
    3655         [ #  # ]:          0 :   update_entity_shape(entity, &aBRepTrsf);
    3656         [ #  # ]:          0 :   return CUBIT_SUCCESS;
    3657                 :            : }
    3658                 :            : 
    3659                 :            : //===============================================================================
    3660                 :            : // Function   : bodies_overlap
    3661                 :            : // Member Type: PUBLIC
    3662                 :            : // Description: determine if OCC-based bodies overlap
    3663                 :            : // Author     : Jane Hu 
    3664                 :            : // Date       : 10/07
    3665                 :            : //===============================================================================
    3666                 :          0 : CubitBoolean OCCQueryEngine::bodies_overlap (BodySM * body_ptr_1,
    3667                 :            :                                              BodySM * body_ptr_2 ) const
    3668                 :            : {
    3669         [ #  # ]:          0 :   OCCBody *occ_body1 = CAST_TO(body_ptr_1, OCCBody);
    3670         [ #  # ]:          0 :   if (!occ_body1)
    3671                 :            :     {
    3672 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Can't calculate intersection of non-OCC bodies.");
         [ #  # ][ #  # ]
    3673                 :          0 :       return CUBIT_FALSE;
    3674                 :            :     }
    3675                 :            :  
    3676         [ #  # ]:          0 :   OCCBody *occ_body2 = CAST_TO(body_ptr_2, OCCBody);
    3677         [ #  # ]:          0 :   if (!occ_body2)
    3678                 :            :     {
    3679 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Can't calculate intersection of non-OCC bodies.");
         [ #  # ][ #  # ]
    3680                 :          0 :       return CUBIT_FALSE;
    3681                 :            :     }
    3682                 :            : 
    3683         [ #  # ]:          0 :   CubitBox box_1 = occ_body1->get_bounding_box();
    3684 [ #  # ][ #  # ]:          0 :   CubitBox box_2 = occ_body2->get_bounding_box();
    3685 [ #  # ][ #  # ]:          0 :   if ( !box_1.overlap( GEOMETRY_RESABS, box_2 ) )
    3686                 :          0 :     return CUBIT_FALSE;
    3687                 :            : 
    3688                 :            :   TopoDS_Shape *shape1;
    3689         [ #  # ]:          0 :   occ_body1->get_TopoDS_Shape(shape1);
    3690                 :            :   TopoDS_Shape *shape2;
    3691         [ #  # ]:          0 :   occ_body2->get_TopoDS_Shape(shape2); 
    3692                 :            :   
    3693                 :            :   //BRepAlgoAPI_Section calculates intersection between faces only.
    3694 [ #  # ][ #  # ]:          0 :   TopExp_Explorer Ex1, Ex2;
         [ #  # ][ #  # ]
    3695 [ #  # ][ #  # ]:          0 :   for (Ex1.Init(*shape1, TopAbs_SOLID); Ex1.More(); Ex1.Next())
         [ #  # ][ #  # ]
    3696                 :            :     {
    3697 [ #  # ][ #  # ]:          0 :       TopoDS_Solid *posolid1 =  new TopoDS_Solid;
    3698 [ #  # ][ #  # ]:          0 :       *posolid1 = TopoDS::Solid(Ex1.Current());
                 [ #  # ]
    3699 [ #  # ][ #  # ]:          0 :       OCCLump * lump1 = new OCCLump(posolid1); 
    3700 [ #  # ][ #  # ]:          0 :       for (Ex2.Init(*shape2, TopAbs_SOLID); Ex2.More(); Ex2.Next())
         [ #  # ][ #  # ]
    3701                 :            :         {
    3702 [ #  # ][ #  # ]:          0 :           TopoDS_Solid *posolid2 =  new TopoDS_Solid;
    3703 [ #  # ][ #  # ]:          0 :           *posolid2 = TopoDS::Solid(Ex2.Current());
                 [ #  # ]
    3704 [ #  # ][ #  # ]:          0 :           OCCLump * lump2 = new OCCLump(posolid2);
    3705         [ #  # ]:          0 :           CubitBoolean is_overlap = volumes_overlap(lump1, lump2);
    3706         [ #  # ]:          0 :           if(is_overlap)
    3707                 :          0 :             return CUBIT_TRUE;
    3708                 :            :         }
    3709                 :            :     }
    3710         [ #  # ]:          0 :   return CUBIT_FALSE;
    3711                 :            : }
    3712                 :            : 
    3713                 :          0 : CubitBoolean OCCQueryEngine::volumes_overlap (Lump *lump1, Lump *lump2 ) const
    3714                 :            : {
    3715         [ #  # ]:          0 :   OCCLump *occ_lump1 = CAST_TO(lump1, OCCLump);
    3716         [ #  # ]:          0 :   if (!occ_lump1)
    3717                 :            :     {
    3718 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Can't calculate intersection of non-OCC solids.");
         [ #  # ][ #  # ]
    3719                 :          0 :       return CUBIT_FALSE;
    3720                 :            :     }
    3721                 :            : 
    3722         [ #  # ]:          0 :   OCCLump *occ_lump2 = CAST_TO(lump2, OCCLump);
    3723         [ #  # ]:          0 :   if (!occ_lump2)
    3724                 :            :     {
    3725 [ #  # ][ #  # ]:          0 :       PRINT_ERROR("Can't calculate intersection of non-OCC solids.");
         [ #  # ][ #  # ]
    3726                 :          0 :       return CUBIT_FALSE;
    3727                 :            :     }
    3728                 :            : 
    3729         [ #  # ]:          0 :   CubitBox box_1 = occ_lump1->bounding_box();
    3730 [ #  # ][ #  # ]:          0 :   CubitBox box_2 = occ_lump2->bounding_box();
    3731 [ #  # ][ #  # ]:          0 :   if ( !box_1.overlap( GEOMETRY_RESABS, box_2 ) )
    3732                 :          0 :     return CUBIT_FALSE;
    3733                 :            : 
    3734         [ #  # ]:          0 :   TopoDS_Shape *shape1 = (TopoDS_Shape*)(occ_lump1->get_TopoDS_Solid());
    3735         [ #  # ]:          0 :   TopoDS_Shape *shape2 = (TopoDS_Shape*)(occ_lump2->get_TopoDS_Solid());
    3736                 :            :   
    3737                 :            :   //BRepAlgoAPI_Section calculates intersection between faces only.
    3738 [ #  # ][ #  # ]:          0 :   TopExp_Explorer Ex1, Ex2;
         [ #  # ][ #  # ]
    3739 [ #  # ][ #  # ]:          0 :   for (Ex1.Init(*shape1, TopAbs_FACE); Ex1.More(); Ex1.Next())  
         [ #  # ][ #  # ]
    3740                 :            :     {
    3741 [ #  # ][ #  # ]:          0 :       for (Ex2.Init(*shape2, TopAbs_FACE); Ex2.More(); Ex2.Next()) 
         [ #  # ][ #  # ]
    3742                 :            :         {
    3743 [ #  # ][ #  # ]:          0 :           BRepAlgoAPI_Section section(Ex1.Current(), Ex2.Current());
                 [ #  # ]
    3744 [ #  # ][ #  # ]:          0 :           if (section.HasGenerated())
    3745 [ #  # ][ #  # ]:          0 :             return CUBIT_TRUE;
    3746                 :          0 :         }
    3747                 :            :     }
    3748         [ #  # ]:          0 :   return CUBIT_FALSE;
    3749                 :            : }
    3750                 :            : 
    3751                 :      10365 : void OCCQueryEngine::copy_attributes(TopoDS_Shape& old_shape,
    3752                 :            :                                      TopoDS_Shape& new_shape)
    3753                 :            : {
    3754 [ +  - ][ +  + ]:      10365 :   if(new_shape.IsNull())
    3755                 :      10365 :     return;
    3756                 :            : 
    3757                 :            :   //update the attribute label tree
    3758         [ +  - ]:       9584 :   DLIList<CubitSimpleAttrib> list;
    3759         [ +  - ]:       9584 :   OCCAttribSet::get_attributes(old_shape, list);
    3760                 :            : 
    3761 [ +  - ][ +  + ]:      13879 :   for(int i = 0; i < list.size(); i ++)
    3762                 :            :   {
    3763         [ +  - ]:       4295 :     const CubitSimpleAttrib& s_attr = list.get_and_step();
    3764         [ +  - ]:       4295 :     TopAbs_ShapeEnum type = old_shape.ShapeType();
    3765 [ +  - ][ +  + ]:       4295 :     if(new_shape.ShapeType() < type)
    3766                 :            :     {
    3767         [ +  - ]:         66 :       TopTools_IndexedMapOfShape M;
    3768         [ +  - ]:         66 :       TopExp::MapShapes(new_shape, type, M); 
    3769 [ +  - ][ +  + ]:        198 :       for(int j = 1; j <= M.Extent() ; j++ )
    3770                 :            :       {
    3771 [ +  - ][ +  - ]:        132 :         TopoDS_Shape sub_shape = M(j);
    3772         [ +  - ]:        132 :         OCCAttribSet::append_attribute(s_attr, sub_shape); 
    3773 [ +  - ][ +  - ]:        198 :       }
    3774                 :            :     }
    3775                 :            :     else    
    3776         [ +  - ]:       4229 :       OCCAttribSet::append_attribute(s_attr, new_shape);
    3777         [ +  - ]:       9584 :   }
    3778                 :            : }
    3779                 :            : 
    3780                 :      30162 : int OCCQueryEngine::update_OCC_map(TopoDS_Shape& old_shape, 
    3781                 :            :                                    TopoDS_Shape& new_shape)
    3782                 :            : {
    3783 [ +  - ][ +  - ]:      55947 :   if (old_shape.IsNull() || !OCCMap->IsBound(old_shape) || 
         [ +  - ][ +  + ]
         [ -  + ][ +  + ]
    3784         [ +  - ]:      25785 :       old_shape.IsEqual(new_shape))
    3785                 :       4377 :     return -1;
    3786                 :            : 
    3787                 :            :   //update the attribute label tree
    3788         [ +  - ]:      25785 :   int current_id = OCCMap->Find(old_shape);
    3789                 :            :   std::map<int, TDF_Label>::iterator it_lab =
    3790         [ +  - ]:      25785 :           Shape_Label_Map->find(current_id);
    3791                 :      25785 :   CubitBoolean newlyBound = CUBIT_FALSE;
    3792         [ +  - ]:      25785 :   TopTools_IndexedMapOfShape M;
    3793 [ +  - ][ +  - ]:      51570 :   TopoDS_Shape new_subshape;
    3794         [ +  - ]:      25785 :   new_subshape.Nullify();
    3795                 :            : 
    3796 [ +  - ][ +  + ]:      25785 :   if(old_shape.ShapeType() == TopAbs_SOLID)
    3797         [ +  - ]:       1084 :     TopExp::MapShapes(new_shape, TopAbs_SOLID, M);
    3798 [ +  - ][ +  + ]:      24701 :   else if (old_shape.ShapeType() == TopAbs_SHELL)
    3799         [ +  - ]:       1072 :     TopExp::MapShapes(new_shape, TopAbs_SHELL, M);
    3800 [ +  - ][ +  + ]:      23629 :   else if (old_shape.ShapeType() == TopAbs_FACE)
    3801         [ +  - ]:       4851 :     TopExp::MapShapes(new_shape, TopAbs_FACE, M);
    3802                 :            : 
    3803 [ +  - ][ +  - ]:      25785 :   if(it_lab != Shape_Label_Map->end())
                 [ +  + ]
    3804                 :            :   {
    3805                 :       4306 :      CubitBoolean isNewShapeBound = CUBIT_FALSE;
    3806 [ +  - ][ +  - ]:      16443 :      if(old_shape.ShapeType() > TopAbs_COMPOUND && !new_shape.IsNull() &&
         [ +  + ][ +  + ]
                 [ -  + ]
    3807 [ +  - ][ +  - ]:      12137 :         new_shape.ShapeType() == TopAbs_COMPOUND && M.Extent() == 1)
         [ +  - ][ -  + ]
    3808                 :            :      {
    3809 [ #  # ][ #  # ]:          0 :        new_subshape = M(1); 
    3810         [ #  # ]:          0 :        isNewShapeBound = OCCMap->IsBound(new_subshape);
    3811         [ #  # ]:          0 :        copy_attributes(old_shape, new_subshape);
    3812         [ #  # ]:          0 :        Shape_Label_Map->erase(current_id);
    3813 [ #  # ][ #  # ]:          0 :        if(isNewShapeBound != OCCMap->IsBound(new_subshape)) 
    3814                 :          0 :          newlyBound = CUBIT_TRUE;
    3815                 :            :      }
    3816                 :            :      else
    3817                 :            :      {
    3818         [ +  - ]:       4306 :        isNewShapeBound = OCCMap->IsBound(new_shape);
    3819         [ +  - ]:       4306 :        copy_attributes(old_shape, new_shape);
    3820         [ +  - ]:       4306 :        Shape_Label_Map->erase(current_id);
    3821 [ +  - ][ +  + ]:       4306 :        if(isNewShapeBound != OCCMap->IsBound(new_shape))
    3822                 :       4306 :          newlyBound = CUBIT_TRUE; 
    3823                 :            :      }
    3824                 :            :   }
    3825                 :            : 
    3826                 :            :   //update CGM-OCC map
    3827                 :      25785 :   int k = current_id;
    3828 [ +  - ][ -  + ]:      25785 :   assert (k > 0 && k <= iTotalTBCreated);
    3829                 :            : 
    3830         [ +  - ]:      25785 :   std::map<int, TopologyBridge*>::iterator it = OccToCGM->find(k);
    3831                 :      25785 :   TopologyBridge* tb = NULL;
    3832 [ +  - ][ +  - ]:      25785 :   if (it != OccToCGM->end()) 
                 [ +  + ]
    3833         [ +  - ]:      25773 :      tb = (*it).second;
    3834                 :            : 
    3835                 :            :   //unless just changing location, if the TShape is going to change, remove
    3836                 :            :   //old curve_list .
    3837                 :      25785 :   CubitBoolean curve_removed = CUBIT_FALSE;
    3838 [ +  - ][ +  + ]:      25785 :   if(old_shape.ShapeType() == TopAbs_VERTEX && !new_shape.IsPartner(old_shape)) 
         [ +  - ][ +  + ]
                 [ +  + ]
    3839                 :            :   {
    3840                 :            :     //remove the curve list associated with the vertex too.
    3841         [ -  + ]:        902 :     GeometryEntity* ge =  CAST_TO(tb, GeometryEntity);
    3842         [ +  - ]:        902 :     if (ge)
    3843                 :            :     {
    3844         [ -  + ]:        902 :       OCCPoint* test_p = CAST_TO(ge, OCCPoint);
    3845         [ +  - ]:        902 :       if(test_p)
    3846                 :            :       {
    3847         [ +  - ]:        902 :         test_p->clear_curves();
    3848                 :        902 :         curve_removed = CUBIT_TRUE;
    3849                 :            :       }
    3850                 :            :     }
    3851                 :            :   }
    3852                 :            : 
    3853         [ +  - ]:      25785 :   OCCMap->UnBind(old_shape);
    3854 [ +  - ][ +  - ]:      25785 :   if(new_subshape.IsNull())
    3855         [ +  - ]:      25785 :     new_subshape = new_shape;
    3856                 :            : 
    3857 [ +  - ][ +  + ]:      52630 :   if (tb && TopAbs_SOLID == old_shape.ShapeType() && !new_shape.IsNull() && 
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
    3858 [ +  + ][ +  - ]:      52630 :        TopAbs_COMPOUND == new_shape.ShapeType() && M.Extent() > 1)
         [ +  - ][ +  - ]
    3859                 :            :   {
    3860         [ +  - ]:         66 :     OccToCGM->erase(k);
    3861         [ -  + ]:         66 :     GeometryEntity* ge =  CAST_TO(tb, GeometryEntity);
    3862         [ +  - ]:         66 :     if(ge)
    3863         [ +  - ]:         66 :       delete_solid_model_entities( ge, CUBIT_TRUE);
    3864                 :         66 :     return k;
    3865                 :            :   }
    3866                 :            : 
    3867 [ +  - ][ +  + ]:      56035 :   else if(tb && TopAbs_FACE == old_shape.ShapeType() && !new_shape.IsNull() &&
         [ +  - ][ +  + ]
         [ -  + ][ -  + ]
    3868 [ +  + ][ +  - ]:      56035 :        TopAbs_COMPOUND == new_shape.ShapeType() && M.Extent() > 1)
         [ #  # ][ #  # ]
    3869                 :            :   {
    3870         [ #  # ]:          0 :     GeometryEntity* ge =  CAST_TO(tb, GeometryEntity);
    3871         [ #  # ]:          0 :     if(ge)
    3872                 :            :     {
    3873         [ #  # ]:          0 :       OCCSurface *face = CAST_TO(ge, OCCSurface);
    3874         [ #  # ]:          0 :       OCCShell* shell = face->my_shell();
    3875         [ #  # ]:          0 :       if (shell)
    3876                 :            :       {
    3877         [ #  # ]:          0 :         TopoDS_Shell* shape = shell->get_TopoDS_Shell();
    3878         [ #  # ]:          0 :         assert(!shape );
    3879         [ #  # ]:          0 :         if (shape) {
    3880 [ #  # ][ #  # ]:          0 :           PRINT_ERROR("Unexpected non-NULL TopoDS_Shell pointer.\n");
         [ #  # ][ #  # ]
    3881                 :          0 :           return -1;
    3882                 :            :         }
    3883                 :            :       }
    3884         [ #  # ]:          0 :       OCCLump* lump = face->my_lump();
    3885         [ #  # ]:          0 :       if(lump)
    3886                 :            :       {
    3887         [ #  # ]:          0 :         TopoDS_Solid* shape = lump->get_TopoDS_Solid();
    3888         [ #  # ]:          0 :         assert(!shape );
    3889         [ #  # ]:          0 :         if (shape) {
    3890 [ #  # ][ #  # ]:          0 :           PRINT_ERROR("Unexpected non-NULL TopoDS_Solid pointer.\n");
         [ #  # ][ #  # ]
    3891                 :          0 :           return -1;
    3892                 :            :         }
    3893 [ #  # ][ #  # ]:          0 :         delete lump;
    3894                 :            :       }
    3895         [ #  # ]:          0 :       OCCBody* body = face->my_body();
    3896         [ #  # ]:          0 :       if (body)
    3897 [ #  # ][ #  # ]:          0 :         delete body;
    3898                 :            :       
    3899         [ #  # ]:          0 :       delete_solid_model_entities(ge, CUBIT_TRUE); 
    3900         [ #  # ]:          0 :       if(shell)
    3901 [ #  # ][ #  # ]:          0 :         delete shell;
    3902                 :            :     }
    3903                 :          0 :     return k;
    3904                 :            :   }
    3905                 :            : 
    3906 [ +  + ][ +  - ]:     104228 :   else if (tb && ((!new_subshape.IsNull() && !old_shape.IsSame(new_subshape)&&
         [ +  + ][ +  - ]
         [ +  - ][ +  + ]
                 [ +  + ]
    3907 [ +  - ][ +  + ]:      27083 :         OCCMap->IsBound(new_subshape) && 
    3908 [ +  - ][ +  - ]:      57415 :         OccToCGM->find(OCCMap->Find(new_subshape))!= OccToCGM->end()) || 
         [ +  - ][ +  - ]
         [ +  + ][ +  + ]
                 [ +  + ]
           [ #  #  #  # ]
    3909         [ +  - ]:      25168 :         new_subshape.IsNull()))
    3910                 :            :   //already has a TB built on new_shape
    3911                 :            :   {
    3912                 :            :     //delete the second TB corresponding to old_shape
    3913         [ +  - ]:       2427 :     OccToCGM->erase(k);
    3914         [ -  + ]:       2427 :     GeometryEntity* ge =  CAST_TO(tb, GeometryEntity);
    3915         [ +  + ]:       2427 :     if(ge)
    3916                 :            :     {
    3917                 :            :       //PRINT_INFO("TB: %p\n",ge);
    3918         [ -  + ]:       1661 :       Lump* lump = CAST_TO(ge, Lump);
    3919         [ +  + ]:       1661 :       if(lump)
    3920                 :            :       {
    3921 [ -  + ][ +  - ]:         55 :         BodySM* body = CAST_TO(lump,OCCLump)->get_body();
    3922         [ +  - ]:         55 :         if(body)
    3923                 :            :         {
    3924                 :            :           //OCCBody* occ_body = CAST_TO(body, OCCBody);
    3925                 :            :           //TopoDS_Compound* pshape = occ_body->get_TopoDS_Shape(); 
    3926                 :            :           //if(!pshape || pshape->IsNull())
    3927         [ +  - ]:         55 :           delete_solid_model_entities(body);
    3928                 :            :         }
    3929                 :            :       }
    3930                 :            : 
    3931                 :            :       else
    3932                 :            :       {
    3933         [ -  + ]:       1606 :         OCCPoint* test_p = CAST_TO(ge, OCCPoint);
    3934         [ +  + ]:       1606 :         if(test_p)
    3935         [ +  - ]:        528 :           test_p->clear_curves();
    3936         [ +  - ]:       1661 :         delete_solid_model_entities( ge, CUBIT_FALSE );
    3937                 :            :       }
    3938                 :            :     }
    3939                 :            : 
    3940                 :            :     else
    3941                 :            :     {
    3942         [ -  + ]:        766 :       ShellSM * shell = CAST_TO(tb, ShellSM);
    3943         [ +  + ]:        766 :       if(shell)
    3944                 :            :       {
    3945         [ +  - ]:        121 :         DLIList<OCCSurface*> memberSurfaces;
    3946         [ -  + ]:        121 :         OCCShell* occShell = CAST_TO(shell, OCCShell);
    3947 [ +  - ][ +  - ]:        121 :         memberSurfaces = occShell->getMemberSurfaces();
                 [ +  - ]
    3948 [ +  - ][ +  + ]:        748 :         while (memberSurfaces.size())
    3949                 :            :         {
    3950         [ +  - ]:        627 :           OCCSurface* memberSurf = memberSurfaces.pop();
    3951 [ +  - ][ +  + ]:        627 :           if (SurfaceList->is_in_list(memberSurf))
    3952                 :            :             // if the surface has not been unhooked and deleted
    3953         [ +  - ]:        627 :             memberSurf->set_shell((OCCShell*)NULL);
    3954                 :            :         }
    3955                 :            : 
    3956 [ -  + ][ +  - ]:        121 :         OCCLump* lump = CAST_TO(shell, OCCShell)->my_lump();
    3957 [ +  - ][ +  - ]:        242 :         if(lump && (lump->get_TopoDS_Solid() == NULL || 
         [ +  - ][ -  + ]
                 [ -  + ]
    3958 [ +  - ][ +  - ]:        121 :            !OCCMap->IsBound(*(lump->get_TopoDS_Solid()))))
    3959                 :            :         {
    3960 [ #  # ][ #  # ]:          0 :           delete CAST_TO(shell, OCCShell)->my_body();
         [ #  # ][ #  # ]
    3961 [ #  # ][ #  # ]:          0 :           delete lump;
    3962                 :            :         }
    3963         [ +  - ]:        121 :         unhook_ShellSM_from_OCC(shell);
    3964 [ +  - ][ +  - ]:        121 :         delete shell;
    3965         [ +  - ]:        121 :         return k;
    3966                 :            :       }
    3967         [ -  + ]:        645 :       LoopSM* loop = CAST_TO(tb, LoopSM);
    3968         [ +  - ]:        645 :       if(loop)
    3969                 :            :       {
    3970         [ +  - ]:        645 :          DLIList<OCCCoEdge*> children;
    3971 [ -  + ][ +  - ]:        645 :          children = CAST_TO(loop, OCCLoop)->coedges();
         [ +  - ][ +  - ]
    3972 [ +  - ][ +  + ]:       1795 :          while(children.size())
    3973                 :            :          {
    3974         [ +  - ]:       1150 :            OCCCoEdge* coedge = children.pop();
    3975 [ -  + ][ +  - ]:       1150 :            CAST_TO(coedge->curve(), OCCCurve)->remove_loop(CAST_TO(loop, OCCLoop));
         [ -  + ][ +  - ]
    3976 [ +  - ][ +  - ]:       1150 :            delete (OCCCoEdge*)coedge;
    3977                 :            :          }
    3978         [ +  - ]:        645 :          unhook_LoopSM_from_OCC(loop);
    3979 [ +  - ][ +  - ]:        645 :          delete loop;
    3980         [ +  - ]:       2306 :          return k;
    3981                 :            :       }
    3982                 :            :     }
    3983                 :            :   }
    3984                 :            : 
    3985                 :            :   else
    3986                 :            :   {   
    3987                 :            :     //if the new_shape is bounded in copy_attribute, unbind it and rebind to 
    3988                 :            :     //the old k
    3989         [ +  + ]:      23292 :     if(newlyBound)
    3990                 :            :     {
    3991         [ +  - ]:       2725 :       int new_k = OCCMap->Find(new_subshape);
    3992         [ +  - ]:       2725 :       TDF_Label aLabel;
    3993                 :       2725 :       CubitBoolean found = CUBIT_FALSE;
    3994         [ +  - ]:       2725 :       OCCAttribSet::FindShape(new_subshape, aLabel, found);
    3995         [ -  + ]:       2725 :       assert(found);
    3996         [ +  - ]:       2725 :       Shape_Label_Map->erase(new_k);
    3997 [ +  - ][ +  - ]:       2725 :       Shape_Label_Map->insert(labType(k, aLabel)); 
    3998         [ +  - ]:       2725 :       OCCMap->UnBind(new_subshape);
    3999                 :            :     }      
    4000 [ +  - ][ +  + ]:      23292 :     if(!OCCMap->IsBound(new_subshape))
    4001         [ +  - ]:      23280 :       OCCMap->Bind(new_subshape, k);
    4002 [ +  + ][ +  + ]:      23292 :     if(tb && !curve_removed)
    4003         [ +  - ]:      22906 :       set_TopoDS_Shape(tb, new_subshape);
    4004                 :            :   }
    4005         [ +  - ]:      55115 :   return k;
    4006                 :            : }
    4007                 :            : 
    4008                 :      60295 : void OCCQueryEngine::unhook_coedges_of_a_curve(OCCCurve* curve,
    4009                 :            :                                                OCCLoop* loop)const 
    4010                 :            : {
    4011         [ +  - ]:      60295 :   DLIList<OCCCoEdge*> coedges;
    4012 [ +  - ][ +  - ]:     120590 :   DLIList<OCCCoEdge *> children ;
    4013         [ +  + ]:      60295 :   if (loop != NULL)
    4014 [ +  - ][ +  - ]:      38322 :     children = loop->coedges();
                 [ +  - ]
    4015                 :            :   else
    4016                 :            :   {
    4017         [ +  - ]:      21973 :     DLIList<OCCLoop*> loops;
    4018 [ +  - ][ +  - ]:      21973 :     loops = curve->loops();
                 [ +  - ]
    4019 [ +  - ][ +  + ]:      23535 :     for (int i = 0; i < loops.size(); i ++)
    4020 [ +  - ][ +  - ]:      23535 :       children += loops.get_and_step()->coedges();
         [ +  - ][ +  - ]
                 [ +  - ]
    4021                 :            :   } 
    4022 [ +  - ][ +  + ]:     176369 :   for(int j = 0; j < children.size(); j++)
    4023                 :            :   {
    4024         [ +  - ]:     116074 :      OCCCoEdge* coedge = children.get_and_step();
    4025 [ +  - ][ +  + ]:     116074 :      if (coedge->curve() == curve)
    4026         [ +  - ]:      40679 :        coedges.append(coedge);
    4027                 :            :   }
    4028 [ +  - ][ +  - ]:     120590 :   unhook_CoEdges_from_OCC(coedges);
    4029                 :      60295 : }
    4030                 :            : 
    4031                 :      22906 : void OCCQueryEngine::set_TopoDS_Shape(TopologyBridge* tb,
    4032                 :            :                                       TopoDS_Shape& shape)
    4033                 :            : {
    4034         [ -  + ]:      22906 :   BodySM* body = CAST_TO(tb, BodySM);
    4035         [ -  + ]:      22906 :   if(body)
    4036         [ #  # ]:          0 :     return CAST_TO(body, OCCBody)->set_TopoDS_Shape(TopoDS::Compound(shape));
    4037                 :            : 
    4038         [ -  + ]:      22906 :   Lump* lump = CAST_TO(tb, Lump);
    4039         [ +  + ]:      22906 :   if(lump)
    4040 [ -  + ][ +  - ]:        951 :     return CAST_TO(lump, OCCLump)->set_TopoDS_Solid(TopoDS::Solid(shape));
    4041                 :            : 
    4042         [ -  + ]:      21955 :   ShellSM* shell = CAST_TO(tb, ShellSM);
    4043         [ +  + ]:      21955 :   if(shell)
    4044 [ -  + ][ +  - ]:        951 :     return CAST_TO(shell, OCCShell)->set_TopoDS_Shell(TopoDS::Shell(shape));
    4045                 :            : 
    4046         [ -  + ]:      21004 :   Surface* surface = CAST_TO(tb, Surface);
    4047         [ +  + ]:      21004 :   if (surface)
    4048         [ -  + ]:       4609 :     return CAST_TO(surface, OCCSurface)->set_TopoDS_Face(TopoDS::Face(shape));
    4049                 :            : 
    4050         [ -  + ]:      16395 :   LoopSM* loop =  CAST_TO(tb, LoopSM);
    4051         [ +  + ]:      16395 :   if(loop)
    4052 [ -  + ][ +  - ]:       4518 :     return CAST_TO(loop, OCCLoop)->set_TopoDS_Wire(TopoDS::Wire(shape));
    4053                 :            : 
    4054         [ -  + ]:      11877 :   Curve* curve = CAST_TO(tb, Curve);
    4055         [ +  + ]:      11877 :   if (curve)
    4056 [ -  + ][ +  - ]:       7457 :     return CAST_TO(curve, OCCCurve)->set_TopoDS_Edge(TopoDS::Edge(shape));
    4057                 :            : 
    4058         [ -  + ]:       4420 :   TBPoint* point = CAST_TO(tb, TBPoint);
    4059         [ +  - ]:       4420 :   if(point)
    4060 [ -  + ][ +  - ]:      22906 :     return CAST_TO(point, OCCPoint)->set_TopoDS_Vertex(TopoDS::Vertex(shape));
    4061                 :            :   
    4062                 :            : }
    4063                 :            : 
    4064                 :            : //Added by Jane Hu on 06/17/11
    4065                 :          0 : void OCCQueryEngine::bound_TopoDS_Shape(const TopoDS_Shape & aShape)
    4066                 :            : {
    4067                 :          0 :   (iTotalTBCreated)++;
    4068   [ #  #  #  #  :          0 :   switch (aShape.ShapeType())
             #  #  #  # ]
    4069                 :            :   {
    4070                 :            :     case TopAbs_COMPOUND:
    4071                 :          0 :       OCCMap->Bind(TopoDS::Compound(aShape), iTotalTBCreated); 
    4072                 :          0 :       break;
    4073                 :            :     case TopAbs_SOLID:
    4074                 :          0 :       OCCMap->Bind(TopoDS::Solid(aShape), iTotalTBCreated);
    4075                 :          0 :       break;
    4076                 :            :     case TopAbs_SHELL:
    4077                 :          0 :       OCCMap->Bind(TopoDS::Shell(aShape), iTotalTBCreated);
    4078                 :          0 :       break;
    4079                 :            :     case TopAbs_FACE: 
    4080                 :          0 :       OCCMap->Bind(TopoDS::Face(aShape), iTotalTBCreated);
    4081                 :          0 :       break;
    4082                 :            :     case TopAbs_WIRE:
    4083                 :          0 :       OCCMap->Bind(TopoDS::Wire(aShape), iTotalTBCreated);
    4084                 :          0 :       break;
    4085                 :            :     case TopAbs_EDGE:
    4086                 :          0 :       OCCMap->Bind(TopoDS::Edge(aShape), iTotalTBCreated);
    4087                 :          0 :       break;
    4088                 :            :     case TopAbs_VERTEX:
    4089                 :          0 :       OCCMap->Bind(TopoDS::Vertex(aShape), iTotalTBCreated);
    4090                 :          0 :       break;
    4091                 :            : 
    4092                 :            :     default:
    4093                 :          0 :       (iTotalTBCreated)--;
    4094                 :            :   }
    4095 [ +  - ][ +  - ]:       6364 : }
    4096                 :            : //EOF

Generated by: LCOV version 1.11