Salome HOME
#16648 [CEA] RadialQuadrangle algorithm hypothesis change requires a Clear Mesh Data...
[modules/smesh.git] / src / SMESH / SMESH_MeshEditor.hxx
index e251e4f9c36952e26bbe456333bfe3016ed6c762..5a56ba6c194ecd3ecf9eea38788367ddba2562e4 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 class SMDS_MeshElement;
 class SMDS_MeshFace;
 class SMDS_MeshNode;
+class SMESHDS_Group;
 class SMESHDS_Mesh;
 class SMESHDS_SubMesh;
+class SMESH_ElementSearcher;
 class SMESH_Group;
 class SMESH_Mesh;
 class SMESH_MesherHelper;
@@ -83,11 +85,12 @@ public:
   // --------------------------------------------------------------------------------
   struct ElemFeatures //!< Features of element to create
   {
-    SMDSAbs_ElementType myType;
-    bool                myIsPoly, myIsQuad;
-    int                 myID;
-    double              myBallDiameter;
-    std::vector<int>    myPolyhedQuantities;
+    SMDSAbs_ElementType               myType;
+    bool                              myIsPoly, myIsQuad;
+    int                               myID;
+    double                            myBallDiameter;
+    std::vector<int>                  myPolyhedQuantities;
+    std::vector<const SMDS_MeshNode*> myNodes; // not managed by ElemFeatures
 
     SMESH_EXPORT ElemFeatures( SMDSAbs_ElementType type=SMDSAbs_All, bool isPoly=false, bool isQuad=false )
       :myType( type ), myIsPoly(isPoly), myIsQuad(isQuad), myID(-1), myBallDiameter(0) {}
@@ -172,7 +175,7 @@ public:
    * \param theElems     - The triangles to be fused.
    * \param theCriterion - Is used to choose a neighbour to fuse with.
    * \param theMaxAngle  - Is a max angle between element normals at which fusion
-   *                       is still performed; theMaxAngle is mesured in radians.
+   *                       is still performed; theMaxAngle is measured in radians.
    * \return bool - Success or not.
    */
   bool TriToQuad (TIDSortedElemSet &                   theElems,
@@ -180,7 +183,7 @@ public:
                   const double                         theMaxAngle);
   /*!
    * \brief Split quadrangles into triangles.
-   * \param theElems     - The faces to be splitted.
+   * \param theElems     - The faces to be split.
    * \param theCriterion - Is used to choose a diagonal for splitting.
    * \return bool - Success or not.
    */
@@ -188,7 +191,7 @@ public:
                   SMESH::Controls::NumericalFunctorPtr theCriterion);
   /*!
    * \brief Split quadrangles into triangles.
-   * \param theElems  - The faces to be splitted.
+   * \param theElems  - The faces to be split.
    * \param the13Diag - Is used to choose a diagonal for splitting.
    * \return bool - Success or not.
    */
@@ -196,7 +199,7 @@ public:
                   const bool         the13Diag);
   /*!
    * \brief Split each of given quadrangles into 4 triangles.
-   * \param theElems - The faces to be splitted. If empty all faces are split.
+   * \param theElems - The faces to be split. If empty all faces are split.
    */
   void QuadTo4Tri (TIDSortedElemSet & theElems);
 
@@ -272,7 +275,7 @@ public:
   typedef TNodeOfNodeListMap::iterator                                     TNodeOfNodeListMapItr;
   typedef std::vector<TNodeOfNodeListMapItr>                               TVecOfNnlmiMap;
   typedef std::map<const SMDS_MeshElement*, TVecOfNnlmiMap, TElemSort >    TElemOfVecOfNnlmiMap;
