X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MeshEditor.hxx;h=d9f4b5d28a737e19894bb570146b6c9f0cb7f594;hb=6650dea1f85dd5c640829d6e0391d703a304a152;hp=fd5facec2e6ad444d12fdf27b580aacc74318918;hpb=79b1ac2b6df9117f16f11d444b1f165d477a1813;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index fd5facec2..d9f4b5d28 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -1,83 +1,126 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses +// Copyright (C) 2007-2010 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 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + +// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses // File : SMESH_MeshEditor.hxx // Created : Mon Apr 12 14:56:19 2004 // Author : Edward AGAPOV (eap) // Module : SMESH - - +// #ifndef SMESH_MeshEditor_HeaderFile #define SMESH_MeshEditor_HeaderFile #include "SMESH_SMESH.hxx" -#include "SMESH_Mesh.hxx" +#include "SMDS_MeshElement.hxx" #include "SMESH_Controls.hxx" -#include "SMESH_SequenceOfNode.hxx" +#include "SMESH_Mesh.hxx" #include "SMESH_SequenceOfElemPtr.hxx" -#include "TColStd_HSequenceOfReal.hxx" -#include "SMESH_MesherHelper.hxx" -#include "SMDS_MeshElement.hxx" +#include "SMESH_SequenceOfNode.hxx" + +#include +#include #include #include #include - -typedef std::map > TElemOfElemListMap; -typedef std::map TNodeNodeMap; +#include class SMDS_MeshFace; class SMDS_MeshNode; class gp_Ax1; class gp_Vec; class gp_Pnt; +class SMESH_MesherHelper; -// ============================================================ + +typedef std::map > TElemOfElemListMap; +typedef std::map 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 Set of elements sorted by ID, to be used to assure - * predictability of edition + * \brief Searcher for the node closest to point */ -// ============================================================ +//======================================================================= +struct SMESH_NodeSearcher +{ + virtual const SMDS_MeshNode* FindClosestTo( const gp_Pnt& pnt ) = 0; + virtual void MoveNode( const SMDS_MeshNode* node, const gp_Pnt& toPnt ) = 0; +}; -template < class TMeshElem = SMDS_MeshElement> -struct TIDCompare { - bool operator () (const TMeshElem* e1, const TMeshElem* e2) const - { return e1->GetID() < e2->GetID(); } +//======================================================================= +/*! + * \brief Find elements of given type where the given point is IN or ON. + * Returns nb of found elements and elements them-selves. + * Another task is to find out if the given point is out of closed 2D mesh. + * + * 'ALL' type means elements of any type excluding nodes and 0D elements + */ +//======================================================================= + +struct SMESH_ElementSearcher +{ + virtual int FindElementsByPoint(const gp_Pnt& point, + SMDSAbs_ElementType type, + std::vector< const SMDS_MeshElement* >& foundElems)=0; + + virtual TopAbs_State GetPointState(const gp_Pnt& point) = 0; }; -typedef std::set< const SMDS_MeshElement*, TIDCompare< SMDS_MeshElement> > TIDSortedElemSet; -// ============================================================ +//======================================================================= /*! - * \brief Searcher for the node closest to point + * \brief A sorted pair of nodes */ -// ============================================================ +//======================================================================= -struct SMESH_NodeSearcher +struct SMESH_TLink: public NLink { - virtual const SMDS_MeshNode* FindClosestTo( const gp_Pnt& pnt ) = 0; + 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() ) {} }; // ============================================================ @@ -86,7 +129,28 @@ struct SMESH_NodeSearcher */ // ============================================================ -class SMESH_EXPORT SMESH_MeshEditor { +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(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: @@ -173,6 +237,13 @@ public: SMESH::Controls::NumericalFunctorPtr theCriterion); + enum SplitVolumToTetraFlags { HEXA_TO_5 = 1, HEXA_TO_6 = 2 };//!& theAngles, + const bool theLinearVariation, + const bool theHasRefPoint, + const gp_Pnt& theRefPoint, + const bool theMakeGroups); + Extrusion_Error ExtrusionAlongTrack (TIDSortedElemSet & theElements, + SMESH_Mesh* theTrackPattern, + const SMDS_MeshNode* theNodeStart, + const bool theHasAngles, + std::list& theAngles, + const bool theLinearVariation, const bool theHasRefPoint, const gp_Pnt& theRefPoint, const bool theMakeGroups); @@ -300,6 +381,24 @@ public: SMESH_Mesh* theTargetMesh=0); // 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& theScaleFact, + const bool theCopy, + const bool theMakeGroups, + SMESH_Mesh* theTargetMesh=0); + typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes; void FindCoincidentNodes (std::set & theNodes, @@ -313,9 +412,19 @@ public: */ SMESH_NodeSearcher* GetNodeSearcher(); - int SimplifyFace (const vector faceNodes, - vector& poly_nodes, - vector& quantities) const; + /*! + * \brief Return SMESH_ElementSearcher + */ + SMESH_ElementSearcher* GetElementSearcher(); + /*! + * \brief Return true if the point is IN or ON of the element + */ + static bool isOut( const SMDS_MeshElement* element, const gp_Pnt& point, double tol ); + + + int SimplifyFace (const std::vector faceNodes, + std::vector& poly_nodes, + std::vector& quantities) const; // Split face, defined by , into several faces by repeating nodes. // Is used by MergeNodes() @@ -326,7 +435,7 @@ public: typedef std::list< std::list< int > > TListOfListOfElementsID; void FindEqualElements(std::set & theElements, - TListOfListOfElementsID & theGroupsOfElementsID); + TListOfListOfElementsID & theGroupsOfElementsID); // Return list of group of elements build on the same nodes. // Search among theElements or in the whole mesh if theElements is empty. @@ -430,26 +539,24 @@ public: //converts all mesh from quadratic to ordinary ones, deletes old quadratic elements, replacing //them with ordinary mesh elements with the same id. - -// 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 + // Add elemToAdd to the all groups the elemInGroups belongs to - static void RemoveElemFromGroups (const SMDS_MeshElement* removeelem, + static void RemoveElemFromGroups (const SMDS_MeshElement* element, SMESHDS_Mesh * aMesh); - // remove elemToAdd from the groups + // remove element from the all groups + + static void ReplaceElemInGroups (const SMDS_MeshElement* elemToRm, + const SMDS_MeshElement* elemToAdd, + SMESHDS_Mesh * aMesh); + // replace elemToRm by elemToAdd in the all groups + + static void ReplaceElemInGroups (const SMDS_MeshElement* elemToRm, + const std::vector& elemToAdd, + SMESHDS_Mesh * aMesh); + // replace elemToRm by elemToAdd in the all groups /*! * \brief Return nodes linked to the given one in elements of the type @@ -458,14 +565,16 @@ public: TIDSortedElemSet & linkedNodes, SMDSAbs_ElementType type = SMDSAbs_All ); - static const SMDS_MeshElement* - FindFaceInSet(const SMDS_MeshNode* n1, - const SMDS_MeshNode* n2, - const TIDSortedElemSet& elemSet, - const TIDSortedElemSet& avoidSet); + static const SMDS_MeshElement* FindFaceInSet(const SMDS_MeshNode* n1, + const SMDS_MeshNode* n2, + const TIDSortedElemSet& elemSet, + const TIDSortedElemSet& avoidSet, + int* i1=0, + int* i2=0); // Return a face having linked nodes n1 and n2 and which is // - not in avoidSet, // - in elemSet provided that !elemSet.empty() + // i1 and i2 optionally returns indices of n1 and n2 /*! * \brief Find corresponding nodes in two sets of faces @@ -478,13 +587,13 @@ public: * \param nReplaceMap - output map of corresponding nodes * \retval Sew_Error - is a success or not */ - static Sew_Error FindMatchingNodes(set& theSide1, - set& theSide2, - const SMDS_MeshNode* theFirstNode1, - const SMDS_MeshNode* theFirstNode2, - const SMDS_MeshNode* theSecondNode1, - const SMDS_MeshNode* theSecondNode2, - TNodeNodeMap & nReplaceMap); + static Sew_Error FindMatchingNodes(std::set& theSide1, + std::set& theSide2, + const SMDS_MeshNode* theFirstNode1, + const SMDS_MeshNode* theFirstNode2, + const SMDS_MeshNode* theSecondNode1, + const SMDS_MeshNode* theSecondNode2, + TNodeNodeMap & theNodeReplaceMap); /*! * \brief Returns true if given node is medium @@ -507,6 +616,24 @@ public: const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; } + bool DoubleNodes( const std::list< int >& theListOfNodes, + const std::list< int >& theListOfModifiedElems ); + + bool DoubleNodes( const TIDSortedElemSet& theElems, + const TIDSortedElemSet& theNodesNot, + const TIDSortedElemSet& theAffectedElems ); + + bool DoubleNodesInRegion( const TIDSortedElemSet& theElems, + const TIDSortedElemSet& theNodesNot, + const TopoDS_Shape& theShape ); + + /*! + * \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: /*! @@ -570,6 +697,44 @@ private: TIDSortedElemSet& elemSet, 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& aPrms, + const TopoDS_Edge& aTrackEdge, + bool aFirstIsStart, + std::list& aLPP); + Extrusion_Error MakeExtrElements(TIDSortedElemSet& theElements, + std::list& theFullList, + const bool theHasAngles, + std::list& theAngles, + const bool theLinearVariation, + const bool theHasRefPoint, + const gp_Pnt& theRefPoint, + const bool theMakeGroups); + void LinearAngleVariation(const int NbSteps, + list& theAngles); + + bool doubleNodes( SMESHDS_Mesh* theMeshDS, + const TIDSortedElemSet& theElems, + const TIDSortedElemSet& theNodesNot, + std::map< const SMDS_MeshNode*, const SMDS_MeshNode* >& theNodeNodeMap, + const bool theIsDoubleElem ); + private: SMESH_Mesh * myMesh;