#include <list>
#include <map>
+//#include <TColStd_DataMapOfIntegerListOfInteger.hxx>
+#include <SMESH_DataMapOfElemPtrSequenceOfElemPtr.hxx>
class SMDS_MeshElement;
class SMDS_MeshFace;
class SMDS_MeshNode;
class gp_Ax1;
class gp_Vec;
+class gp_Pnt;
class SMESH_MeshEditor {
public:
// with a quadrangle built on the same 4 nodes.
// Return false if proper faces not found
- bool Reorient (const SMDS_MeshElement * theFace);
- // Reverse the normal of theFace
- // Return false if theFace is null
+ bool Reorient (const SMDS_MeshElement * theElement);
+ // Reverse theElement orientation
+ /*!
+ * \brief Fuse neighbour triangles into quadrangles.
+ * \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.
+ * \retval bool - Success or not.
+ */
bool TriToQuad (std::set<const SMDS_MeshElement*> & theElems,
SMESH::Controls::NumericalFunctorPtr theCriterion,
const double theMaxAngle);
- // Fuse neighbour triangles into quadrangles.
- // theCriterion is used to choose a neighbour to fuse with.
- // theMaxAngle is a max angle between element normals at which
- // fusion is still performed; theMaxAngle is mesured in radians.
+ /*!
+ * \brief Split quadrangles into triangles.
+ * \param theElems - The faces to be splitted.
+ * \param theCriterion - Is used to choose a diagonal for splitting.
+ * \retval bool - Success or not.
+ */
bool QuadToTri (std::set<const SMDS_MeshElement*> & theElems,
SMESH::Controls::NumericalFunctorPtr theCriterion);
- // Cut quadrangles into triangles.
- // theCriterion is used to choose a diagonal to cut
+ /*!
+ * \brief Split quadrangles into triangles.
+ * \param theElems - The faces to be splitted.
+ * \param the13Diag - Is used to choose a diagonal for splitting.
+ * \retval bool - Success or not.
+ */
bool QuadToTri (std::set<const SMDS_MeshElement*> & theElems,
const bool the13Diag);
- // Cut quadrangles into triangles
+
+ /*!
+ * \brief Find better diagonal for splitting.
+ * \param theQuad - The face to find better splitting of.
+ * \param theCriterion - Is used to choose a diagonal for splitting.
+ * \retval int - 1 for 1-3 diagonal, 2 for 2-4, -1 - for errors.
+ */
+ int BestSplit (const SMDS_MeshElement* theQuad,
+ SMESH::Controls::NumericalFunctorPtr theCriterion);
enum SmoothMethod { LAPLACIAN = 0, CENTROIDAL };
std::set<const SMDS_MeshNode*> & theFixedNodes,
const SmoothMethod theSmoothMethod,
const int theNbIterations,
- double theTgtAspectRatio = 1.0);
+ double theTgtAspectRatio = 1.0,
+ const bool the2D = true);
// Smooth theElements using theSmoothMethod during theNbIterations
// or until a worst element has aspect ratio <= theTgtAspectRatio.
// Aspect Ratio varies in range [1.0, inf].
// If theElements is empty, the whole mesh is smoothed.
// theFixedNodes contains additionally fixed nodes. Nodes built
// on edges and boundary nodes are always fixed.
+ // If the2D, smoothing is performed using UV parameters of nodes
+ // on geometrical faces
void RotationSweep (std::set<const SMDS_MeshElement*> & theElements,
// Generate new elements by extrusion of theElements
// by theStep by theNbSteps
+ enum Extrusion_Error {
+ EXTR_OK,
+ EXTR_NO_ELEMENTS,
+ EXTR_PATH_NOT_EDGE,
+ EXTR_BAD_PATH_SHAPE,
+ EXTR_BAD_STARTING_NODE,
+ EXTR_BAD_ANGLES_NUMBER,
+ EXTR_CANT_GET_TANGENT
+ };
+
+ Extrusion_Error ExtrusionAlongTrack (std::set<const SMDS_MeshElement*> & theElements,
+ SMESH_subMesh* theTrackPattern,
+ const SMDS_MeshNode* theNodeStart,
+ const bool theHasAngles,
+ std::list<double>& theAngles,
+ const bool theHasRefPoint,
+ const gp_Pnt& theRefPoint);
+ // Generate new elements by extrusion of theElements along path given by theTrackPattern,
+ // theHasAngles are the rotation angles, base point can be given by theRefPoint
void Transform (std::set<const SMDS_MeshElement*> & theElements,
const gp_Trsf& theTrsf,
const bool theCopy);
// Move or copy theElements applying theTrsf to their nodes
-
typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
- void FindCoincidentNodes (const double theTolerance,
- TListOfListOfNodes & theGroupsOfNodes);
- // Return list of group of nodes close to each other within theTolerance
+ void FindCoincidentNodes (std::set<const SMDS_MeshNode*> & theNodes,
+ const double theTolerance,
+ TListOfListOfNodes & theGroupsOfNodes);
+ // Return list of group of nodes close to each other within theTolerance.
+ // Search among theNodes or in the whole mesh if theNodes is empty.
+
+ int SimplifyFace (const vector<const SMDS_MeshNode *> faceNodes,
+ vector<const SMDS_MeshNode *>& poly_nodes,
+ vector<int>& quantities) const;
+ // Split face, defined by <faceNodes>, into several faces by repeating nodes.
+ // Is used by MergeNodes()
void MergeNodes (TListOfListOfNodes & theNodeGroups);
// In each group, the cdr of nodes are substituted by the first one
const SMDS_MeshNode* theSide2FirstNode,
const SMDS_MeshNode* theSide2SecondNode,
const SMDS_MeshNode* theSide2ThirdNode = 0,
- bool theSide2IsFreeBorder = true);
+ const bool theSide2IsFreeBorder = true,
+ const bool toCreatePolygons = false,
+ const bool toCreatePolyedrs = false);
// Sew the free border to the side2 by replacing nodes in
// elements on the free border with nodes of the elements
// of the side 2. If nb of links in the free border and
void InsertNodesIntoLink(const SMDS_MeshElement* theFace,
const SMDS_MeshNode* theBetweenNode1,
const SMDS_MeshNode* theBetweenNode2,
- std::list<const SMDS_MeshNode*>& theNodesToInsert);
- // insert theNodesToInsert into theFace between theBetweenNode1
- // and theBetweenNode2 and split theElement.
-
- static int SortQuadNodes (const SMDS_Mesh * theMesh,
- int theNodeIds[] );
- // Set 4 nodes of a quadrangle face in a good order.
- // Swap 1<->2 or 2<->3 nodes and correspondingly return
- // 1 or 2 else 0.
-
- static bool SortHexaNodes (const SMDS_Mesh * theMesh,
- int theNodeIds[] );
- // Set 8 nodes of a hexahedron in a good order.
- // Return success status
-
+ std::list<const SMDS_MeshNode*>& theNodesToInsert,
+ const bool toCreatePoly = false);
+ // insert theNodesToInsert into theFace between theBetweenNode1 and theBetweenNode2.
+ // If toCreatePoly is true, replace theFace by polygon, else split theFace.
+
+ void UpdateVolumes (const SMDS_MeshNode* theBetweenNode1,
+ const SMDS_MeshNode* theBetweenNode2,
+ std::list<const SMDS_MeshNode*>& theNodesToInsert);
+ // insert theNodesToInsert into all volumes, containing link
+ // theBetweenNode1 - theBetweenNode2, between theBetweenNode1 and theBetweenNode2.
+
+// static int SortQuadNodes (const SMDS_Mesh * theMesh,
+// int theNodeIds[] );
+// // Set 4 nodes of a quadrangle face in a good order.
+// // Swap 1<->2 or 2<->3 nodes and correspondingly return
+// // 1 or 2 else 0.
+//
+// static bool SortHexaNodes (const SMDS_Mesh * theMesh,
+// int theNodeIds[] );
+// // Set 8 nodes of a hexahedron in a good order.
+// // Return success status
+
+ static void AddToSameGroups (const SMDS_MeshElement* elemToAdd,
+ const SMDS_MeshElement* elemInGroups,
+ SMESHDS_Mesh * aMesh);
+ // Add elemToAdd to the groups the elemInGroups belongs to
+
+ static const SMDS_MeshElement*
+ FindFaceInSet(const SMDS_MeshNode* n1,
+ const SMDS_MeshNode* n2,
+ const std::set<const SMDS_MeshElement*>& elemSet,
+ const std::set<const SMDS_MeshElement*>& avoidSet);
+ // Return a face having linked nodes n1 and n2 and which is
+ // - not in avoidSet,
+ // - in elemSet provided that !elemSet.empty()
int FindShape (const SMDS_MeshElement * theElem);
// Return an index of the shape theElem is on
SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
+ const SMESH_DataMapOfElemPtrSequenceOfElemPtr& GetExtrusionHistory() const
+ { return myExtrusionHistory; }
private:
SMESH_Mesh * myMesh;
+ SMESH_DataMapOfElemPtrSequenceOfElemPtr myExtrusionHistory;
+
};
#endif