-  typedef std::auto_ptr< std::list<int> > PGroupIDs;
+  typedef std::unique_ptr< std::list< int > >                              PGroupIDs;
 
   PGroupIDs RotationSweep (TIDSortedElemSet   theElements[2],
                            const gp_Ax1&      theAxis,
@@ -294,6 +297,7 @@ public:
    * USE_INPUT_ELEMS_ONLY: to use only input elements to compute extrusion direction
    *                       for ExtrusionByNormal()
    * SCALE_LINEAR_VARIATION: to make linear variation of scale factors
+   * ANGLE_LINEAR_VARIATION: to make linear variation of angles
    */
   enum ExtrusionFlags {
     EXTRUSION_FLAG_BOUNDARY = 0x01,
@@ -301,7 +305,8 @@ public:
     EXTRUSION_FLAG_GROUPS = 0x04,
     EXTRUSION_FLAG_BY_AVG_NORMAL = 0x08,
     EXTRUSION_FLAG_USE_INPUT_ELEMS_ONLY = 0x10,
-    EXTRUSION_FLAG_SCALE_LINEAR_VARIATION = 0x20
+    EXTRUSION_FLAG_SCALE_LINEAR_VARIATION = 0x20,
+    EXTRUSION_FLAG_ANGLE_LINEAR_VARIATION = 0x40
   };
 
   /*!
@@ -309,24 +314,20 @@ public:
    */
   class SMESH_EXPORT ExtrusParam
   {
-    gp_Dir                          myDir;   // direction of extrusion
-    Handle(TColStd_HSequenceOfReal) mySteps; // magnitudes for each step
-    std::vector<double>             myScales, myMediumScales;// scale factors
-    gp_XYZ                          myBaseP; // scaling center
-    SMESH_SequenceOfNode            myNodes; // nodes for using in sewing
-    int                             myFlags; // see ExtrusionFlags
-    double                          myTolerance; // tolerance for sewing nodes
-    const TIDSortedElemSet*         myElemsToUse; // elements to use for extrusion by normal
-
-    int (ExtrusParam::*myMakeNodesFun)(SMESHDS_Mesh*                     mesh,
-                                       const SMDS_MeshNode*              srcNode,
-                                       std::list<const SMDS_MeshNode*> & newNodes,
-                                       const bool                        makeMediumNodes);
-
   public:
+    //! Point on extrusion path
+    struct PathPoint
+    {
+      gp_Pnt myPnt;
+      gp_Dir myTgt;
+      double myAngle, myScale;
+      PathPoint(): myPnt(99., 99., 99.), myTgt(1.,0.,0.), myAngle(0), myScale(0) {}
+    };
+
     ExtrusParam( const gp_Vec&                   theStep,
                  const int                       theNbSteps,
                  const std::list<double>&        theScales,
+                 const std::list<double>&        theAngles,
                  const gp_XYZ*                   theBaseP,
                  const int                       theFlags = 0,
                  const double                    theTolerance = 1e-6);
@@ -338,15 +339,21 @@ public:
                  const int                       theNbSteps,
                  const int                       theFlags,
                  const int                       theDim); // for extrusion by normal
+    ExtrusParam( const std::vector< PathPoint >& thePoints,
+                 const gp_Pnt*                   theBaseP,
+                 const std::list<double>&        theScales,
+                 const bool                      theMakeGroups); // for extrusion along path
 
     SMESH_SequenceOfNode& ChangeNodes() { return myNodes; }
     int& Flags()                   { return myFlags; }
     bool ToMakeBoundary()    const { return myFlags & EXTRUSION_FLAG_BOUNDARY; }
     bool ToMakeGroups()      const { return myFlags & EXTRUSION_FLAG_GROUPS; }
     bool ToUseInpElemsOnly() const { return myFlags & EXTRUSION_FLAG_USE_INPUT_ELEMS_ONLY; }
-    bool IsLinearVariation() const { return myFlags & EXTRUSION_FLAG_SCALE_LINEAR_VARIATION; }
-    int  NbSteps()           const { return mySteps->Length(); }
-
+    bool IsScaleVariation()  const { return myFlags & EXTRUSION_FLAG_SCALE_LINEAR_VARIATION; }
+    bool IsAngleVariation()  const { return myFlags & EXTRUSION_FLAG_ANGLE_LINEAR_VARIATION; }
+    int  NbSteps()           const {
+      return mySteps.IsNull() ? myPathPoints.size() - 1: mySteps->Length();
+    }
     // stores elements to use for extrusion by normal, depending on
     // state of EXTRUSION_FLAG_USE_INPUT_ELEMS_ONLY flag;
     // define myBaseP for scaling
@@ -362,6 +369,20 @@ public:
     }
   private:
 
