X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MeshEditor.hxx;h=8e605ab9294f43ebb94a88e69554620dc3c40714;hp=5dd53807a813bcac52c0ba0270c3b0c8f1d4f79b;hb=441a2df90cb97ea7d035771a49e28dc53469e3d6;hpb=5504d02a2237b17b8459bcd3b1fb2a89468598cd diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index 5dd53807a..8e605ab92 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -46,8 +46,10 @@ 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 myPolyhedQuantities; + SMDSAbs_ElementType myType; + bool myIsPoly, myIsQuad; + int myID; + double myBallDiameter; + std::vector myPolyhedQuantities; + std::vector 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) {} @@ -129,9 +132,9 @@ public: // Modify a compute state of sub-meshes which become empty void Create0DElementsOnAllNodes( const TIDSortedElemSet& elements, - TIDSortedElemSet& all0DElems); - // Create 0D elements on all nodes of the given object except those - // nodes on which a 0D element already exists. \a all0DElems returns + TIDSortedElemSet& all0DElems, + const bool duplicateElements); + // Create 0D elements on all nodes of the given. \a all0DElems returns // all 0D elements found or created on nodes of \a elements bool InverseDiag (const SMDS_MeshElement * theTria1, @@ -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); @@ -462,6 +465,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, @@ -471,7 +482,8 @@ public: // Return list of group of nodes close to each other within theTolerance. // Search among theNodes or in the whole mesh if theNodes is empty. - void MergeNodes (TListOfListOfNodes & theNodeGroups); + void MergeNodes (TListOfListOfNodes & theNodeGroups, + const bool theAvoidMakingHoles = false); // In each group, the cdr of nodes are substituted by the first one // in all elements. @@ -538,9 +550,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 @@ -705,6 +717,49 @@ public: bool toAddExistingBondary = false, bool aroundElements = false); + + // structure used in MakePolyLine() to define a cutting plane + struct PolySegment + { + // 2 points, each defined as follows: + // ( myNode1 && myNode2 ) ==> point is in the middle of an edge defined by two nodes + // ( myNode1 && !myNode2 ) ==> point is at myNode1 + // else ==> point is at myXYZ + const SMDS_MeshNode* myNode1[2]; + const SMDS_MeshNode* myNode2[2]; + gp_XYZ myXYZ [2]; + + // face on which myXYZ projects (found by MakePolyLine()) + const SMDS_MeshElement* myFace [2]; + + // vector on the plane; to use a default plane set vector = (0,0,0) + gp_Vec myVector; + + // point to return coordinates of a middle of the two points, projected to mesh + gp_Pnt myMidProjPoint; + }; + typedef std::vector TListOfPolySegments; + + /*! + * \brief Create a polyline consisting of 1D mesh elements each lying on a 2D element of + * the initial mesh. Positions of new nodes are found by cutting the mesh by the + * plane passing through pairs of points specified by each PolySegment structure. + * If there are several paths connecting a pair of points, the shortest path is + * selected by the module. Position of the cutting plane is defined by the two + * points and an optional vector lying on the plane specified by a PolySegment. + * By default the vector is defined by Mesh module as following. A middle point + * of the two given points is computed. The middle point is projected to the mesh. + * The vector goes from the middle point to the projection point. In case of planar + * mesh, the vector is normal to the mesh. + * \param [inout] segments - PolySegment's defining positions of cutting planes. + * Return the used vector and position of the middle point. + * \param [in] group - an optional group where created mesh segments will + * be added. + */ + void MakePolyLine( TListOfPolySegments& segments, + SMESHDS_Group* group=0, + SMESH_ElementSearcher* searcher=0); + private: /*! @@ -749,6 +804,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 @@ -781,11 +850,11 @@ public: double Angle ()const { return myAngle; } double Parameter ()const { return myPrm; } }; - Extrusion_Error MakeEdgePathPoints(std::list& aPrms, + Extrusion_Error makeEdgePathPoints(std::list& aPrms, const TopoDS_Edge& aTrackEdge, bool aFirstIsStart, std::list& aLPP); - Extrusion_Error MakeExtrElements(TIDSortedElemSet theElements[2], + Extrusion_Error makeExtrElements(TIDSortedElemSet theElements[2], std::list& theFullList, const bool theHasAngles, std::list& theAngles, @@ -793,7 +862,7 @@ public: const bool theHasRefPoint, const gp_Pnt& theRefPoint, const bool theMakeGroups); - static void LinearAngleVariation(const int NbSteps, + static void linearAngleVariation(const int NbSteps, std::list& theAngles); bool doubleNodes( SMESHDS_Mesh* theMeshDS, @@ -812,7 +881,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; };