#include "SMDS_MeshElement.hxx"
#include "SMESH_Controls.hxx"
#include "SMESH_Mesh.hxx"
-#include "SMESH_SequenceOfElemPtr.hxx"
-#include "SMESH_SequenceOfNode.hxx"
+#include "SMESH_TypeDefs.hxx"
#include <utilities.h>
class SMESH_MesherHelper;
-typedef std::map<const SMDS_MeshElement*,
- std::list<const SMDS_MeshElement*> > TElemOfElemListMap;
-typedef std::map<const SMDS_MeshNode*, const SMDS_MeshNode*> TNodeNodeMap;
-
-//!< Set of elements sorted by ID, to be used to assure predictability of edition
-typedef std::set< const SMDS_MeshElement*, TIDCompare > TIDSortedElemSet;
-
-typedef pair< const SMDS_MeshNode*, const SMDS_MeshNode* > NLink;
-
-
//=======================================================================
/*!
* \brief Searcher for the node closest to point
std::vector< const SMDS_MeshElement* >& foundElems)=0;
virtual TopAbs_State GetPointState(const gp_Pnt& point) = 0;
-};
-
-//=======================================================================
-/*!
- * \brief A sorted pair of nodes
- */
-//=======================================================================
-struct SMESH_TLink: public NLink
-{
- SMESH_TLink(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2 ):NLink( n1, n2 )
- { if ( n1->GetID() < n2->GetID() ) std::swap( first, second ); }
- SMESH_TLink(const NLink& link ):NLink( link )
- { if ( first->GetID() < second->GetID() ) std::swap( first, second ); }
- const SMDS_MeshNode* node1() const { return first; }
- const SMDS_MeshNode* node2() const { return second; }
-};
-
-//=======================================================================
-/*!
- * \brief SMESH_TLink knowing its orientation
- */
-//=======================================================================
-
-struct SMESH_OrientedLink: public SMESH_TLink
-{
- bool _reversed;
- SMESH_OrientedLink(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2 )
- : SMESH_TLink( n1, n2 ), _reversed( n1 != node1() ) {}
+ /*!
+ * \brief Return elements possibly intersecting the line
+ */
+ virtual void GetElementsNearLine( const gp_Ax1& line,
+ SMDSAbs_ElementType type,
+ std::vector< const SMDS_MeshElement* >& foundElems)=0;
};
// ============================================================
class SMESH_EXPORT SMESH_MeshEditor
{
-public:
- //------------------------------------------
- /*!
- * \brief SMDS_MeshNode -> gp_XYZ convertor
- */
- //------------------------------------------
- struct TNodeXYZ : public gp_XYZ
- {
- const SMDS_MeshNode* _node;
- TNodeXYZ( const SMDS_MeshElement* e):gp_XYZ(0,0,0),_node(0) {
- if (e) {
- ASSERT( e->GetType() == SMDSAbs_Node );
- _node = static_cast<const SMDS_MeshNode*>(e);
- SetCoord( _node->X(), _node->Y(), _node->Z() );
- }
- }
- double Distance(const SMDS_MeshNode* n) const { return (TNodeXYZ( n )-*this).Modulus(); }
- double SquareDistance(const SMDS_MeshNode* n) const { return (TNodeXYZ( n )-*this).SquareModulus(); }
- bool operator==(const TNodeXYZ& other) const { return _node == other._node; }
- };
-
public:
SMESH_MeshEditor( SMESH_Mesh* theMesh );
SMDS_MeshElement* AddElement(const std::vector<const SMDS_MeshNode*> & nodes,
const SMDSAbs_ElementType type,
const bool isPoly,
- const int ID = 0);
+ const int ID = -1);
/*!
* \brief Add element
*/
SMDS_MeshElement* AddElement(const std::vector<int> & nodeIDs,
const SMDSAbs_ElementType type,
const bool isPoly,
- const int ID = 0);
+ const int ID = -1);
- bool Remove (const std::list< int >& theElemIDs, const bool isNodes);
+ int Remove (const std::list< int >& theElemIDs, const bool isNodes);
// Remove a node or an element.
// Modify a compute state of sub-meshes which become empty
SMESH::Controls::NumericalFunctorPtr theCriterion);
- enum SplitVolumToTetraFlags { HEXA_TO_5 = 1, HEXA_TO_6 = 2 };//!<arg of SplitVolumesIntoTetra()
+ enum SplitVolumToTetraFlags { HEXA_TO_5 = 1, HEXA_TO_6 = 2, HEXA_TO_24 = 3 };//!<arg of SplitVolumesIntoTetra()
/*!
* \brief Split volumic elements into tetrahedra.
*/
// Move or copy theElements applying theTrsf to their nodes
- /*!
- * Generate new elements by extrusion of theElements
- * param theElems - list of elements for scale
- * param thePoint - base point for scale
- * param theScaleFact - scale factors for axises
- * param theCopy - allows copying the translated elements
- * param theMakeGroups - forces the generation of new groups from existing ones
- * param theTargetMesh - the name of the newly created mesh
- * return instance of Mesh class
- */
- PGroupIDs Scale (TIDSortedElemSet& theElements,
- const gp_Pnt& thePoint,
- const std::list<double>& theScaleFact,
- const bool theCopy,
- const bool theMakeGroups,
- SMESH_Mesh* theTargetMesh=0);
-
typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
- void FindCoincidentNodes (std::set<const SMDS_MeshNode*> & theNodes,
- const double theTolerance,
- TListOfListOfNodes & theGroupsOfNodes);
+ void FindCoincidentNodes (TIDSortedNodeSet & 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.
/*!
- * \brief Return SMESH_NodeSearcher
+ * \brief Return SMESH_NodeSearcher. The caller is responsible for deleteing it
*/
SMESH_NodeSearcher* GetNodeSearcher();
/*!
- * \brief Return SMESH_ElementSearcher
+ * \brief Return SMESH_ElementSearcher. The caller is responsible for deleteing it
*/
SMESH_ElementSearcher* GetElementSearcher();
+ SMESH_ElementSearcher* GetElementSearcher( SMDS_ElemIteratorPtr elemIt );
/*!
* \brief Return true if the point is IN or ON of the element
*/
// theBetweenNode1 - theBetweenNode2, between theBetweenNode1 and theBetweenNode2.
void ConvertToQuadratic(const bool theForce3d);
- //converts all mesh to quadratic one, deletes old elements, replacing
- //them with quadratic ones with the same id.
+ // Converts all mesh to quadratic one, deletes old elements, replacing
+ // them with quadratic ones with the same id.
+ // If theForce3d = 1; this results in the medium node lying at the
+ // middle of the line segments connecting start and end node of a mesh
+ // element
+ // If theForce3d = 0; this results in the medium node lying at the
+ // geometrical edge from which the mesh element is built
bool ConvertFromQuadratic();
- //converts all mesh from quadratic to ordinary ones, deletes old quadratic elements, replacing
- //them with ordinary mesh elements with the same id.
+ // Converts all mesh from quadratic to ordinary ones, deletes old quadratic elements, replacing
+ // them with ordinary mesh elements with the same id.
+ // Returns true in case of success, false otherwise.
static void AddToSameGroups (const SMDS_MeshElement* elemToAdd,
const SMDS_MeshElement* elemInGroups,
const TIDSortedElemSet& theNodesNot,
const TopoDS_Shape& theShape );
+ bool DoubleNodesOnGroupBoundaries( const std::vector<TIDSortedElemSet>& theElems,
+ bool createJointElems);
+
/*!
* \brief Generated skin mesh (containing 2D cells) from 3D mesh
* The created 2D mesh elements based on nodes of free faces of boundary volumes
* \return TRUE if operation has been completed successfully, FALSE otherwise
*/
bool Make2DMeshFrom3D();
-
-private:
+
+ enum Bnd_Dimension { BND_2DFROM3D, BND_1DFROM3D, BND_1DFROM2D };
+
+ int MakeBoundaryMesh(const TIDSortedElemSet& elements,
+ Bnd_Dimension dimension,
+ SMESH_Group* group = 0,
+ SMESH_Mesh* targetMesh = 0,
+ bool toCopyElements = false,
+ bool toCopyExistingBondary = false,
+ bool toAddExistingBondary = false,
+ bool aroundElements = false);
+
+
+ private:
/*!
* \brief Convert elements contained in a submesh to quadratic