LCOV - code coverage report
Current view: top level - geom/OCC - OCCDrawTool.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 1 119 0.8 %
Date: 2020-06-30 00:58:45 Functions: 2 11 18.2 %
Branches: 2 244 0.8 %

           Branch data     Line data    Source code
       1                 :            : //- Class:       OCCDrawTool
       2                 :            : //- Description: Functions to draw OCC geometry (useful for debugging or
       3                 :            : //-              in previewing operations for the user)
       4                 :            : // 
       5                 :            : //- Author: Jane Hu       
       6                 :            : 
       7                 :            : // ********** BEGIN OCC INCLUDES             **********
       8                 :            : #include "gp_Pnt.hxx"
       9                 :            : #include "TopoDS.hxx"
      10                 :            : #include "TopoDS_Face.hxx"
      11                 :            : #include "TopoDS_Shape.hxx"
      12                 :            : #include "TopoDS_Edge.hxx"
      13                 :            : #include "TopoDS_Vertex.hxx"
      14                 :            : #include "TopoDS_CompSolid.hxx"
      15                 :            : #include "TopoDS_Compound.hxx"
      16                 :            : #include "TopoDS_Solid.hxx"
      17                 :            : #include "TopoDS_Shell.hxx"
      18                 :            : #include "TopTools_IndexedMapOfShape.hxx"
      19                 :            : #include "TopExp.hxx"
      20                 :            : #include "BRep_Tool.hxx"
      21                 :            : #include "GProp_GProps.hxx"
      22                 :            : #include "BRepGProp.hxx"
      23                 :            : #include <TopExp_Explorer.hxx>
      24                 :            : // ********** END OCC INCLUDES               **********
      25                 :            : 
      26                 :            : // ********** BEGIN CUBIT INCLUDES            **********
      27                 :            : #include "OCCDrawTool.hpp"
      28                 :            : #include "OCCSurface.hpp"
      29                 :            : #include "OCCCurve.hpp"
      30                 :            : #include "Lump.hpp"
      31                 :            : #include "Surface.hpp"
      32                 :            : #include "Curve.hpp"
      33                 :            : #include "Point.hpp"
      34                 :            : #include "OCCQueryEngine.hpp"
      35                 :            : #include "DLIList.hpp"
      36                 :            : #include "GMem.hpp"
      37                 :            : #include "GfxPreview.hpp"
      38                 :            : // ********** END CUBIT INCLUDES              **********
      39                 :            : 
      40                 :            : OCCDrawTool* OCCDrawTool::instance_ = 0;
      41                 :            : 
      42                 :            : // Method: instance
      43                 :            : // provides access to the unique model for this execution.
      44                 :            : // sets up this instance on first access
      45                 :          0 : OCCDrawTool* OCCDrawTool::instance()
      46                 :            : {
      47         [ #  # ]:          0 :   if (instance_ == 0) {
      48         [ #  # ]:          0 :     instance_ = new OCCDrawTool();
      49                 :            :   }
      50                 :          0 :   return instance_;
      51                 :            : }
      52                 :            : 
      53                 :          0 : OCCDrawTool::OCCDrawTool() 
      54                 :            : { 
      55                 :          0 : }
      56                 :            : 
      57                 :          0 : OCCDrawTool::~OCCDrawTool()
      58                 :            : {
      59                 :          0 : }
      60                 :            : 
      61                 :            : CubitStatus
      62                 :          0 : OCCDrawTool::draw_TopoDS_Shape( TopoDS_Shape *shape, int color, 
      63                 :            :                                  CubitBoolean tessellate,
      64                 :            :                                  CubitBoolean flush )
      65                 :            : {
      66 [ #  # ][ #  # ]:          0 :   if( shape->ShapeType() == TopAbs_COMPOUND ||
      67 [ #  # ][ #  # ]:          0 :       shape->ShapeType() == TopAbs_SOLID ||
      68                 :          0 :       shape->ShapeType() == TopAbs_SHELL )
      69                 :            :   {
      70         [ #  # ]:          0 :     DLIList<TopoDS_Face*> Face_list;
      71 [ #  # ][ #  # ]:          0 :     TopTools_IndexedMapOfShape M;
      72         [ #  # ]:          0 :     TopExp::MapShapes(*shape, TopAbs_FACE, M);
      73                 :            :     int ii;
      74 [ #  # ][ #  # ]:          0 :     for (ii=1; ii<=M.Extent(); ii++) 
      75                 :            :     {
      76                 :            :      //     TopologyBridge *face = OCCQueryEngine::instance()->occ_to_cgm(M(ii));
      77                 :            :      //     OCCSurface *occ_face = CAST_TO(face, OCCSurface);
      78                 :            :      //     Face_list.append_unique(occ_face->get_TopoDS_Face());
      79 [ #  # ][ #  # ]:          0 :       Face_list.append_unique( const_cast<TopoDS_Face*>(&(TopoDS::Face(M(ii)))));
                 [ #  # ]
      80                 :            :     } 
      81                 :            :     int i;
      82 [ #  # ][ #  # ]:          0 :     for( i=Face_list.size(); i--; )
      83 [ #  # ][ #  # ]:          0 :       draw_FACE( Face_list.get_and_step(), color, tessellate );
      84         [ #  # ]:          0 :     if( flush )
      85         [ #  # ]:          0 :       GfxPreview::flush();
      86         [ #  # ]:          0 :     return CUBIT_SUCCESS;
      87                 :            :   }
      88         [ #  # ]:          0 :   else if (shape->ShapeType() == TopAbs_FACE )
      89                 :            :   {
      90                 :          0 :     return draw_FACE((TopoDS_Face *)shape , color, tessellate, flush );
      91                 :            :   }
      92         [ #  # ]:          0 :   else if (shape->ShapeType() == TopAbs_WIRE )
      93                 :            :   {
      94         [ #  # ]:          0 :     DLIList<TopoDS_Edge*> EDGE_list;
      95 [ #  # ][ #  # ]:          0 :     TopTools_IndexedMapOfShape M;
      96         [ #  # ]:          0 :     TopExp::MapShapes(*shape, TopAbs_EDGE, M);
      97                 :            :     int ii;
      98 [ #  # ][ #  # ]:          0 :     for (ii=1; ii<=M.Extent(); ii++)
      99                 :            :     {
     100 [ #  # ][ #  # ]:          0 :           EDGE_list.append_unique( const_cast<TopoDS_Edge*>(&(TopoDS::Edge(M(ii)))));
                 [ #  # ]
     101                 :            :     }
     102                 :            :     int i;
     103 [ #  # ][ #  # ]:          0 :     for( i=EDGE_list.size(); i--; )
     104 [ #  # ][ #  # ]:          0 :       draw_EDGE( EDGE_list.get_and_step(), color );
     105         [ #  # ]:          0 :     if( flush )
     106         [ #  # ]:          0 :       GfxPreview::flush();
     107         [ #  # ]:          0 :     return CUBIT_SUCCESS;
     108                 :            :   }
     109         [ #  # ]:          0 :   else if (shape->ShapeType() == TopAbs_EDGE )
     110                 :            :   {
     111                 :          0 :     return draw_EDGE( (TopoDS_Edge*)shape, color, flush );
     112                 :            :   }
     113         [ #  # ]:          0 :   else if (shape->ShapeType() == TopAbs_VERTEX )
     114                 :            :   {
     115                 :          0 :     return draw_VERTEX( (TopoDS_Vertex*)shape, color, flush );
     116                 :            :   }
     117                 :            :   else
     118                 :            :   {
     119 [ #  # ][ #  # ]:          0 :     PRINT_ERROR( "Unsupported entity type specified - cannot draw\n" );
     120                 :          0 :     return CUBIT_FAILURE;
     121                 :            :   }
     122                 :            : 
     123                 :            :   return CUBIT_SUCCESS;
     124                 :            : }
     125                 :            : 
     126                 :            : CubitStatus
     127                 :          0 : OCCDrawTool::draw_EDGE( TopoDS_Edge *EDGE_ptr, int color, CubitBoolean flush )
     128                 :            : {
     129                 :            :   //OCCQueryEngine *OQE = OCCQueryEngine::instance();
     130                 :            :   //Curve *curve_ptr = OQE->populate_topology_bridge( *EDGE_ptr, CUBIT_TRUE );
     131                 :            :   //CubitStatus stat;
     132                 :            :   //stat = draw_curve(curve_ptr, color, flush);
     133                 :            : 
     134         [ #  # ]:          0 :   GMem g_mem;
     135         [ #  # ]:          0 :   OCCQueryEngine *OQE = OCCQueryEngine::instance();
     136         [ #  # ]:          0 :   double tol = OQE->get_sme_resabs_tolerance();
     137                 :            : 
     138         [ #  # ]:          0 :   GProp_GProps myProps;
     139         [ #  # ]:          0 :   BRepGProp::LinearProperties(*EDGE_ptr, myProps);
     140 [ #  # ][ #  # ]:          0 :   if( myProps.Mass() < tol)
     141                 :          0 :     return CUBIT_SUCCESS;
     142                 :            :   // get the graphics
     143                 :            :   CubitStatus stat;
     144         [ #  # ]:          0 :   stat = OQE->get_graphics( EDGE_ptr, &g_mem );
     145                 :            : 
     146         [ #  # ]:          0 :   if (stat==CUBIT_FAILURE )
     147                 :            :   {
     148 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("Unable to tessellate a curve for display\n" );
         [ #  # ][ #  # ]
     149                 :          0 :     return CUBIT_FAILURE;
     150                 :            :   }
     151                 :            :   else
     152                 :            :   {
     153                 :            :     // Draw the polyline
     154 [ #  # ][ #  # ]:          0 :     GfxPreview::draw_polyline( g_mem.point_list(), g_mem.pointListCount, color );
     155                 :            :   }
     156                 :            : 
     157         [ #  # ]:          0 :   if( flush )
     158         [ #  # ]:          0 :     GfxPreview::flush();
     159         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     160                 :            : }
     161                 :            : 
     162                 :            : CubitStatus 
     163                 :          0 : OCCDrawTool::draw_surface( Surface *surface, int color, CubitBoolean tessellate ,CubitBoolean flush)
     164                 :            : {
     165                 :          0 :   OCCQueryEngine *OQE = OCCQueryEngine::instance();
     166         [ #  # ]:          0 :   if( tessellate )
     167                 :            :   {
     168         [ #  # ]:          0 :     GMem g_mem ;
     169         [ #  # ]:          0 :     OQE->get_graphics( surface, &g_mem);
     170                 :            : 
     171                 :            :     // Draw the triangles
     172                 :            :     GPoint p[3];
     173         [ #  # ]:          0 :     GPoint* plist = g_mem.point_list();
     174         [ #  # ]:          0 :     int* facet_list = g_mem.facet_list();
     175                 :          0 :     int i, c = 0;
     176 [ #  # ][ #  # ]:          0 :     for( i=0; i<g_mem.facet_list_size(); i++ )
     177                 :            :     {
     178                 :          0 :       p[0] = plist[facet_list[++c]];
     179                 :          0 :       p[2] = plist[facet_list[++c]];
     180                 :          0 :       p[1] = plist[facet_list[++c]];
     181                 :          0 :       c++;
     182         [ #  # ]:          0 :       GfxPreview::draw_tri( p, color );
     183         [ #  # ]:          0 :     }
     184                 :            :   }
     185                 :            :   else
     186                 :            :   {
     187                 :            :     // Draw curves
     188         [ #  # ]:          0 :     DLIList<OCCCurve*> curve_list;
     189 [ #  # ][ #  # ]:          0 :     CAST_TO(surface, OCCSurface)->get_curves(curve_list);
     190                 :            :     int i;
     191 [ #  # ][ #  # ]:          0 :     for( i=curve_list.size(); i--; )
     192 [ #  # ][ #  # ]:          0 :       draw_curve( (Curve*)(curve_list.get_and_step()), color, flush );
                 [ #  # ]
     193                 :            :   }
     194                 :            : 
     195         [ #  # ]:          0 :   if( flush )
     196                 :          0 :     GfxPreview::flush();
     197                 :          0 :   return CUBIT_SUCCESS;
     198                 :            : }
     199                 :            : 
     200                 :            : CubitStatus 
     201                 :          0 : OCCDrawTool::draw_curve( Curve *curve, int color , CubitBoolean flush )
     202                 :            : {
     203         [ #  # ]:          0 :   GMem g_mem;
     204         [ #  # ]:          0 :   OCCQueryEngine *OQE = OCCQueryEngine::instance();
     205         [ #  # ]:          0 :   double tol = OQE->get_sme_resabs_tolerance();
     206 [ #  # ][ #  # ]:          0 :   if (curve->get_arc_length() < tol)
     207                 :          0 :     return CUBIT_SUCCESS;
     208                 :            :   // get the graphics
     209                 :            :   CubitStatus stat;
     210         [ #  # ]:          0 :   stat = OQE->get_graphics( curve, &g_mem );
     211                 :            : 
     212         [ #  # ]:          0 :   if (stat==CUBIT_FAILURE )
     213                 :            :   {
     214 [ #  # ][ #  # ]:          0 :     PRINT_ERROR("Unable to tessellate a curve for display\n" );
         [ #  # ][ #  # ]
     215                 :          0 :     return CUBIT_FAILURE;
     216                 :            :   }
     217                 :            :   else
     218                 :            :   {
     219                 :            :     // Draw the polyline
     220 [ #  # ][ #  # ]:          0 :     GfxPreview::draw_polyline( g_mem.point_list(), g_mem.pointListCount, color );
     221                 :            :   }
     222                 :            : 
     223         [ #  # ]:          0 :   if( flush )
     224         [ #  # ]:          0 :     GfxPreview::flush();
     225         [ #  # ]:          0 :   return CUBIT_SUCCESS;
     226                 :            : }
     227                 :            : 
     228                 :            : CubitStatus
     229                 :          0 : OCCDrawTool::draw_FACE( TopoDS_Face *FACE_ptr, int color, 
     230                 :            :                         CubitBoolean tessellate, 
     231                 :            :                         CubitBoolean flush )
     232                 :            : {
     233                 :            :   
     234                 :            :   //OCCQueryEngine *OQE = OCCQueryEngine::instance();
     235                 :            :   //Surface *surf_ptr = OQE->populate_topology_bridge( *FACE_ptr );
     236                 :            : 
     237                 :            :   //CubitStatus stat;
     238                 :            :   //stat = draw_face(surf_ptr, color, tessellate, flush);
     239                 :            : 
     240                 :          0 :   OCCQueryEngine *OQE = OCCQueryEngine::instance();
     241         [ #  # ]:          0 :   if( tessellate )
     242                 :            :   {
     243         [ #  # ]:          0 :     GMem g_mem ;
     244         [ #  # ]:          0 :     OQE->get_graphics( FACE_ptr, &g_mem);
     245                 :            : 
     246                 :            :     // Draw the triangles
     247                 :            :     GPoint p[3];
     248         [ #  # ]:          0 :     GPoint* plist = g_mem.point_list();
     249         [ #  # ]:          0 :     int* facet_list = g_mem.facet_list();
     250                 :          0 :     int i, c = 0;
     251 [ #  # ][ #  # ]:          0 :     for( i=0; i<g_mem.facet_list_size(); i++ )
     252                 :            :     {
     253                 :          0 :       p[0] = plist[facet_list[++c]];
     254                 :          0 :       p[2] = plist[facet_list[++c]];
     255                 :          0 :       p[1] = plist[facet_list[++c]];
     256                 :          0 :       c++;
     257         [ #  # ]:          0 :       GfxPreview::draw_tri( p, color );
     258         [ #  # ]:          0 :     }
     259                 :            :   }
     260                 :            : 
     261                 :            :   else
     262                 :            :   {
     263         [ #  # ]:          0 :     TopExp_Explorer Bx;    
     264 [ #  # ][ #  # ]:          0 :     for(Bx.Init(*FACE_ptr, TopAbs_EDGE); Bx.More(); Bx.Next())
         [ #  # ][ #  # ]
     265 [ #  # ][ #  # ]:          0 :       draw_EDGE( const_cast<TopoDS_Edge*>(&(TopoDS::Edge( Bx.Current() ))), color, flush );   
         [ #  # ][ #  # ]
     266                 :            :   }
     267                 :            : 
     268         [ #  # ]:          0 :   if( flush )
     269                 :          0 :     GfxPreview::flush();
     270                 :          0 :   return CUBIT_SUCCESS;
     271                 :            : }
     272                 :            : 
     273                 :            : CubitStatus
     274                 :          0 : OCCDrawTool::draw_VERTEX( TopoDS_Vertex *VERTEX_ptr, int color, CubitBoolean flush )
     275                 :            : {
     276         [ #  # ]:          0 :   gp_Pnt pt = BRep_Tool::Pnt(*VERTEX_ptr);
     277 [ #  # ][ #  # ]:          0 :   GfxPreview::draw_point( pt.X(), pt.Y(), pt.Z(), color );
         [ #  # ][ #  # ]
     278                 :          0 :   return CUBIT_SUCCESS;
     279 [ +  - ][ +  - ]:       6364 : }

Generated by: LCOV version 1.11