X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_MeshEditor_i.hxx;h=15233798bb907aad3d7f598c4d1a0de3ae4b997b;hb=b32dca0dad762210e892549ffd1e014c8d2de59d;hp=046573b17fd210f36dc418d0722502e78fe18f5f;hpb=9357f5c87098aff2b95b754d69f66c76d2df9c24;p=modules%2Fsmesh.git diff --git a/src/SMESH_I/SMESH_MeshEditor_i.hxx b/src/SMESH_I/SMESH_MeshEditor_i.hxx index 046573b17..15233798b 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.hxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.hxx @@ -1,23 +1,23 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 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 +// 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. +// 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. +// 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 +// 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses @@ -35,6 +35,7 @@ #include "SMESH_Mesh.hxx" #include "SMESH_PythonDump.hxx" +#include "SMESH_MeshEditor.hxx" #include class SMESH_MeshEditor; @@ -52,10 +53,11 @@ public: /*! * \brief Wrap a sequence of ids in a SMESH_IDSource */ - SMESH::SMESH_IDSource_ptr MakeIDSource(const SMESH::long_array& IDsOfElements); - + SMESH::SMESH_IDSource_ptr MakeIDSource(const SMESH::long_array& IDsOfElements, + SMESH::ElementType type); CORBA::Boolean RemoveElements(const SMESH::long_array & IDsOfElements); CORBA::Boolean RemoveNodes(const SMESH::long_array & IDsOfNodes); + CORBA::Long RemoveOrphanNodes(); /*! * Methods for creation new elements. @@ -63,6 +65,8 @@ public: */ CORBA::Long AddNode(CORBA::Double x, CORBA::Double y, CORBA::Double z); CORBA::Long Add0DElement(CORBA::Long IDOfNode); + CORBA::Long AddBall(CORBA::Long IDOfNodem, CORBA::Double diameter) + throw (SALOME::SALOME_Exception); CORBA::Long AddEdge(const SMESH::long_array & IDsOfNodes); CORBA::Long AddFace(const SMESH::long_array & IDsOfNodes); CORBA::Long AddPolygonalFace(const SMESH::long_array & IDsOfNodes); @@ -120,6 +124,19 @@ public: CORBA::Boolean DeleteDiag(CORBA::Long NodeID1, CORBA::Long NodeID2); CORBA::Boolean Reorient(const SMESH::long_array & IDsOfElements); CORBA::Boolean ReorientObject(SMESH::SMESH_IDSource_ptr theObject); + /*! + * \brief Reorient faces contained in \a the2Dgroup. + * \param the2Dgroup - the mesh or its part to reorient + * \param theDirection - desired direction of normal of \a theFace + * \param theFace - ID of face whose orientation is checked. + * It can be < 1 then \a thePoint is used to find a face. + * \param thePoint - is used to find a face if \a theFace < 1. + * \return number of reoriented elements. + */ + CORBA::Long Reorient2D(SMESH::SMESH_IDSource_ptr the2Dgroup, + const SMESH::DirStruct& theDirection, + CORBA::Long theFace, + const SMESH::PointStruct& thePoint) throw (SALOME::SALOME_Exception); // Split/Join faces CORBA::Boolean TriToQuad (const SMESH::long_array & IDsOfElements, @@ -177,6 +194,11 @@ public: void ConvertToQuadratic(CORBA::Boolean Force3d); CORBA::Boolean ConvertFromQuadratic(); + void ConvertToQuadraticObject(CORBA::Boolean theForce3d, + SMESH::SMESH_IDSource_ptr theObject) + throw (SALOME::SALOME_Exception); + void ConvertFromQuadraticObject(SMESH::SMESH_IDSource_ptr theObject) + throw (SALOME::SALOME_Exception); void RenumberNodes(); void RenumberElements(); @@ -205,9 +227,17 @@ public: void ExtrusionSweep(const SMESH::long_array & IDsOfElements, const SMESH::DirStruct & StepVector, CORBA::Long NbOfSteps); + void ExtrusionSweep0D(const SMESH::long_array & IDsOfElements, + const SMESH::DirStruct & StepVector, + CORBA::Long NbOfSteps); + void ExtrusionSweepObject(SMESH::SMESH_IDSource_ptr theObject, const SMESH::DirStruct & StepVector, CORBA::Long NbOfSteps); + + void ExtrusionSweepObject0D(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::DirStruct & StepVector, + CORBA::Long NbOfSteps); void ExtrusionSweepObject1D(SMESH::SMESH_IDSource_ptr theObject, const SMESH::DirStruct & StepVector, CORBA::Long NbOfSteps); @@ -308,6 +338,10 @@ public: SMESH::ListOfGroups* ExtrusionSweepMakeGroups(const SMESH::long_array& IDsOfElements, const SMESH::DirStruct& StepVector, CORBA::Long NbOfSteps); + SMESH::ListOfGroups* ExtrusionSweepMakeGroups0D(const SMESH::long_array& IDsOfElements, + const SMESH::DirStruct& StepVector, + CORBA::Long NbOfSteps); + SMESH::ListOfGroups* AdvancedExtrusionMakeGroups(const SMESH::long_array& IDsOfElements, const SMESH::DirStruct& StepVector, CORBA::Long NbOfSteps, @@ -316,6 +350,9 @@ public: SMESH::ListOfGroups* ExtrusionSweepObjectMakeGroups(SMESH::SMESH_IDSource_ptr Object, const SMESH::DirStruct& StepVector, CORBA::Long NbOfSteps); + SMESH::ListOfGroups* ExtrusionSweepObject0DMakeGroups(SMESH::SMESH_IDSource_ptr Object, + const SMESH::DirStruct& StepVector, + CORBA::Long NbOfSteps); SMESH::ListOfGroups* ExtrusionSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr Object, const SMESH::DirStruct& StepVector, CORBA::Long NbOfSteps); @@ -449,6 +486,10 @@ public: void FindCoincidentNodesOnPart(SMESH::SMESH_IDSource_ptr Object, CORBA::Double Tolerance, SMESH::array_of_long_array_out GroupsOfNodes); + void FindCoincidentNodesOnPartBut(SMESH::SMESH_IDSource_ptr Object, + CORBA::Double Tolerance, + SMESH::array_of_long_array_out GroupsOfNodes, + const SMESH::ListOfIDSources& ExceptSubMeshOrGroups); void MergeNodes (const SMESH::array_of_long_array& GroupsOfNodes); void FindEqualElements(SMESH::SMESH_IDSource_ptr Object, SMESH::array_of_long_array_out GroupsOfElementsID); @@ -472,6 +513,16 @@ public: CORBA::Double y, CORBA::Double z, SMESH::ElementType type); + /*! + * Searching among the given elements, return elements of given type + * where the given point is IN or ON. + * 'ALL' type means elements of any type excluding nodes + */ + SMESH::long_array* FindAmongElementsByPoint(SMESH::SMESH_IDSource_ptr elements, + CORBA::Double x, + CORBA::Double y, + CORBA::Double z, + SMESH::ElementType type); /*! * Return point state in a closed 2D mesh in terms of TopAbs_State enumeration. @@ -542,7 +593,7 @@ public: */ int GetMeshId() const { return myMesh->GetId(); } - CORBA::Boolean DoubleNodes( const SMESH::long_array& theNodes, + CORBA::Boolean DoubleNodes( const SMESH::long_array& theNodes, const SMESH::long_array& theModifiedElems ); CORBA::Boolean DoubleNode( CORBA::Long theNodeId, @@ -551,8 +602,22 @@ public: CORBA::Boolean DoubleNodeGroup( SMESH::SMESH_GroupBase_ptr theNodes, SMESH::SMESH_GroupBase_ptr theModifiedElems ); + /*! + * \brief Creates a hole in a mesh by doubling the nodes of some particular elements. + * Works as DoubleNodeGroup(), but returns a new group with newly created nodes. + * \param theNodes - group of nodes to be doubled. + * \param theModifiedElems - group of elements to be updated. + * \return a new group with newly created nodes + * \sa DoubleNodeGroup() + */ + SMESH::SMESH_Group_ptr DoubleNodeGroupNew( SMESH::SMESH_GroupBase_ptr theNodes, + SMESH::SMESH_GroupBase_ptr theModifiedElems ); + CORBA::Boolean DoubleNodeGroups( const SMESH::ListOfGroups& theNodes, - const SMESH::ListOfGroups& theModifiedElems); + const SMESH::ListOfGroups& theModifiedElems ); + + SMESH::SMESH_Group_ptr DoubleNodeGroupsNew( const SMESH::ListOfGroups& theNodes, + const SMESH::ListOfGroups& theModifiedElems ); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -590,11 +655,31 @@ public: * \param theAffectedElems - group of elements to which the replicated nodes * should be associated to. * \return TRUE if operation has been completed successfully, FALSE otherwise - * \sa DoubleNodes(), DoubleNodeGroups() + * \sa DoubleNodes(), DoubleNodeGroups(), DoubleNodeElemGroupNew() */ CORBA::Boolean DoubleNodeElemGroup( SMESH::SMESH_GroupBase_ptr theElems, SMESH::SMESH_GroupBase_ptr theNodesNot, SMESH::SMESH_GroupBase_ptr theAffectedElems ); + + /*! + * \brief Creates a hole in a mesh by doubling the nodes of some particular elements + * Works as DoubleNodeElemGroup(), but returns a new group with newly created elements. + * \param theElems - group of of elements (edges or faces) to be replicated + * \param theNodesNot - group of nodes not to replicated + * \param theAffectedElems - group of elements to which the replicated nodes + * should be associated to. + * \return a new group with newly created elements + * \sa DoubleNodeElemGroup() + */ + SMESH::SMESH_Group_ptr DoubleNodeElemGroupNew( SMESH::SMESH_GroupBase_ptr theElems, + SMESH::SMESH_GroupBase_ptr theNodesNot, + SMESH::SMESH_GroupBase_ptr theAffectedElems ); + + SMESH::ListOfGroups* DoubleNodeElemGroup2New(SMESH::SMESH_GroupBase_ptr theElems, + SMESH::SMESH_GroupBase_ptr theNodesNot, + SMESH::SMESH_GroupBase_ptr theAffectedElems, + CORBA::Boolean theElemGroupNeeded, + CORBA::Boolean theNodeGroupNeeded); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -618,12 +703,31 @@ public: * \param theAffectedElems - group of elements to which the replicated nodes * should be associated to. * \return TRUE if operation has been completed successfully, FALSE otherwise - * \sa DoubleNodeGroup(), DoubleNodes() + * \sa DoubleNodeGroup(), DoubleNodes(), DoubleNodeElemGroupsNew() */ CORBA::Boolean DoubleNodeElemGroups( const SMESH::ListOfGroups& theElems, const SMESH::ListOfGroups& theNodesNot, const SMESH::ListOfGroups& theAffectedElems ); + /*! + * \brief Creates a hole in a mesh by doubling the nodes of some particular elements + * Works as DoubleNodeElemGroups(), but returns a new group with newly created elements. + * \param theElems - list of groups of elements (edges or faces) to be replicated + * \param theNodesNot - list of groups of nodes not to replicated + * \param theAffectedElems - group of elements to which the replicated nodes + * should be associated to. + * \return a new group with newly created elements + * \sa DoubleNodeElemGroups() + */ + SMESH::SMESH_Group_ptr DoubleNodeElemGroupsNew( const SMESH::ListOfGroups& theElems, + const SMESH::ListOfGroups& theNodesNot, + const SMESH::ListOfGroups& theAffectedElems ); + + SMESH::ListOfGroups* DoubleNodeElemGroups2New(const SMESH::ListOfGroups& theElems, + const SMESH::ListOfGroups& theNodesNot, + const SMESH::ListOfGroups& theAffectedElems, + CORBA::Boolean theElemGroupNeeded, + CORBA::Boolean theNodeGroupNeeded); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -639,15 +743,55 @@ public: CORBA::Boolean DoubleNodeElemGroupsInRegion( const SMESH::ListOfGroups& theElems, const SMESH::ListOfGroups& theNodesNot, GEOM::GEOM_Object_ptr theShape ); + /*! + * \brief Double nodes on shared faces between groups of volumes and create flat elements on demand. + * The list of groups must describe a partition of the mesh volumes. + * The nodes of the internal faces at the boundaries of the groups are doubled. + * In option, the internal faces are replaced by flat elements. + * Triangles are transformed in prisms, and quadrangles in hexahedrons. + * @param theDomains - list of groups of volumes + * @param createJointElems - if TRUE, create the elements + * @return TRUE if operation has been completed successfully, FALSE otherwise + */ + CORBA::Boolean DoubleNodesOnGroupBoundaries( const SMESH::ListOfGroups& theDomains, + CORBA::Boolean createJointElems ) + throw (SALOME::SALOME_Exception); + /*! + * \brief Double nodes on some external faces and create flat elements. + * Flat elements are mainly used by some types of mechanic calculations. + * + * Each group of the list must be constituted of faces. + * Triangles are transformed in prisms, and quadrangles in hexahedrons. + * @param theGroupsOfFaces - list of groups of faces + * @return TRUE if operation has been completed successfully, FALSE otherwise + */ + CORBA::Boolean CreateFlatElementsOnFacesGroups( const SMESH::ListOfGroups& theGroupsOfFaces ); - /*! - * \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 - */ - CORBA::Boolean Make2DMeshFrom3D(); + /*! + * \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 + */ + CORBA::Boolean Make2DMeshFrom3D(); + + SMESH::SMESH_Mesh_ptr MakeBoundaryMesh(SMESH::SMESH_IDSource_ptr elements, + SMESH::Bnd_Dimension dimension, + const char* groupName, + const char* meshName, + CORBA::Boolean toCopyElements, + CORBA::Boolean toCopyMissingBondary, + SMESH::SMESH_Group_out group); + + CORBA::Long MakeBoundaryElements(SMESH::Bnd_Dimension dimension, + const char* groupName, + const char* meshName, + CORBA::Boolean toCopyAll, + const SMESH::ListOfIDSources& groups, + SMESH::SMESH_Mesh_out mesh, + SMESH::SMESH_Group_out group) + throw (SALOME::SALOME_Exception); - private: //!< private methods +private: //!< private methods SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); } @@ -676,7 +820,7 @@ public: SMESH::ListOfGroups* extrusionSweep(const SMESH::long_array & IDsOfElements, const SMESH::DirStruct & StepVector, CORBA::Long NbOfSteps, - const bool MakeGroups, + bool MakeGroups, const SMDSAbs_ElementType ElementType=SMDSAbs_All); SMESH::ListOfGroups* advancedExtrusion(const SMESH::long_array & theIDsOfElements, const SMESH::DirStruct & theStepVector, @@ -703,46 +847,46 @@ public: CORBA::Boolean LinearVariation, CORBA::Boolean HasRefPoint, const SMESH::PointStruct& RefPoint, - const bool MakeGroups, + bool MakeGroups, const SMDSAbs_ElementType ElementType, SMESH::SMESH_MeshEditor::Extrusion_Error & theError); - SMESH::ListOfGroups* mirror(const SMESH::long_array & IDsOfElements, + SMESH::ListOfGroups* mirror(TIDSortedElemSet & IDsOfElements, const SMESH::AxisStruct & Axis, SMESH::SMESH_MeshEditor::MirrorType MirrorType, CORBA::Boolean Copy, - const bool MakeGroups, + bool MakeGroups, ::SMESH_Mesh* TargetMesh=0); - SMESH::ListOfGroups* translate(const SMESH::long_array & IDsOfElements, + SMESH::ListOfGroups* translate(TIDSortedElemSet & IDsOfElements, const SMESH::DirStruct & Vector, CORBA::Boolean Copy, - const bool MakeGroups, + bool MakeGroups, ::SMESH_Mesh* TargetMesh=0); - SMESH::ListOfGroups* rotate(const SMESH::long_array & IDsOfElements, + SMESH::ListOfGroups* rotate(TIDSortedElemSet & IDsOfElements, const SMESH::AxisStruct & Axis, CORBA::Double Angle, CORBA::Boolean Copy, - const bool MakeGroups, + bool MakeGroups, ::SMESH_Mesh* TargetMesh=0); - SMESH::ListOfGroups* scale(const SMESH::long_array & theIDsOfElements, - const SMESH::PointStruct& thePoint, - const SMESH::double_array& theScaleFact, - CORBA::Boolean theCopy, - const bool theMakeGroups, - ::SMESH_Mesh* theTargetMesh=0); + SMESH::ListOfGroups* scale(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::PointStruct& thePoint, + const SMESH::double_array& theScaleFact, + CORBA::Boolean theCopy, + bool theMakeGroups, + ::SMESH_Mesh* theTargetMesh=0); SMESH::SMESH_Mesh_ptr makeMesh(const char* theMeshName); void DumpGroupsList(SMESH::TPythonDump & theDumpPython, const SMESH::ListOfGroups * theGroupList); -private: //!< fields + string generateGroupName(const string& thePrefix); - SMESH_Mesh_i* myMesh_i; - SMESH_Mesh * myMesh; +private: //!< fields - SMESH::long_array_var myLastCreatedElems; - SMESH::long_array_var myLastCreatedNodes; + SMESH_Mesh_i* myMesh_i; + SMESH_Mesh * myMesh; + ::SMESH_MeshEditor myEditor; SMESH::MeshPreviewStruct_var myPreviewData; bool myPreviewMode;