+    gp_Dir                          myDir;   // direction of extrusion
+    Handle(TColStd_HSequenceOfReal) mySteps; // magnitudes for each step
+    std::vector<double>             myScales;// scale factors
+    std::vector<double>             myAngles;// angles
+    gp_XYZ                          myBaseP; // scaling/rotation center
+    SMESH_SequenceOfNode            myNodes; // nodes for using in sewing
+    int                             myFlags; // see ExtrusionFlags
+    double                          myTolerance; // tolerance for sewing nodes
+    const TIDSortedElemSet*         myElemsToUse; // elements to use for extrusion by normal
+    std::vector< PathPoint >        myPathPoints; // points along a path
+    int (ExtrusParam::*             myMakeNodesFun)(SMESHDS_Mesh*, // function of extrusion method
+                                                    const SMDS_MeshNode*,
+                                                    std::list<const SMDS_MeshNode*> &,
+                                                    const bool);
     int makeNodesByDir( SMESHDS_Mesh*                     mesh,
                         const SMDS_MeshNode*              srcNode,
                         std::list<const SMDS_MeshNode*> & newNodes,
@@ -378,6 +399,10 @@ public:
                              const SMDS_MeshNode*              srcNode,
                              std::list<const SMDS_MeshNode*> & newNodes,
                              const bool                        makeMediumNodes);
+    int makeNodesAlongTrack( SMESHDS_Mesh*                     mesh,
+                             const SMDS_MeshNode*              srcNode,
+                             std::list<const SMDS_MeshNode*> & newNodes,
+                             const bool                        makeMediumNodes);
     // step iteration
     void   beginStepIter( bool withMediumNodes );
     bool   moreSteps();
@@ -435,24 +460,16 @@ public:
     };
   
   Extrusion_Error ExtrusionAlongTrack (TIDSortedElemSet     theElements[2],
-                                       SMESH_subMesh*       theTrackPattern,
-                                       const SMDS_MeshNode* theNodeStart,
-                                       const bool           theHasAngles,
-                                       std::list<double>&   theAngles,
-                                       const bool           theLinearVariation,
-                                       const bool           theHasRefPoint,
-                                       const gp_Pnt&        theRefPoint,
-                                       const bool           theMakeGroups);
-  Extrusion_Error ExtrusionAlongTrack (TIDSortedElemSet     theElements[2],
-                                       SMESH_Mesh*          theTrackPattern,
+                                       SMESH_Mesh*          theTrackMesh,
+                                       SMDS_ElemIteratorPtr theTrackIterator,
                                        const SMDS_MeshNode* theNodeStart,
-                                       const bool           theHasAngles,
                                        std::list<double>&   theAngles,
-                                       const bool           theLinearVariation,
-                                       const bool           theHasRefPoint,
-                                       const gp_Pnt&        theRefPoint,
+                                       const bool           theAngleVariation,
+                                       std::list<double>&   theScales,
+                                       const bool           theScaleVariation,
+                                       const gp_Pnt*        theRefPoint,
                                        const bool           theMakeGroups);
-  // Generate new elements by extrusion of theElements along path given by theTrackPattern,
+  // Generate new elements by extrusion of theElements along path given by theTrackIterator,
   // theHasAngles are the rotation angles, base point can be given by theRefPoint
 
   PGroupIDs Transform (TIDSortedElemSet & theElements,
@@ -462,6 +479,14 @@ public:
                        SMESH_Mesh*        theTargetMesh=0);
   // Move or copy theElements applying theTrsf to their nodes
 
