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=62d08763d3e4dac3a7c3aa8514e0e1f3387e57f4;hp=0c2a3ca97c62b58a103bb9d304e007bf92f33905;hb=69aa7507f2647f99203fa4b526f99c77d8c43471;hpb=f5016d85b7b4b88623723027a1585c6414c4dc66 diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index 0c2a3ca97..62d08763d 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 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 @@ -6,7 +6,7 @@ // 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. +// 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 @@ -28,26 +28,28 @@ #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.hxx" -#include "SALOME_GenericObj_i.hh" +#include class SMESH_Gen_i; class SMESH_GroupBase_i; class SMESH_subMesh_i; class SMESH_PreMeshInfo; - -#include +class SMESH_MeshEditor_i; +class DriverMED_W_Field; +class SMESHDS_Mesh; class SMESH_I_EXPORT SMESH_Mesh_i: public virtual POA_SMESH::SMESH_Mesh, @@ -63,6 +65,7 @@ public: virtual ~SMESH_Mesh_i(); // --- CORBA + void SetShape( GEOM::GEOM_Object_ptr theShapeObject ) throw (SALOME::SALOME_Exception); @@ -84,21 +87,22 @@ public: void ClearSubMesh(CORBA::Long ShapeID) throw (SALOME::SALOME_Exception); - SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp) + SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Object_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp, + CORBA::String_out anErrorText) throw (SALOME::SALOME_Exception); - SMESH::Hypothesis_Status RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, + SMESH::Hypothesis_Status RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShape, SMESH::SMESH_Hypothesis_ptr anHyp) throw (SALOME::SALOME_Exception); - SMESH::ListOfHypothesis* GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject) + SMESH::ListOfHypothesis* GetHypothesisList(GEOM::GEOM_Object_ptr aSubShape) throw (SALOME::SALOME_Exception); SMESH::submesh_array* GetSubMeshes() throw (SALOME::SALOME_Exception); - SMESH::SMESH_subMesh_ptr GetSubMesh(GEOM::GEOM_Object_ptr aSubShapeObject, const char* theName) + SMESH::SMESH_subMesh_ptr GetSubMesh(GEOM::GEOM_Object_ptr aSubShape, const char* theName) throw (SALOME::SALOME_Exception); void RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) @@ -155,38 +159,36 @@ public: 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); + throw (SALOME::SALOME_Exception); + SMESH::SMESH_Group_ptr CreateDimGroup( const SMESH::ListOfIDSources& theGroups, + SMESH::ElementType theElemType, + const char* theName, + SMESH::NB_COMMON_NODES_ENUM theNbCommonNodes, + CORBA::Boolean theUnderlyingOnly ) + throw (SALOME::SALOME_Exception); - SMESH::SMESH_Group_ptr ConvertToStandalone( SMESH::SMESH_GroupBase_ptr theGroupOn ); -// SMESH::string_array* GetLog(CORBA::Boolean clearAfterGet) -// throw (SALOME::SALOME_Exception); + SMESH::SMESH_Group_ptr ConvertToStandalone( SMESH::SMESH_GroupBase_ptr theGroupOn ) + throw (SALOME::SALOME_Exception); SMESH::log_array* GetLog(CORBA::Boolean clearAfterGet) throw (SALOME::SALOME_Exception); - SMESH::SMESH_MeshEditor_ptr GetMeshEditor(); + SMESH::SMESH_MeshEditor_ptr GetMeshEditor() throw (SALOME::SALOME_Exception); - SMESH::SMESH_MeshEditor_ptr GetMeshEditPreviewer(); + SMESH::SMESH_MeshEditor_ptr GetMeshEditPreviewer() throw (SALOME::SALOME_Exception); CORBA::Boolean HasModificationsToDiscard() throw (SALOME::SALOME_Exception); - void ClearLog() - throw (SALOME::SALOME_Exception); + void ClearLog() throw (SALOME::SALOME_Exception); - CORBA::Long GetId() - throw (SALOME::SALOME_Exception); + CORBA::Long GetId() throw (SALOME::SALOME_Exception); - CORBA::Long GetStudyId() - throw (SALOME::SALOME_Exception); + CORBA::Long GetStudyId() throw (SALOME::SALOME_Exception); // --- C++ interface + void SetImpl(::SMESH_Mesh* impl); ::SMESH_Mesh& GetImpl(); // :: force no namespace here @@ -198,7 +200,8 @@ public: int ImportSTLFile( const char* theFileName ) throw (SALOME::SALOME_Exception); - SMESH::ComputeError* ImportGMFFile( const char* theFileName ) + SMESH::ComputeError* ImportGMFFile( const char* theFileName, + bool theMakeRequiredGroups) throw (SALOME::SALOME_Exception); /*! @@ -233,7 +236,8 @@ public: void ExportToMEDX( const char* file, CORBA::Boolean auto_groups, SMESH::MED_VERSION version, - CORBA::Boolean overwrite ) throw (SALOME::SALOME_Exception); + CORBA::Boolean overwrite, + CORBA::Boolean autoDimension=true) throw (SALOME::SALOME_Exception); void ExportToMED ( const char* file, CORBA::Boolean auto_groups, SMESH::MED_VERSION version ) throw (SALOME::SALOME_Exception); @@ -249,13 +253,17 @@ public: const char* file, CORBA::Boolean overwrite) throw (SALOME::SALOME_Exception); void ExportGMF(SMESH::SMESH_IDSource_ptr meshPart, - const char* file) throw (SALOME::SALOME_Exception); + const char* file, + CORBA::Boolean withRequiredGroups) throw (SALOME::SALOME_Exception); void ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, const char* file, CORBA::Boolean auto_groups, SMESH::MED_VERSION version, - CORBA::Boolean overwrite) throw (SALOME::SALOME_Exception); + CORBA::Boolean overwrite, + CORBA::Boolean autoDim, + const GEOM::ListOfFields& fields, + const char* geomAssocFields) throw (SALOME::SALOME_Exception); void ExportPartToDAT(SMESH::SMESH_IDSource_ptr meshPart, const char* file) throw (SALOME::SALOME_Exception); void ExportPartToUNV(SMESH::SMESH_IDSource_ptr meshPart, @@ -264,8 +272,7 @@ public: const char* file, CORBA::Boolean isascii) throw (SALOME::SALOME_Exception); - SALOME_MED::MESH_ptr GetMEDMesh() - throw (SALOME::SALOME_Exception); + CORBA::Double GetComputeProgress(); CORBA::Long NbNodes() throw (SALOME::SALOME_Exception); @@ -297,6 +304,9 @@ public: CORBA::Long NbTrianglesOfOrder(SMESH::ElementOrder order) throw (SALOME::SALOME_Exception); + CORBA::Long NbBiQuadTriangles() + throw (SALOME::SALOME_Exception); + CORBA::Long NbQuadrangles() throw (SALOME::SALOME_Exception); @@ -309,6 +319,9 @@ public: CORBA::Long NbPolygons() throw (SALOME::SALOME_Exception); + CORBA::Long NbPolygonsOfOrder(SMESH::ElementOrder order=SMESH::ORDER_ANY) + throw (SALOME::SALOME_Exception); + CORBA::Long NbVolumes() throw (SALOME::SALOME_Exception); @@ -366,6 +379,9 @@ public: SMESH::EntityType GetElementGeomType( CORBA::Long id ) throw (SALOME::SALOME_Exception); + SMESH::GeometryType GetElementShape( CORBA::Long id ) + throw (SALOME::SALOME_Exception); + /*! * Returns ID of elements for given submesh */ @@ -388,12 +404,18 @@ public: char* Dump(); + // Create groups of elements preventing computation of a sub-shape + SMESH::ListOfGroups* MakeGroupsOfBadInputElements( int theSubShapeID, + const char* theGroupName) + throw (SALOME::SALOME_Exception); + // 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 addHypothesis(GEOM::GEOM_Object_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp, + std::string* anErrorText=0); - SMESH_Hypothesis::Hypothesis_Status removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, + SMESH_Hypothesis::Hypothesis_Status removeHypothesis(GEOM::GEOM_Object_ptr aSubShape, SMESH::SMESH_Hypothesis_ptr anHyp); static SMESH::Hypothesis_Status @@ -419,13 +441,19 @@ 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(); // callback from _impl to forget not loaded mesh data (issue 0021208) void checkMeshLoaded(); + /*! + * \brief Update data if geometry changes + * + * Issue 0022501 + */ + void CheckGeomModif(); /*! * \brief Update hypotheses assigned to geom groups if the latter change * @@ -462,6 +490,11 @@ public: */ SMESH::NodePosition* GetNodePosition(CORBA::Long NodeID); + /*! + * \brief Return position of an element on shape + */ + SMESH::ElementPosition GetElementPosition(CORBA::Long ElemID); + /*! * If given element is node returns IDs of shape from position * If there is not node for given ID - returns -1 @@ -503,8 +536,8 @@ public: * 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(CORBA::Long idn, + SMESH::ElementType elemType); /*! * Returns number of edges for given element @@ -520,11 +553,22 @@ public: */ SMESH::long_array* GetElemFaceNodes(CORBA::Long 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. */ CORBA::Long FindElementByNodes(const SMESH::long_array& nodes); + /*! + * Return elements including all given nodes. + */ + SMESH::long_array* GetElementsByNodes(const SMESH::long_array& nodes, + SMESH::ElementType elemType); + /*! * Returns true if given element is polygon */ @@ -548,7 +592,7 @@ public: /*! * Returns information about imported MED file */ - virtual SALOME_MED::MedFileInfo* GetMEDFileInfo(); + virtual SMESH::MedFileInfo* GetMEDFileInfo(); /*! * Sets list of notebook variables used for Mesh operations separated by ":" symbol @@ -566,11 +610,9 @@ public: SMESH::string_array* GetLastParameters(); /*! - * Collect statistic of mesh elements given by iterator + * \brief Return \c true if a meshing order not yet set for a concurrent sub-mesh */ - static void CollectMeshInfo(const SMDS_ElemIteratorPtr theItr, - SMESH::long_array& theInfo); - + CORBA::Boolean IsUnorderedSubMesh(CORBA::Long submeshID); /*! * \brief Return submesh objects list in meshing order */ @@ -581,17 +623,32 @@ public: 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::long_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::long_array* GetIDs(); /*! - * Returns statistic of mesh elements - * Result array of number enityties + * Returns number of mesh elements of each \a EntityType + * Result array of number of elements per \a EntityType * Inherited from SMESH_IDSource */ virtual SMESH::long_array* GetMeshInfo(); + /*! + * Returns number of mesh elements of each \a ElementType + */ + virtual SMESH::long_array* GetNbElementsByType(); /*! * Returns types of elements it contains */ @@ -605,6 +662,10 @@ public: * 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 @@ -617,6 +678,13 @@ private: */ void checkGroupNames(); + /* + * 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 */ @@ -624,6 +692,11 @@ private: SMESH::submesh_array_array& theSubMeshOrder, const bool theIsDump); + /*! + * \brief Finds concurrent sub-meshes + */ + TListOfListOfInt findConcurrentSubMeshes(); + private: static int _idGenerator; @@ -634,8 +707,10 @@ private: std::map _mapSubMeshIor; std::map _mapGroups; std::map _mapHypo; - SALOME_MED::MedFileInfo_var _medFileInfo; - SMESH_PreMeshInfo* _preMeshInfo; // mesh info before full loading from study file + 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; @@ -648,9 +723,10 @@ private: // 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_ptr _smeshObject; // SMESH object depending on GEOM group + 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 @@ -662,7 +738,7 @@ private: */ void removeGeomGroupData(CORBA::Object_ptr theSmeshObj); /*! - * \brief Return new group contents if it has been changed and update group data + * Return new group contents if it has been changed and update group data */ TopoDS_Shape newGroupShape( TGeomGroupData & groupData);