LCOV - code coverage report
Current view: top level - algs/meshkit - TransformBase.hpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 40 41 97.6 %
Date: 2020-07-01 15:24:36 Functions: 20 23 87.0 %
Branches: 33 70 47.1 %

           Branch data     Line data    Source code
       1                 :            : #ifndef MESHKIT_TRANSFORMBASE_HPP
       2                 :            : #define MESHKIT_TRANSFORMBASE_HPP
       3                 :            : 
       4                 :            : #include "meshkit/Error.hpp"
       5                 :            : #include "meshkit/iMesh.hpp"
       6                 :            : #include "meshkit/Matrix.hpp"
       7                 :            : #include <vector>
       8                 :            : 
       9                 :            : namespace MeshKit {
      10                 :         54 :   inline double * vec2ptr(std::vector< Vector<3> > &v) {
      11                 :         54 :     return reinterpret_cast<double *>(&v[0]);
      12                 :            :   }
      13                 :            : 
      14                 :            :   namespace Copy {
      15                 :            :     /** \class Transform Transform.hpp "meshkit/Transform.hpp"
      16                 :            :      * \brief A base class for transforming copied meshes
      17                 :            :      *
      18                 :            :      * This is the common base class used to transform vertices in copied
      19                 :            :      * meshes. Subclasses of this type implement particular transformation
      20                 :            :      * functions, e.g. translation or rotation.
      21                 :            :      */
      22                 :         12 :     class Transform
      23                 :            :     {
      24                 :            :     public:
      25                 :            :       /** \brief Transform the selected vertices
      26                 :            :        * \param mesh the iMesh implementation holding the vertices
      27                 :            :        * \param src an array of the source vertices
      28                 :            :        * \param dest an array of the destination vertices
      29                 :            :        */
      30                 :            :       virtual void transform(iMesh *mesh,
      31                 :            :                              const std::vector<iMesh::EntityHandle> &src,
      32                 :            :                              std::vector<iMesh::EntityHandle> &dest) const = 0;
      33                 :            : 
      34                 :            :       /** \brief Clone this transform object
      35                 :            :        */
      36                 :            :       virtual Transform * clone() const = 0;
      37                 :            : 
      38                 :            :         /** \brief Virtual destructor
      39                 :            :          */
      40                 :         12 :         virtual ~Transform ()
      41                 :         12 :         {
      42         [ -  + ]:         12 :         }
      43                 :            :     };
      44                 :            : 
      45                 :            :     /** \class BasicTransform Transform.hpp "meshkit/Transform.hpp"
      46                 :            :      * \brief A utility class for transforming copied meshes
      47                 :            :      *
      48                 :            :      * This class template simplifies the creation of new transformation
      49                 :            :      * functions. To use this, create a new class and inherit from this one,
      50                 :            :      * passing the new class name as the template parameter (the curiously-
      51                 :            :      * recurring template pattern).
      52                 :            :      *
      53                 :            :      * Example:
      54                 :            :      *    class Example : public BasicTransform<Example>
      55                 :            :      *    {
      56                 :            :      *      friend class BasicTransform<Example>;
      57                 :            :      *    public:
      58                 :            :      *      Example() { ... }
      59                 :            :      *    protected:
      60                 :            :      *      void transform_one(Vector<3> &coords) const { ... }
      61                 :            :      *    };
      62                 :            :      */
      63                 :            :     template<typename T>
      64         [ -  + ]:         32 :     class BasicTransform : public Transform
      65                 :            :     {
      66                 :            :     public:
      67                 :            :       /** \brief Transform the selected vertices
      68                 :            :        * \param mesh the iMesh implementation holding the vertices
      69                 :            :        * \param src an array of the source vertices
      70                 :            :        * \param dest an array of the destination vertices
      71                 :            :        */
      72                 :          4 :       virtual void transform(iMesh *mesh,
      73                 :            :                              const std::vector<iMesh::EntityHandle> &src,
      74                 :            :                              std::vector<iMesh::EntityHandle> &dest) const
      75                 :            :       {
      76         [ +  - ]:          4 :         std::vector< Vector<3> > coords(src.size());
      77 [ +  - ][ +  - ]:          4 :         IBERRCHK(mesh->getVtxArrCoords(&src[0], src.size(), iBase_INTERLEAVED,
         [ +  - ][ +  - ]
      78                 :            :                                        vec2ptr(coords)), *mesh);
      79                 :            : 
      80         [ +  + ]:         89 :         for (size_t i=0; i<coords.size(); i++)
      81 [ +  - ][ +  - ]:         85 :           static_cast<const T*>(this)->transform_one(coords[i]);
      82                 :            : 
      83         [ -  + ]:          4 :         if (&src == &dest)
      84                 :            :         {
      85 [ #  # ][ #  # ]:          0 :           IBERRCHK(mesh->setVtxArrCoords(&src[0], src.size(), iBase_INTERLEAVED,
         [ #  # ][ #  # ]
      86                 :            :                                          vec2ptr(coords)), *mesh);
      87                 :            :         }
      88                 :            :         else {
      89         [ +  - ]:          4 :           dest.resize(src.size());
      90 [ +  - ][ +  - ]:          4 :           IBERRCHK(mesh->createVtxArr(src.size(), iBase_INTERLEAVED,
         [ +  - ][ +  - ]
      91                 :            :                                       vec2ptr(coords), &dest[0]), *mesh);
      92                 :          4 :         }
      93                 :          4 :       }
      94                 :            : 
      95                 :            :       /** \brief Clone this transform object
      96                 :            :        */
      97                 :          4 :       virtual Transform * clone() const
      98                 :            :       {
      99                 :          4 :         return new T(*static_cast<const T*>(this));
     100                 :            :       }
     101                 :            :     protected:
     102                 :         16 :       BasicTransform() {}
     103                 :            :     };
     104                 :            :   }
     105                 :            : 
     106                 :            :   namespace Extrude {
     107                 :            :     /** \class Transform Transform.hpp "meshkit/Transform.hpp"
     108                 :            :      * \brief A base class for transforming extruded meshes
     109                 :            :      *
     110                 :            :      * This is the common base class used to transform vertices in extruded
     111                 :            :      * meshes. Subclasses of this type implement particular transformation
     112                 :            :      * functions, e.g. translation or rotation.
     113                 :            :      */
     114                 :          6 :     class Transform
     115                 :            :     {
     116                 :            :     public:
     117                 :            :       /** \brief Transform the selected vertices
     118                 :            :        * \param step the step number for the extrusion, with 0 being the
     119                 :            :        *        already-existing mesh data
     120                 :            :        * \param mesh the iMesh implementation holding the vertices
     121                 :            :        * \param src an array of the source vertices
     122                 :            :        * \param dest an array of the destination vertices
     123                 :            :        */
     124                 :            :       virtual void transform(int step, iMesh *mesh,
     125                 :            :                              const std::vector<iMesh::EntityHandle> &src,
     126                 :            :                              std::vector<iMesh::EntityHandle> &dest) const = 0;
     127                 :            :       
     128                 :            :       /** \brief The number of steps in this extrusion
     129                 :            :        */
     130                 :            :       virtual int steps() const = 0;
     131                 :            : 
     132                 :            :       /** \brief Clone this transform object
     133                 :            :        */
     134                 :            :       virtual Transform * clone() const = 0;
     135                 :            : 
     136                 :            :         /** \brief Virtual destructor
     137                 :            :          */
     138                 :          3 :         virtual ~Transform ()
     139                 :          3 :         {
     140         [ -  + ]:          3 :         }
     141                 :            :     };
     142                 :            : 
     143                 :            :     /** \class BasicTransform Transform.hpp "meshkit/Transform.hpp"
     144                 :            :      * \brief A utility class for transforming extruded meshes
     145                 :            :      *
     146                 :            :      * This class template simplifies the creation of new transformation
     147                 :            :      * functions. To use this, create a new class and inherit from this one,
     148                 :            :      * passing the new class name as the template parameter (the curiously-
     149                 :            :      * recurring template pattern).
     150                 :            :      *
     151                 :            :      * Example:
     152                 :            :      *    class Example : public BasicTransform<Example>
     153                 :            :      *    {
     154                 :            :      *      friend class BasicTransform<Example>;
     155                 :            :      *    public:
     156                 :            :      *      Example() { ... }
     157                 :            :      *    protected:
     158                 :            :      *      void transform_one(int step, Vector<3> &coords) const { ... }
     159                 :            :      *    };
     160                 :            :      */
     161                 :            :     template<typename T>
     162         [ -  + ]:         12 :     class BasicTransform : public Transform
     163                 :            :     {
     164                 :            :     public:
     165                 :            :       /** \brief Transform the selected vertices
     166                 :            :        * \param step the step number for the extrusion, with 0 being the
     167                 :            :        *        already-existing mesh data
     168                 :            :        * \param mesh the iMesh implementation holding the vertices
     169                 :            :        * \param src an array of the source vertices
     170                 :            :        * \param dest an array of the destination vertices
     171                 :            :        */
     172                 :         21 :       virtual void transform(int step, iMesh *mesh,
     173                 :            :                              const std::vector<iMesh::EntityHandle> &src,
     174                 :            :                              std::vector<iMesh::EntityHandle> &dest) const
     175                 :            :       {
     176         [ +  - ]:         21 :         std::vector< Vector<3> > coords(src.size());
     177 [ +  - ][ +  - ]:         21 :         IBERRCHK(mesh->getVtxArrCoords(&src[0], src.size(), iBase_INTERLEAVED,
         [ +  - ][ +  - ]
     178                 :            :                                       vec2ptr(coords)), *mesh);
     179                 :            : 
     180         [ +  + ]:         97 :         for (size_t i=0; i<coords.size(); i++)
     181 [ +  - ][ +  - ]:         76 :           static_cast<const T*>(this)->transform_one(step, coords[i]);
     182                 :            : 
     183         [ +  - ]:         21 :         dest.resize(src.size());
     184 [ +  - ][ +  - ]:         21 :         IBERRCHK(mesh->createVtxArr(src.size(), iBase_INTERLEAVED,
         [ +  - ][ +  - ]
     185                 :         21 :                                     vec2ptr(coords), &dest[0]), *mesh);
     186                 :         21 :       }
     187                 :            : 
     188                 :            :       /** \brief The number of steps in this extrusion
     189                 :            :        */
     190                 :         24 :       virtual int steps() const
     191                 :            :       {
     192                 :         24 :         return steps_;
     193                 :            :       }
     194                 :            : 
     195                 :            :       /** \brief Clone this transform object
     196                 :            :        */
     197                 :          3 :       virtual Transform * clone() const
     198                 :            :       {
     199                 :          3 :         return new T(*static_cast<const T*>(this));
     200                 :            :       }
     201                 :            :     protected:
     202                 :          6 :       BasicTransform(int steps) : steps_(steps)
     203                 :          3 :       {}
     204                 :            : 
     205                 :            :       int steps_;
     206                 :            :     };
     207                 :            :   }
     208                 :            : }
     209                 :            : 
     210                 :            : #endif

Generated by: LCOV version 1.11