+  PGroupIDs Offset( TIDSortedElemSet & theElements,
+                    const double       theValue,
+                    SMESH_Mesh*        theTgtMesh,
+                    const bool         theMakeGroups,
+                    const bool         theCopyElements,
+                    const bool         theFixSelfIntersection);
+  // Make an offset mesh from a source 2D mesh
+
   typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
 
   void FindCoincidentNodes (TIDSortedNodeSet &   theNodes,
@@ -539,9 +564,9 @@ public:
   // of the side 2. If nb of links in the free border and
   // between theSide2FirstNode and theSide2LastNode are different,
   // additional nodes are inserted on a link provided that no
-  // volume elements share the splitted link.
+  // volume elements share the split link.
   // The side 2 is a free border if theSide2IsFreeBorder == true.
-  // Sewing is peformed between the given first, second and last
+  // Sewing is performed between the given first, second and last
   // nodes on the sides.
   // theBorderFirstNode is merged with theSide2FirstNode.
   // if (!theSide2IsFreeBorder) then theSide2SecondNode gives
@@ -750,6 +775,20 @@ public:
                     const size_t                               nbSteps,
                     SMESH_SequenceOfElemPtr&                   srcElements);
 
+  /*!
+   * \brief Computes new connectivity of an element after merging nodes
+   *  \param [in] elems - the element
+   *  \param [out] newElemDefs - definition(s) of result element(s)
+   *  \param [inout] nodeNodeMap - nodes to merge
+   *  \param [in] avoidMakingHoles - if true and and the element becomes invalid
+   *             after merging (but not degenerated), removes nodes causing
+   *             the invalidity from \a nodeNodeMap.
+   *  \return bool - true if the element should be removed
+   */
+  bool applyMerge( const SMDS_MeshElement*      elems,
+                   std::vector< ElemFeatures >& newElemDefs,
+                   TNodeNodeMap&                nodeNodeMap,
+                   const bool                   avoidMakingHoles );
   /*!
    * \brief Create 1D and 2D elements around swept elements
    * \param mapNewNodes - source nodes and ones generated from them
@@ -766,36 +805,10 @@ public:
                   const int                nbSteps,
                   SMESH_SequenceOfElemPtr& srcElements);
 
-  struct SMESH_MeshEditor_PathPoint
-  {
-    gp_Pnt myPnt;
-    gp_Dir myTgt;
-    double myAngle, myPrm;
-
-    SMESH_MeshEditor_PathPoint(): myPnt(99., 99., 99.), myTgt(1.,0.,0.), myAngle(0), myPrm(0) {}
-    void          SetPnt      (const gp_Pnt& aP3D)  { myPnt  =aP3D; }
-    void          SetTangent  (const gp_Dir& aTgt)  { myTgt  =aTgt; }
-    void          SetAngle    (const double& aBeta) { myAngle=aBeta; }
-    void          SetParameter(const double& aPrm)  { myPrm  =aPrm; }
-    const gp_Pnt& Pnt         ()const               { return myPnt; }
-    const gp_Dir& Tangent     ()const               { return myTgt; }
-    double        Angle       ()const               { return myAngle; }
-    double        Parameter   ()const               { return myPrm; }
-  };
-  Extrusion_Error MakeEdgePathPoints(std::list<double>&                     aPrms,
-                                     const TopoDS_Edge&                     aTrackEdge,
-                                     bool                                   aFirstIsStart,
-                                     std::list<SMESH_MeshEditor_PathPoint>& aLPP);
-  Extrusion_Error MakeExtrElements(TIDSortedElemSet                       theElements[2],
-                                   std::list<SMESH_MeshEditor_PathPoint>& theFullList,
-                                   const bool                             theHasAngles,
-                                   std::list<double>&                     theAngles,
-                                   const bool                             theLinearVariation,
-                                   const bool                             theHasRefPoint,
-                                   const gp_Pnt&                          theRefPoint,
-                                   const bool                             theMakeGroups);
-  static void LinearAngleVariation(const int          NbSteps,
+  static void linearAngleVariation(const int          NbSteps,
                                    std::list<double>& theAngles);
+  static void linearScaleVariation(const int          NbSteps,
+                                   std::list<double>& theScales);
 
   bool doubleNodes( SMESHDS_Mesh*           theMeshDS,
                     const TIDSortedElemSet& theElems,
@@ -813,7 +826,7 @@ private:
   // Nodes and elements created during last operation
   SMESH_SequenceOfElemPtr myLastCreatedNodes, myLastCreatedElems;
 
-  // Description of error/warning occured during last operation
+  // Description of error/warning occurred during last operation
   SMESH_ComputeErrorPtr   myError;
 };