X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH_I%2FSMESH_Mesh_i.hxx;h=b274e33f66a3457068d53811dfd921541ec20c36;hp=32fe2153dbdfeeca1f3d7836b835f05bd04cdd6b;hb=b09372829929f8f561495d6c16527134971a1909;hpb=0635c9fc80f67d1e5dc0e94ec85f487286a92070 diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index 32fe2153d..b274e33f6 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -1,53 +1,55 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 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, or (at your option) any later version. // -// 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 // File : SMESH_Mesh_i.hxx // Author : Paul RASCLE, EDF // Module : SMESH -// + #ifndef _SMESH_MESH_I_HXX_ #define _SMESH_MESH_I_HXX_ #include "SMESH.hxx" +#include "SMESH_Hypothesis.hxx" +#include "SMESH_Mesh.hxx" +#include "SMESH_subMesh.hxx" +#include "SMDS_ElemIterator.hxx" + +#include #include +#include CORBA_SERVER_HEADER(SMESH_Gen) #include CORBA_SERVER_HEADER(SMESH_Mesh) #include CORBA_SERVER_HEADER(SMESH_Group) #include CORBA_SERVER_HEADER(SMESH_Hypothesis) #include CORBA_CLIENT_HEADER(GEOM_Gen) -#include CORBA_CLIENT_HEADER(MED) -#include "SMESH_Hypothesis.hxx" -#include "SMESH_Mesh.hxx" -//#include "SMESH_subMesh_i.hxx" -#include "SMESH_subMesh.hxx" - -#include "SALOME_GenericObj_i.hh" +#include class SMESH_Gen_i; class SMESH_GroupBase_i; class SMESH_subMesh_i; - -#include +class SMESH_PreMeshInfo; +class SMESH_MeshEditor_i; +class DriverMED_W_Field; +class SMESHDS_Mesh; class SMESH_I_EXPORT SMESH_Mesh_i: public virtual POA_SMESH::SMESH_Mesh, @@ -57,296 +59,315 @@ class SMESH_I_EXPORT SMESH_Mesh_i: SMESH_Mesh_i(const SMESH_Mesh_i&); public: SMESH_Mesh_i( PortableServer::POA_ptr thePOA, - SMESH_Gen_i* myGen_i, - CORBA::Long studyId ); + SMESH_Gen_i* myGen_i ); virtual ~SMESH_Mesh_i(); // --- CORBA - void SetShape( GEOM::GEOM_Object_ptr theShapeObject ) - throw (SALOME::SALOME_Exception); - CORBA::Boolean HasShapeToMesh() - throw (SALOME::SALOME_Exception); + void SetShape( GEOM::GEOM_Object_ptr theShapeObject ); - GEOM::GEOM_Object_ptr GetShapeToMesh() - throw (SALOME::SALOME_Exception); + CORBA::Boolean HasShapeToMesh(); - void Clear() - throw (SALOME::SALOME_Exception); + GEOM::GEOM_Object_ptr GetShapeToMesh(); - void ClearSubMesh(CORBA::Long ShapeID) - throw (SALOME::SALOME_Exception); + virtual void ReplaceShape(GEOM::GEOM_Object_ptr theNewGeom); - SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp) - throw (SALOME::SALOME_Exception); + CORBA::Boolean IsLoaded(); - SMESH::Hypothesis_Status RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp) - throw (SALOME::SALOME_Exception); + void Load(); - SMESH::ListOfHypothesis* GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject) - throw (SALOME::SALOME_Exception); + void Clear(); - SMESH::SMESH_subMesh_ptr GetSubMesh(GEOM::GEOM_Object_ptr aSubShapeObject, const char* theName) - throw (SALOME::SALOME_Exception); + void ClearSubMesh(CORBA::Long ShapeID); - void RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) - throw (SALOME::SALOME_Exception); + SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Object_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp, + CORBA::String_out anErrorText); + + SMESH::Hypothesis_Status RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp); + + SMESH::ListOfHypothesis* GetHypothesisList(GEOM::GEOM_Object_ptr aSubShape); + + SMESH::submesh_array* GetSubMeshes(); + + SMESH::SMESH_subMesh_ptr GetSubMesh(GEOM::GEOM_Object_ptr aSubShape, const char* theName); + + void RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ); + + SMESH::SMESH_Group_ptr CreateGroup( SMESH::ElementType theElemType, const char* theName ); - SMESH::SMESH_Group_ptr CreateGroup( SMESH::ElementType theElemType, const char* theName ) - throw (SALOME::SALOME_Exception); - SMESH::SMESH_GroupOnGeom_ptr CreateGroupFromGEOM(SMESH::ElementType theElemType, const char* theName, - GEOM::GEOM_Object_ptr theGeomObj ) - throw (SALOME::SALOME_Exception); + GEOM::GEOM_Object_ptr theGeomObj ); - void RemoveGroup( SMESH::SMESH_GroupBase_ptr theGroup ) - throw (SALOME::SALOME_Exception); - - void RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup ) - throw (SALOME::SALOME_Exception); - - SMESH::ListOfGroups* GetGroups() - throw (SALOME::SALOME_Exception); + SMESH::SMESH_GroupOnFilter_ptr CreateGroupFromFilter(SMESH::ElementType theElemType, + const char* theName, + SMESH::Filter_ptr theFilter ); - CORBA::Long NbGroups() - throw (SALOME::SALOME_Exception); + void RemoveGroup( SMESH::SMESH_GroupBase_ptr theGroup ); - SMESH::SMESH_Group_ptr UnionGroups( SMESH::SMESH_GroupBase_ptr theGroup1, - SMESH::SMESH_GroupBase_ptr theGroup2, - const char* theName ) - throw (SALOME::SALOME_Exception); + void RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup ); - SMESH::SMESH_Group_ptr UnionListOfGroups( const SMESH::ListOfGroups& theGroups, - const char* theName) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr IntersectGroups( SMESH::SMESH_GroupBase_ptr theGroup1, - SMESH::SMESH_GroupBase_ptr theGroup2, - const char* theName ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr IntersectListOfGroups( const SMESH::ListOfGroups& theGroups, - const char* theName ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr CutGroups( SMESH::SMESH_GroupBase_ptr theGroup1, - SMESH::SMESH_GroupBase_ptr theGroup2, - const char* theName ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr CutListOfGroups( const SMESH::ListOfGroups& theMainGroups, - const SMESH::ListOfGroups& theToolGroups, - const char* theName ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr CreateDimGroup( const SMESH::ListOfGroups& theGroups, - SMESH::ElementType theElemType, - const char* theName ) - throw (SALOME::SALOME_Exception); - + SMESH::ListOfGroups* GetGroups(); + + CORBA::Long NbGroups(); + + SMESH::SMESH_Group_ptr UnionGroups( SMESH::SMESH_GroupBase_ptr theGroup1, + SMESH::SMESH_GroupBase_ptr theGroup2, + const char* theName ); + + SMESH::SMESH_Group_ptr UnionListOfGroups( const SMESH::ListOfGroups& theGroups, + const char* theName); + + SMESH::SMESH_Group_ptr IntersectGroups( SMESH::SMESH_GroupBase_ptr theGroup1, + SMESH::SMESH_GroupBase_ptr theGroup2, + const char* theName ); + + SMESH::SMESH_Group_ptr IntersectListOfGroups( const SMESH::ListOfGroups& theGroups, + const char* theName ); + + SMESH::SMESH_Group_ptr CutGroups( SMESH::SMESH_GroupBase_ptr theGroup1, + SMESH::SMESH_GroupBase_ptr theGroup2, + const char* theName ); + + SMESH::SMESH_Group_ptr CutListOfGroups( const SMESH::ListOfGroups& theMainGroups, + const SMESH::ListOfGroups& theToolGroups, + const char* theName ); + + SMESH::SMESH_Group_ptr CreateDimGroup( const SMESH::ListOfIDSources& theGroups, + SMESH::ElementType theElemType, + const char* theName, + SMESH::NB_COMMON_NODES_ENUM theNbCommonNodes, + CORBA::Boolean theUnderlyingOnly ); - SMESH::SMESH_Group_ptr ConvertToStandalone( SMESH::SMESH_GroupOnGeom_ptr theGeomGroup ); + SMESH::ListOfGroups* FaceGroupsSeparatedByEdges( CORBA::Double theSharpAngle, + CORBA::Boolean theCreateEdges, + CORBA::Boolean theUseExistingEdges ); -// SMESH::string_array* GetLog(CORBA::Boolean clearAfterGet) -// throw (SALOME::SALOME_Exception); + SMESH::SMESH_Group_ptr ConvertToStandalone( SMESH::SMESH_GroupBase_ptr theGroupOn ); - SMESH::log_array* GetLog(CORBA::Boolean clearAfterGet) - throw (SALOME::SALOME_Exception); + SMESH::log_array* GetLog(CORBA::Boolean clearAfterGet); SMESH::SMESH_MeshEditor_ptr GetMeshEditor(); SMESH::SMESH_MeshEditor_ptr GetMeshEditPreviewer(); - void ClearLog() - throw (SALOME::SALOME_Exception); + CORBA::Boolean HasModificationsToDiscard(); - CORBA::Long GetId() - throw (SALOME::SALOME_Exception); + void ClearLog(); - CORBA::Long GetStudyId() - throw (SALOME::SALOME_Exception); + CORBA::Long GetId(); // --- C++ interface + void SetImpl(::SMESH_Mesh* impl); ::SMESH_Mesh& GetImpl(); // :: force no namespace here SMESH_Gen_i* GetGen() { return _gen_i; } - int ImportUNVFile( const char* theFileName ) - throw (SALOME::SALOME_Exception); + int ImportUNVFile( const char* theFileName ); + + int ImportSTLFile( const char* theFileName ); - int ImportSTLFile( const char* theFileName ) - throw (SALOME::SALOME_Exception); + SMESH::ComputeError* ImportGMFFile( const char* theFileName, + bool theMakeRequiredGroups); /*! * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value */ - SMESH::DriverMED_ReadStatus ImportMEDFile( const char* theFileName, const char* theMeshName ) - throw (SALOME::SALOME_Exception); + SMESH::DriverMED_ReadStatus ImportMEDFile( const char* theFileName, const char* theMeshName ); + + SMESH::DriverMED_ReadStatus ImportCGNSFile( const char* theFileName, + const int theMeshIndex, + std::string& theMeshName); /*! * Auto color */ - void SetAutoColor(CORBA::Boolean theAutoColor) - throw (SALOME::SALOME_Exception); + void SetAutoColor(CORBA::Boolean theAutoColor); - CORBA::Boolean GetAutoColor() - throw (SALOME::SALOME_Exception); + CORBA::Boolean GetAutoColor(); /*! Check group names for duplications. * Consider maximum group name length stored in MED file. */ CORBA::Boolean HasDuplicatedGroupNamesMED(); + /*! * Return string representation of a MED file version comprising nbDigits */ - char* GetVersionString(SMESH::MED_VERSION version, CORBA::Short nbDigits); + char* GetVersionString(CORBA::Long minor, CORBA::Short nbDigits); + + /*! + * Return the list of med versions compatibles for write/append, + * encoded in 10*major+minor (for instance, code for med 3.2.1 is 32) + */ + SMESH::long_array* GetMEDVersionsCompatibleForAppend(); - void ExportToMED( const char* file, CORBA::Boolean auto_groups, SMESH::MED_VERSION theVersion ) - throw (SALOME::SALOME_Exception); - void ExportMED( const char* file, CORBA::Boolean auto_groups ) - throw (SALOME::SALOME_Exception); + void ExportMED( const char* file, + CORBA::Boolean auto_groups, + CORBA::Long version, + CORBA::Boolean overwrite, + CORBA::Boolean autoDimension = true); - void ExportDAT( const char* file ) - throw (SALOME::SALOME_Exception); - void ExportUNV( const char* file ) - throw (SALOME::SALOME_Exception); - void ExportSTL( const char* file, bool isascii ) - throw (SALOME::SALOME_Exception); + void ExportSAUV( const char* file, CORBA::Boolean auto_groups ); - SALOME_MED::MESH_ptr GetMEDMesh() - throw (SALOME::SALOME_Exception); + void ExportDAT( const char* file ); + void ExportUNV( const char* file ); + void ExportSTL( const char* file, bool isascii ); + void ExportCGNS(SMESH::SMESH_IDSource_ptr meshPart, + const char* file, + CORBA::Boolean overwrite, + CORBA::Boolean groupElemsByType); + void ExportGMF(SMESH::SMESH_IDSource_ptr meshPart, + const char* file, + CORBA::Boolean withRequiredGroups); - CORBA::Long NbNodes() - throw (SALOME::SALOME_Exception); + void ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, + const char* file, + CORBA::Boolean auto_groups, + CORBA::Long version, + CORBA::Boolean overwrite, + CORBA::Boolean autoDim, + const GEOM::ListOfFields& fields, + const char* geomAssocFields, + CORBA::Double ZTolerance); + void ExportPartToDAT(SMESH::SMESH_IDSource_ptr meshPart, + const char* file); + void ExportPartToUNV(SMESH::SMESH_IDSource_ptr meshPart, + const char* file); + void ExportPartToSTL(SMESH::SMESH_IDSource_ptr meshPart, + const char* file, + CORBA::Boolean isascii); - CORBA::Long NbElements() - throw (SALOME::SALOME_Exception); + CORBA::Double GetComputeProgress(); - CORBA::Long NbEdges() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbNodes(); - CORBA::Long NbEdgesOfOrder(SMESH::ElementOrder order) - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbElements(); - CORBA::Long NbFaces() - throw (SALOME::SALOME_Exception); + SMESH::smIdType Nb0DElements(); - CORBA::Long NbFacesOfOrder(SMESH::ElementOrder order) - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbBalls(); - CORBA::Long NbTriangles() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbEdges(); - CORBA::Long NbTrianglesOfOrder(SMESH::ElementOrder order) - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbEdgesOfOrder(SMESH::ElementOrder order); - CORBA::Long NbQuadrangles() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbFaces(); - CORBA::Long NbQuadranglesOfOrder(SMESH::ElementOrder order) - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbFacesOfOrder(SMESH::ElementOrder order); - CORBA::Long NbPolygons() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbTriangles(); - CORBA::Long NbVolumes() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbTrianglesOfOrder(SMESH::ElementOrder order); - CORBA::Long NbVolumesOfOrder(SMESH::ElementOrder order) - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbBiQuadTriangles(); - CORBA::Long NbTetras() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbQuadrangles(); - CORBA::Long NbTetrasOfOrder(SMESH::ElementOrder order) - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbQuadranglesOfOrder(SMESH::ElementOrder order); - CORBA::Long NbHexas() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbBiQuadQuadrangles(); - CORBA::Long NbHexasOfOrder(SMESH::ElementOrder order) - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbPolygons(); - CORBA::Long NbPyramids() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbPolygonsOfOrder(SMESH::ElementOrder order = SMESH::ORDER_ANY); - CORBA::Long NbPyramidsOfOrder(SMESH::ElementOrder order) - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbVolumes(); - CORBA::Long NbPrisms() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbVolumesOfOrder(SMESH::ElementOrder order); - CORBA::Long NbPrismsOfOrder(SMESH::ElementOrder order) - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbTetras(); - CORBA::Long NbPolyhedrons() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbTetrasOfOrder(SMESH::ElementOrder order); - CORBA::Long NbSubMesh() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbHexas(); - SMESH::long_array* GetElementsId() - throw (SALOME::SALOME_Exception); + SMESH::smIdType NbHexasOfOrder(SMESH::ElementOrder order); + + SMESH::smIdType NbTriQuadraticHexas(); + + SMESH::smIdType NbPyramids(); + + SMESH::smIdType NbPyramidsOfOrder(SMESH::ElementOrder order); + + SMESH::smIdType NbPrisms(); + + SMESH::smIdType NbPrismsOfOrder(SMESH::ElementOrder order); + + SMESH::smIdType NbHexagonalPrisms(); + + SMESH::smIdType NbPolyhedrons(); + + SMESH::smIdType NbSubMesh(); + + SMESH::smIdType_array* GetElementsId(); + + SMESH::smIdType_array* GetElementsByType( SMESH::ElementType theElemType ); + + SMESH::smIdType_array* GetNodesId(); + + SMESH::ElementType GetElementType( SMESH::smIdType id, bool iselem ); + + SMESH::EntityType GetElementGeomType( SMESH::smIdType id ); + + SMESH::GeometryType GetElementShape( SMESH::smIdType id ); - SMESH::long_array* GetElementsByType( SMESH::ElementType theElemType ) - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetNodesId() - throw (SALOME::SALOME_Exception); - - SMESH::ElementType GetElementType( CORBA::Long id, bool iselem ) - throw (SALOME::SALOME_Exception); - /*! * Returns ID of elements for given submesh */ - SMESH::long_array* GetSubMeshElementsId(CORBA::Long ShapeID) - throw (SALOME::SALOME_Exception); + SMESH::smIdType_array* GetSubMeshElementsId(CORBA::Long ShapeID); /*! * Returns ID of nodes for given submesh * If param all==true - returns all nodes, else - * returns only nodes on shapes. */ - SMESH::long_array* GetSubMeshNodesId(CORBA::Long ShapeID, CORBA::Boolean all) - throw (SALOME::SALOME_Exception); - + SMESH::smIdType_array* GetSubMeshNodesId(CORBA::Long ShapeID, CORBA::Boolean all); + /*! * Returns type of elements for given submesh */ - SMESH::ElementType GetSubMeshElementType(CORBA::Long ShapeID) - throw (SALOME::SALOME_Exception); - + SMESH::ElementType GetSubMeshElementType(CORBA::Long ShapeID); + char* Dump(); - + + // Create groups of elements preventing computation of a sub-shape + SMESH::ListOfGroups* MakeGroupsOfBadInputElements( int theSubShapeID, + const char* theGroupName); + + // =================================================== // Internal methods not available through CORBA // They are called by corresponding interface methods - SMESH_Hypothesis::Hypothesis_Status addHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp); + // =================================================== - SMESH_Hypothesis::Hypothesis_Status removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, + SMESH_Hypothesis::Hypothesis_Status addHypothesis(GEOM::GEOM_Object_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp, + std::string* anErrorText=0); + + SMESH_Hypothesis::Hypothesis_Status removeHypothesis(GEOM::GEOM_Object_ptr aSubShape, SMESH::SMESH_Hypothesis_ptr anHyp); - + static SMESH::Hypothesis_Status ConvertHypothesisStatus (SMESH_Hypothesis::Hypothesis_Status theStatus); - static void PrepareForWriting (const char* file); + static void PrepareForWriting (const char* file, bool overwrite = true); //int importMEDFile( const char* theFileName, const char* theMeshName ); SMESH::SMESH_subMesh_ptr createSubMesh( GEOM::GEOM_Object_ptr theSubShapeObject ); - void removeSubMesh(SMESH::SMESH_subMesh_ptr theSubMesh, + bool removeSubMesh(SMESH::SMESH_subMesh_ptr theSubMesh, GEOM::GEOM_Object_ptr theSubShapeObject ); - SMESH::SMESH_GroupBase_ptr createGroup(SMESH::ElementType theElemType, - const char* theName, - const TopoDS_Shape& theShape = TopoDS_Shape()); + SMESH::SMESH_GroupBase_ptr createGroup(SMESH::ElementType theElemType, + const char* theName, + const int theID = -1, + const TopoDS_Shape& theShape = TopoDS_Shape(), + const SMESH_PredicatePtr& thePred = SMESH_PredicatePtr()); void removeGroup( const int theId ); @@ -354,17 +375,24 @@ public: // return an existing subMesh object for the shapeID. shapeID == submeshID. const std::map& getGroups() { return _mapGroups; } - // return an existing group object. + // return existing group objects + void onHypothesisModified(int theHypID, bool updateIcons); + // callback from _impl to forget not loaded mesh data (issue 0021208) + + /*! + * \brief Update data if geometry changes + * + * Issue 0022501 + */ + void CheckGeomModif( bool isBreakLink = false ); /*! * \brief Update hypotheses assigned to geom groups if the latter change - * - * NPAL16168: "geometrical group edition from a submesh don't modifiy mesh computation" + * + * NPAL16168: "geometrical group edition from a submesh don't modify mesh computation" */ void CheckGeomGroupModif(); - virtual SMESH::long_array* GetIDs(); - CORBA::LongLong GetMeshPtr(); /*! @@ -372,6 +400,16 @@ public: */ void CreateGroupServants(); + /*! + * \brief Return true if all sub-meshes are computed OK - to update an icon + */ + bool IsComputedOK(); + + + // ==================================== + // SMESH_Mesh interface (continuation) + // ==================================== + /*! * \brief Return groups cantained in _mapGroups by their IDs */ @@ -381,98 +419,141 @@ public: * Get XYZ coordinates of node as list of double * If there is not node for given ID - returns empty list */ - SMESH::double_array* GetNodeXYZ(CORBA::Long id); - + SMESH::double_array* GetNodeXYZ(SMESH::smIdType id); + /*! * For given node returns list of IDs of inverse elements * If there is not node for given ID - returns empty list */ - SMESH::long_array* GetNodeInverseElements(CORBA::Long id); + SMESH::smIdType_array* GetNodeInverseElements(SMESH::smIdType id, + SMESH::ElementType elemType); /*! * \brief Return position of a node on shape */ - SMESH::NodePosition* GetNodePosition(CORBA::Long NodeID); + SMESH::NodePosition* GetNodePosition(SMESH::smIdType NodeID); + + /*! + * \brief Return position of an element on shape + */ + SMESH::ElementPosition GetElementPosition(SMESH::smIdType ElemID); /*! * If given element is node returns IDs of shape from position * If there is not node for given ID - returns -1 */ - CORBA::Long GetShapeID(CORBA::Long id); + CORBA::Long GetShapeID(SMESH::smIdType id); /*! - * For given element returns ID of result shape after + * For given element returns ID of result shape after * ::FindShape() from SMESH_MeshEditor * If there is not element for given ID - returns -1 */ - CORBA::Long GetShapeIDForElem(CORBA::Long id); + CORBA::Long GetShapeIDForElem(SMESH::smIdType id); /*! * Returns number of nodes for given element * If there is not element for given ID - returns -1 */ - CORBA::Long GetElemNbNodes(CORBA::Long id); + CORBA::Short GetElemNbNodes(SMESH::smIdType id); /*! * Returns IDs of nodes of given element */ - SMESH::long_array* GetElemNodes(CORBA::Long id); + SMESH::smIdType_array* GetElemNodes(SMESH::smIdType id); /*! * Returns ID of node by given index for given element * If there is not element for given ID - returns -1 * If there is not node for given index - returns -2 */ - CORBA::Long GetElemNode(CORBA::Long id, CORBA::Long index); - + SMESH::smIdType GetElemNode(SMESH::smIdType id, CORBA::Short index); + /*! * Returns true if given node is medium node * in given quadratic element */ - CORBA::Boolean IsMediumNode(CORBA::Long ide, CORBA::Long idn); - + CORBA::Boolean IsMediumNode(SMESH::smIdType ide, SMESH::smIdType idn); + /*! * Returns true if given node is medium node * in one of quadratic elements */ - CORBA::Boolean IsMediumNodeOfAnyElem(CORBA::Long idn, - SMESH::ElementType theElemType); - + CORBA::Boolean IsMediumNodeOfAnyElem(SMESH::smIdType idn, + SMESH::ElementType elemType); + /*! * Returns number of edges for given element */ - CORBA::Long ElemNbEdges(CORBA::Long id); - + CORBA::Long ElemNbEdges(SMESH::smIdType id); + /*! * Returns number of faces for given element */ - CORBA::Long ElemNbFaces(CORBA::Long id); - + CORBA::Long ElemNbFaces(SMESH::smIdType id); + /*! + * Returns nodes of given face (counted from zero) for given element. + */ + SMESH::smIdType_array* GetElemFaceNodes(SMESH::smIdType elemId, CORBA::Short faceIndex); + + /*! + * Returns three components of normal of given mesh face (or an empty array in KO case) + */ + SMESH::double_array* GetFaceNormal(CORBA::Long faceId, CORBA::Boolean normalized); + + /*! + * Returns an element based on all given nodes. + */ + SMESH::smIdType FindElementByNodes(const SMESH::smIdType_array& nodes); + + /*! + * Return elements including all given nodes. + */ + SMESH::smIdType_array* GetElementsByNodes(const SMESH::smIdType_array& nodes, + SMESH::ElementType elemType); + /*! * Returns true if given element is polygon */ - CORBA::Boolean IsPoly(CORBA::Long id); - + CORBA::Boolean IsPoly(SMESH::smIdType id); + /*! * Returns true if given element is quadratic */ - CORBA::Boolean IsQuadratic(CORBA::Long id); - + CORBA::Boolean IsQuadratic(SMESH::smIdType id); + + /*! + * Returns diameter of ball discrete element or zero in case of an invalid \a id + */ + CORBA::Double GetBallDiameter(SMESH::smIdType id); + /*! * Returns bary center for given element */ - SMESH::double_array* BaryCenter(CORBA::Long id); + SMESH::double_array* BaryCenter(SMESH::smIdType id); /*! * Returns information about imported MED file */ - virtual SALOME_MED::MedFileInfo* GetMEDFileInfo(); + virtual SMESH::MedFileInfo* GetMEDFileInfo(); + + /*! + * Persistence of file info + */ + std::string FileInfoToString(); + void FileInfoFromString(const std::string& info); + + /*! + * Persistence of geometry tick + */ + int& MainShapeTick() { return _mainShapeTick; } + /*! * Sets list of notebook variables used for Mesh operations separated by ":" symbol */ void SetParameters (const char* theParameters); - + /*! * Returns list of notebook variables used for Mesh operations separated by ":" symbol */ @@ -482,28 +563,141 @@ public: * Returns list of notebook variables used for last Mesh operation */ SMESH::string_array* GetLastParameters(); - + + /*! + * \brief Return \c true if a meshing order not yet set for a concurrent sub-mesh + */ + CORBA::Boolean IsUnorderedSubMesh(CORBA::Long submeshID); + /*! + * \brief Return submesh objects list in meshing order + */ + virtual SMESH::submesh_array_array* GetMeshOrder(); + /*! + * \brief Set submesh object order + */ + virtual ::CORBA::Boolean SetMeshOrder(const SMESH::submesh_array_array& theSubMeshArray); + + + /*! + * Collect statistic of mesh elements given by iterator + */ + static void CollectMeshInfo(const SMDS_ElemIteratorPtr theItr, + SMESH::smIdType_array& theInfo); + /*! + * \brief Return iterator on elements of given type in given object + */ + static SMDS_ElemIteratorPtr GetElements(SMESH::SMESH_IDSource_ptr obj, + SMESH::ElementType type); + + // ========================= + // SMESH_IDSource interface + // ========================= + + virtual SMESH::smIdType_array* GetIDs(); + /*! + * Returns number of mesh elements of each \a EntityType + * Result array of number of elements per \a EntityType + * Inherited from SMESH_IDSource + */ + virtual SMESH::smIdType_array* GetMeshInfo(); + /*! + * Returns number of mesh elements of each \a ElementType + */ + virtual SMESH::smIdType_array* GetNbElementsByType(); + /*! + * Returns types of elements it contains + */ + virtual SMESH::array_of_ElementType* GetTypes(); + /*! + * Returns self + */ + virtual SMESH::SMESH_Mesh_ptr GetMesh(); + /*! + * Returns false if GetMeshInfo() returns incorrect information that may + * happen if mesh data is not yet fully loaded from the file of study. + */ + bool IsMeshInfoCorrect(); + /*! + * Returns mesh unstructed grid information. + */ + virtual SALOMEDS::TMPFile* GetVtkUgStream(); + + std::map _mapSubMesh_i; //NRI std::map _mapSubMesh; //NRI private: + std::string prepareMeshNameAndGroups( const char* file, CORBA::Boolean overwrite ); + /*! * Check and correct names of mesh groups */ void checkGroupNames(); -private: + /* + * Write GEOM fields to MED file + */ + void exportMEDFields( DriverMED_W_Field & writer, + SMESHDS_Mesh* meshDS, + const GEOM::ListOfFields& fields, + const char* geomAssocFields); + /*! + * Convert submesh ids into submesh interfaces + */ + void convertMeshOrder(const TListOfListOfInt& theIdsOrder, + SMESH::submesh_array_array& theSubMeshOrder, + const bool theIsDump); - static int myIdGenerator; - ::SMESH_Mesh* _impl; // :: force no namespace here - SMESH_Gen_i* _gen_i; - int _id; // id given by creator (unique within the creator instance) - int _studyId; + /*! + * \brief Finds concurrent sub-meshes + */ + TListOfListOfInt findConcurrentSubMeshes(); + + private: + + static int _idGenerator; + ::SMESH_Mesh* _impl; // :: force no namespace here + SMESH_Gen_i* _gen_i; + int _id; // id given by creator (unique within the creator instance) + int _nbInvalidHypos; std::map _mapSubMeshIor; std::map _mapGroups; std::map _mapHypo; - SALOME_MED::MedFileInfo_var myFileInfo; + SMESH_MeshEditor_i* _editor; + SMESH_MeshEditor_i* _previewEditor; + SMESH::MedFileInfo_var _medFileInfo; + SMESH_PreMeshInfo* _preMeshInfo; // mesh info before full loading from study file + + SMESH_PreMeshInfo* & changePreMeshInfo() { return _preMeshInfo; } + friend class SMESH_PreMeshInfo; + +private: + + // Data used to track changes of GEOM groups + struct TGeomGroupData { + // keep study entry but not ior because GEOM_Object actually changes if + // number of items in a group varies (1) <-> (>1) + std::string _groupEntry; + std::set _indices; // indices of group items within group's main shape + CORBA::Object_var _smeshObject; // SMESH object depending on GEOM group + }; + std::list _geomGroupData; + int _mainShapeTick; // to track modifications of the meshed shape + + /*! + * Remember GEOM group data + */ + void addGeomGroupData(GEOM::GEOM_Object_ptr theGeomObj, + CORBA::Object_ptr theSmeshObj); + /*! + * Remove GEOM group data relating to removed smesh object + */ + void removeGeomGroupData(CORBA::Object_ptr theSmeshObj); + /*! + * Return new group contents if it has been changed and update group data + */ + TopoDS_Shape newGroupShape( TGeomGroupData & groupData, int how ); + }; #endif -