#include "SMESH_Mesh.hxx"
#include "SMESH_Controls.hxx"
+#include "SMESH_SequenceOfNode.hxx"
+#include "gp_Dir.hxx"
+#include "TColStd_HSequenceOfReal.hxx"
#include <list>
#include <map>
+typedef map<const SMDS_MeshElement*,
+ list<const SMDS_MeshElement*> > TElemOfElemListMap;
+
class SMDS_MeshElement;
class SMDS_MeshFace;
class SMDS_MeshNode;
// 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 };
// Generate new elements by rotation of theElements around theAxis
// by theAngle by theNbSteps
- void ExtrusionSweep (std::set<const SMDS_MeshElement*> & theElements,
- const gp_Vec& theStep,
- const int theNbSteps);
+ /*!
+ * Auxilary flag for advanced extrusion.
+ * BOUNDARY: create or not boundary for result of extrusion
+ * SEW: try to use existing nodes or create new nodes in any case
+ */
+ enum ExtrusionFlags {
+ EXTRUSION_FLAG_BOUNDARY = 0x01,
+ EXTRUSION_FLAG_SEW = 0x02
+ };
+
+ /*!
+ * special structire for control of extrusion functionality
+ */
+ struct ExtrusParam {
+ gp_Dir myDir; // direction of extrusion
+ Handle(TColStd_HSequenceOfReal) mySteps; // magnitudes for each step
+ SMESH_SequenceOfNode myNodes; // nodes for using in sewing
+ };
+
+ /*!
+ * Create new node in the mesh with given coordinates
+ * (auxilary for advanced extrusion)
+ */
+ const SMDS_MeshNode* CreateNode(const double x,
+ const double y,
+ const double z,
+ const double tolnode,
+ SMESH_SequenceOfNode& aNodes);
+
+ /*!
+ * Generate new elements by extrusion of theElements
+ * It is a method used in .idl file. All functionality
+ * is implemented in the next method (see below) which
+ * is used in the cuurent method.
+ * param theElems - list of elements for extrusion
+ * param newElemsMap returns history of extrusion
+ * param theFlags set flags for performing extrusion (see description
+ * of enum ExtrusionFlags for additional information)
+ * param theTolerance - uses for comparing locations of nodes if flag
+ * EXTRUSION_FLAG_SEW is set
+ */
+ void ExtrusionSweep
+ (set<const SMDS_MeshElement*> & theElems,
+ const gp_Vec& theStep,
+ const int theNbSteps,
+ TElemOfElemListMap& newElemsMap,
+ const int theFlags = EXTRUSION_FLAG_BOUNDARY,
+ const double theTolerance = 1.e-6);
+
+ /*!
+ * Generate new elements by extrusion of theElements
+ * param theElems - list of elements for extrusion
+ * param newElemsMap returns history of extrusion
+ * param theFlags set flags for performing extrusion (see description
+ * of enum ExtrusionFlags for additional information)
+ * param theTolerance - uses for comparing locations of nodes if flag
+ * EXTRUSION_FLAG_SEW is set
+ * param theParams - special structure for manage of extrusion
+ */
+ void ExtrusionSweep (set<const SMDS_MeshElement*> & theElems,
+ ExtrusParam& theParams,
+ TElemOfElemListMap& newElemsMap,
+ const int theFlags,
+ const double theTolerance);
+
+
// Generate new elements by extrusion of theElements
// by theStep by theNbSteps
// - not in avoidSet,
// - in elemSet provided that !elemSet.empty()
+ /*!
+ * \brief Returns true if given node is medium
+ * \param n - node to check
+ * \param typeToCheck - type of elements containing the node to ask about node status
+ * \retval bool - check result
+ */
+ static bool IsMedium(const SMDS_MeshNode* node,
+ const SMDSAbs_ElementType typeToCheck = SMDSAbs_All);
+
int FindShape (const SMDS_MeshElement * theElem);
// Return an index of the shape theElem is on
// or zero if a shape not found
SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
-
private:
SMESH_Mesh * myMesh;