Version: 6.3.1

src/SMESHDS/SMESHDS_Mesh.hxx

Go to the documentation of this file.
00001 // Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 //  SMESH SMESHDS : management of mesh data and SMESH document
00024 //  File   : SMESHDS_Mesh.hxx
00025 //  Module : SMESH
00026 //
00027 #ifndef _SMESHDS_Mesh_HeaderFile
00028 #define _SMESHDS_Mesh_HeaderFile
00029 
00030 #include "SMESH_SMESHDS.hxx"
00031 
00032 #include "SMDS_Mesh.hxx"
00033 #include "SMDS_MeshNode.hxx"
00034 #include "SMDS_Mesh0DElement.hxx"
00035 #include "SMDS_MeshEdge.hxx"
00036 #include "SMDS_MeshFace.hxx"
00037 #include "SMDS_MeshVolume.hxx"
00038 #include "SMESHDS_Hypothesis.hxx"
00039 #include "SMESHDS_SubMesh.hxx"
00040 #include "SMESHDS_Script.hxx"
00041 
00042 #include <TopTools_IndexedMapOfShape.hxx>
00043 #include <TopoDS_Shape.hxx>
00044 #include <TopoDS_Solid.hxx>
00045 #include <TopoDS_Shell.hxx>
00046 #include <TopoDS_Face.hxx>
00047 #include <TopoDS_Vertex.hxx>
00048 #include <TopoDS_Edge.hxx>
00049 
00050 #include <NCollection_DataMap.hxx>
00051 #include <map>
00052 /*
00053  * Using of native hash_map isn't portable and don't work on WIN32 platform.
00054  * So this functionality implement on new NCollection_DataMap technology
00055  */
00056 #include "SMESHDS_DataMapOfShape.hxx"
00057 
00058 class SMESHDS_GroupBase;
00059 class DownIdType;
00060 
00061 class SMESHDS_EXPORT SMESHDS_Mesh:public SMDS_Mesh{
00062 public:
00063   SMESHDS_Mesh(int theMeshID, bool theIsEmbeddedMode);
00064   bool IsEmbeddedMode();
00065   void SetPersistentId(int id);
00066   int GetPersistentId() const;
00067 
00068   void ShapeToMesh(const TopoDS_Shape & S);
00069   TopoDS_Shape ShapeToMesh() const;
00070   bool AddHypothesis(const TopoDS_Shape & SS, const SMESHDS_Hypothesis * H);
00071   bool RemoveHypothesis(const TopoDS_Shape & S, const SMESHDS_Hypothesis * H);
00072   
00073   virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID);
00074   virtual SMDS_MeshNode* AddNode(double x, double y, double z);
00075   
00076   virtual SMDS_Mesh0DElement* Add0DElementWithID(int nodeID, int ID);
00077   virtual SMDS_Mesh0DElement* Add0DElementWithID(const SMDS_MeshNode * node, int ID);
00078   virtual SMDS_Mesh0DElement* Add0DElement      (const SMDS_MeshNode * node);
00079   
00080   virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID);
00081   virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
00082                                        const SMDS_MeshNode * n2, 
00083                                        int ID);
00084   virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
00085                                  const SMDS_MeshNode * n2);
00086   
00087   // 2d order edge with 3 nodes: n12 - node between n1 and n2
00088   virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int n12, int ID);
00089   virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
00090                                        const SMDS_MeshNode * n2, 
00091                                        const SMDS_MeshNode * n12, 
00092                                        int ID);
00093   virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
00094                                  const SMDS_MeshNode * n2,
00095                                  const SMDS_MeshNode * n12);
00096 
00097   virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID);
00098   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
00099                                        const SMDS_MeshNode * n2,
00100                                        const SMDS_MeshNode * n3, 
00101                                        int ID);
00102   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00103                                  const SMDS_MeshNode * n2,
00104                                  const SMDS_MeshNode * n3);
00105 
00106   virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID);
00107   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
00108                                        const SMDS_MeshNode * n2,
00109                                        const SMDS_MeshNode * n3,
00110                                        const SMDS_MeshNode * n4, 
00111                                        int ID);
00112   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00113                                  const SMDS_MeshNode * n2,
00114                                  const SMDS_MeshNode * n3,
00115                                  const SMDS_MeshNode * n4);
00116 
00117   // 2d order triangle of 6 nodes
00118   virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3,
00119                                        int n12,int n23,int n31, int ID);
00120   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
00121                                        const SMDS_MeshNode * n2,
00122                                        const SMDS_MeshNode * n3, 
00123                                        const SMDS_MeshNode * n12,
00124                                        const SMDS_MeshNode * n23,
00125                                        const SMDS_MeshNode * n31, 
00126                                        int ID);
00127   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00128                                  const SMDS_MeshNode * n2,
00129                                  const SMDS_MeshNode * n3,
00130                                  const SMDS_MeshNode * n12,
00131                                  const SMDS_MeshNode * n23,
00132                                  const SMDS_MeshNode * n31);
00133 
00134   // 2d order quadrangle
00135   virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4,
00136                                        int n12,int n23,int n34,int n41, int ID);
00137   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
00138                                        const SMDS_MeshNode * n2,
00139                                        const SMDS_MeshNode * n3,
00140                                        const SMDS_MeshNode * n4, 
00141                                        const SMDS_MeshNode * n12,
00142                                        const SMDS_MeshNode * n23,
00143                                        const SMDS_MeshNode * n34,
00144                                        const SMDS_MeshNode * n41, 
00145                                        int ID);
00146   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00147                                  const SMDS_MeshNode * n2,
00148                                  const SMDS_MeshNode * n3,
00149                                  const SMDS_MeshNode * n4,
00150                                  const SMDS_MeshNode * n12,
00151                                  const SMDS_MeshNode * n23,
00152                                  const SMDS_MeshNode * n34,
00153                                  const SMDS_MeshNode * n41);
00154 
00155   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID);
00156   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00157                                            const SMDS_MeshNode * n2,
00158                                            const SMDS_MeshNode * n3,
00159                                            const SMDS_MeshNode * n4, 
00160                                            int ID);
00161   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00162                                      const SMDS_MeshNode * n2,
00163                                      const SMDS_MeshNode * n3,
00164                                      const SMDS_MeshNode * n4);
00165 
00166   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int ID);
00167   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00168                                            const SMDS_MeshNode * n2,
00169                                            const SMDS_MeshNode * n3,
00170                                            const SMDS_MeshNode * n4,
00171                                            const SMDS_MeshNode * n5, 
00172                                            int ID);
00173   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00174                                      const SMDS_MeshNode * n2,
00175                                      const SMDS_MeshNode * n3,
00176                                      const SMDS_MeshNode * n4,
00177                                      const SMDS_MeshNode * n5);
00178 
00179   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int ID);
00180   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00181                                            const SMDS_MeshNode * n2,
00182                                            const SMDS_MeshNode * n3,
00183                                            const SMDS_MeshNode * n4,
00184                                            const SMDS_MeshNode * n5,
00185                                            const SMDS_MeshNode * n6, 
00186                                            int ID);
00187   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00188                                      const SMDS_MeshNode * n2,
00189                                      const SMDS_MeshNode * n3,
00190                                      const SMDS_MeshNode * n4,
00191                                      const SMDS_MeshNode * n5,
00192                                      const SMDS_MeshNode * n6);
00193 
00194   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int ID);
00195   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00196                                            const SMDS_MeshNode * n2,
00197                                            const SMDS_MeshNode * n3,
00198                                            const SMDS_MeshNode * n4,
00199                                            const SMDS_MeshNode * n5,
00200                                            const SMDS_MeshNode * n6,
00201                                            const SMDS_MeshNode * n7,
00202                                            const SMDS_MeshNode * n8, 
00203                                            int ID);
00204   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00205                                      const SMDS_MeshNode * n2,
00206                                      const SMDS_MeshNode * n3,
00207                                      const SMDS_MeshNode * n4,
00208                                      const SMDS_MeshNode * n5,
00209                                      const SMDS_MeshNode * n6,
00210                                      const SMDS_MeshNode * n7,
00211                                      const SMDS_MeshNode * n8);
00212   
00213   // 2d order tetrahedron of 10 nodes
00214   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00215                                            int n12,int n23,int n31,
00216                                            int n14,int n24,int n34, int ID);
00217   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00218                                            const SMDS_MeshNode * n2,
00219                                            const SMDS_MeshNode * n3,
00220                                            const SMDS_MeshNode * n4, 
00221                                            const SMDS_MeshNode * n12,
00222                                            const SMDS_MeshNode * n23,
00223                                            const SMDS_MeshNode * n31,
00224                                            const SMDS_MeshNode * n14, 
00225                                            const SMDS_MeshNode * n24,
00226                                            const SMDS_MeshNode * n34, 
00227                                            int ID);
00228   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00229                                      const SMDS_MeshNode * n2,
00230                                      const SMDS_MeshNode * n3,
00231                                      const SMDS_MeshNode * n4,
00232                                      const SMDS_MeshNode * n12,
00233                                      const SMDS_MeshNode * n23,
00234                                      const SMDS_MeshNode * n31,
00235                                      const SMDS_MeshNode * n14, 
00236                                      const SMDS_MeshNode * n24,
00237                                      const SMDS_MeshNode * n34);
00238 
00239   // 2d order pyramid of 13 nodes
00240   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5,
00241                                            int n12,int n23,int n34,int n41,
00242                                            int n15,int n25,int n35,int n45,
00243                                            int ID);
00244   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00245                                            const SMDS_MeshNode * n2,
00246                                            const SMDS_MeshNode * n3,
00247                                            const SMDS_MeshNode * n4,
00248                                            const SMDS_MeshNode * n5, 
00249                                            const SMDS_MeshNode * n12,
00250                                            const SMDS_MeshNode * n23,
00251                                            const SMDS_MeshNode * n34,
00252                                            const SMDS_MeshNode * n41, 
00253                                            const SMDS_MeshNode * n15,
00254                                            const SMDS_MeshNode * n25,
00255                                            const SMDS_MeshNode * n35,
00256                                            const SMDS_MeshNode * n45, 
00257                                            int ID);
00258   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00259                                      const SMDS_MeshNode * n2,
00260                                      const SMDS_MeshNode * n3,
00261                                      const SMDS_MeshNode * n4,
00262                                      const SMDS_MeshNode * n5,
00263                                      const SMDS_MeshNode * n12,
00264                                      const SMDS_MeshNode * n23,
00265                                      const SMDS_MeshNode * n34,
00266                                      const SMDS_MeshNode * n41, 
00267                                      const SMDS_MeshNode * n15,
00268                                      const SMDS_MeshNode * n25,
00269                                      const SMDS_MeshNode * n35,
00270                                      const SMDS_MeshNode * n45);
00271 
00272   // 2d order Pentahedron with 15 nodes
00273   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3,
00274                                            int n4, int n5, int n6,
00275                                            int n12,int n23,int n31,
00276                                            int n45,int n56,int n64,
00277                                            int n14,int n25,int n36,
00278                                            int ID);
00279   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00280                                            const SMDS_MeshNode * n2,
00281                                            const SMDS_MeshNode * n3,
00282                                            const SMDS_MeshNode * n4,
00283                                            const SMDS_MeshNode * n5,
00284                                            const SMDS_MeshNode * n6, 
00285                                            const SMDS_MeshNode * n12,
00286                                            const SMDS_MeshNode * n23,
00287                                            const SMDS_MeshNode * n31, 
00288                                            const SMDS_MeshNode * n45,
00289                                            const SMDS_MeshNode * n56,
00290                                            const SMDS_MeshNode * n64, 
00291                                            const SMDS_MeshNode * n14,
00292                                            const SMDS_MeshNode * n25,
00293                                            const SMDS_MeshNode * n36, 
00294                                            int ID);
00295   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00296                                      const SMDS_MeshNode * n2,
00297                                      const SMDS_MeshNode * n3,
00298                                      const SMDS_MeshNode * n4,
00299                                      const SMDS_MeshNode * n5,
00300                                      const SMDS_MeshNode * n6, 
00301                                      const SMDS_MeshNode * n12,
00302                                      const SMDS_MeshNode * n23,
00303                                      const SMDS_MeshNode * n31, 
00304                                      const SMDS_MeshNode * n45,
00305                                      const SMDS_MeshNode * n56,
00306                                      const SMDS_MeshNode * n64, 
00307                                      const SMDS_MeshNode * n14,
00308                                      const SMDS_MeshNode * n25,
00309                                      const SMDS_MeshNode * n36);
00310 
00311   // 2d order Hexahedrons with 20 nodes
00312   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00313                                            int n5, int n6, int n7, int n8,
00314                                            int n12,int n23,int n34,int n41,
00315                                            int n56,int n67,int n78,int n85,
00316                                            int n15,int n26,int n37,int n48,
00317                                            int ID);
00318   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00319                                            const SMDS_MeshNode * n2,
00320                                            const SMDS_MeshNode * n3,
00321                                            const SMDS_MeshNode * n4,
00322                                            const SMDS_MeshNode * n5,
00323                                            const SMDS_MeshNode * n6,
00324                                            const SMDS_MeshNode * n7,
00325                                            const SMDS_MeshNode * n8, 
00326                                            const SMDS_MeshNode * n12,
00327                                            const SMDS_MeshNode * n23,
00328                                            const SMDS_MeshNode * n34,
00329                                            const SMDS_MeshNode * n41, 
00330                                            const SMDS_MeshNode * n56,
00331                                            const SMDS_MeshNode * n67,
00332                                            const SMDS_MeshNode * n78,
00333                                            const SMDS_MeshNode * n85, 
00334                                            const SMDS_MeshNode * n15,
00335                                            const SMDS_MeshNode * n26,
00336                                            const SMDS_MeshNode * n37,
00337                                            const SMDS_MeshNode * n48, 
00338                                            int ID);
00339   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00340                                      const SMDS_MeshNode * n2,
00341                                      const SMDS_MeshNode * n3,
00342                                      const SMDS_MeshNode * n4,
00343                                      const SMDS_MeshNode * n5,
00344                                      const SMDS_MeshNode * n6,
00345                                      const SMDS_MeshNode * n7,
00346                                      const SMDS_MeshNode * n8, 
00347                                      const SMDS_MeshNode * n12,
00348                                      const SMDS_MeshNode * n23,
00349                                      const SMDS_MeshNode * n34,
00350                                      const SMDS_MeshNode * n41, 
00351                                      const SMDS_MeshNode * n56,
00352                                      const SMDS_MeshNode * n67,
00353                                      const SMDS_MeshNode * n78,
00354                                      const SMDS_MeshNode * n85, 
00355                                      const SMDS_MeshNode * n15,
00356                                      const SMDS_MeshNode * n26,
00357                                      const SMDS_MeshNode * n37,
00358                                      const SMDS_MeshNode * n48);
00359 
00360   virtual SMDS_MeshFace* AddPolygonalFaceWithID (const std::vector<int>& nodes_ids,
00361                                                  const int               ID);
00362 
00363   virtual SMDS_MeshFace* AddPolygonalFaceWithID (const std::vector<const SMDS_MeshNode*>& nodes,
00364                                                  const int                                ID);
00365 
00366   virtual SMDS_MeshFace* AddPolygonalFace (const std::vector<const SMDS_MeshNode*>& nodes);
00367 
00368   virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
00369                            (const std::vector<int>& nodes_ids,
00370                             const std::vector<int>& quantities,
00371                             const int               ID);
00372 
00373   virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
00374                            (const std::vector<const SMDS_MeshNode*>& nodes,
00375                             const std::vector<int>&                  quantities,
00376                             const int                                ID);
00377 
00378   virtual SMDS_MeshVolume* AddPolyhedralVolume
00379                            (const std::vector<const SMDS_MeshNode*>& nodes,
00380                             const std::vector<int>&                  quantities);
00381 
00382   void MoveNode(const SMDS_MeshNode *, double x, double y, double z);
00383   virtual void RemoveNode(const SMDS_MeshNode *);
00384   void RemoveElement(const SMDS_MeshElement *);
00385 
00390   void RemoveFreeNode   (const SMDS_MeshNode *,    SMESHDS_SubMesh *, bool fromGroups=true);
00391   void RemoveFreeElement(const SMDS_MeshElement *, SMESHDS_SubMesh *, bool fromGroups=true);
00392 
00393   void ClearMesh();
00394 
00395   bool ChangeElementNodes(const SMDS_MeshElement * elem,
00396                           const SMDS_MeshNode    * nodes[],
00397                           const int                nbnodes);
00398   bool ChangePolygonNodes(const SMDS_MeshElement * elem,
00399                           std::vector<const SMDS_MeshNode*> nodes);
00400   bool ChangePolyhedronNodes(const SMDS_MeshElement * elem,
00401                              std::vector<const SMDS_MeshNode*> nodes,
00402                              std::vector<int>                  quantities);
00403   bool ModifyCellNodes(int smdsVolId, std::map<int,int> localClonedNodeIds);
00404   void Renumber (const bool isNodes, const int startID=1, const int deltaID=1);
00405 
00406   void SetNodeInVolume(SMDS_MeshNode * aNode, const TopoDS_Shell & S);
00407   void SetNodeInVolume(SMDS_MeshNode * aNode, const TopoDS_Solid & S);
00408   void SetNodeOnFace(SMDS_MeshNode * aNode, const TopoDS_Face & S, double u=0., double v=0.);
00409   void SetNodeOnEdge(SMDS_MeshNode * aNode, const TopoDS_Edge & S, double u=0.);
00410   void SetNodeOnVertex(SMDS_MeshNode * aNode, const TopoDS_Vertex & S);
00411   void UnSetNodeOnShape(const SMDS_MeshNode * aNode);
00412   void SetMeshElementOnShape(const SMDS_MeshElement * anElt,
00413                              const TopoDS_Shape & S);
00414   void UnSetMeshElementOnShape(const SMDS_MeshElement * anElt,
00415                                const TopoDS_Shape & S);
00416   bool HasMeshElements(const TopoDS_Shape & S) const;
00417   SMESHDS_SubMesh * MeshElements(const TopoDS_Shape & S) const;
00418   SMESHDS_SubMesh * MeshElements(const int Index) const;
00419   std::list<int> SubMeshIndices() const;
00420   const std::map<int,SMESHDS_SubMesh*>& SubMeshes() const
00421   { return myShapeIndexToSubMesh; }
00422 
00423   bool HasHypothesis(const TopoDS_Shape & S);
00424   const std::list<const SMESHDS_Hypothesis*>& GetHypothesis(const TopoDS_Shape & S) const;
00425   SMESHDS_Script * GetScript();
00426   void ClearScript();
00427   int ShapeToIndex(const TopoDS_Shape & aShape) const;
00428   const TopoDS_Shape& IndexToShape(int ShapeIndex) const;
00429   int MaxShapeIndex() const { return myIndexToShape.Extent(); }
00430   int MaxSubMeshIndex() const;
00431 
00432   SMESHDS_SubMesh * NewSubMesh(int Index);
00433   int AddCompoundSubmesh(const TopoDS_Shape& S, TopAbs_ShapeEnum type = TopAbs_SHAPE);
00434   void SetNodeInVolume(const SMDS_MeshNode * aNode, int Index);
00435   void SetNodeOnFace(SMDS_MeshNode * aNode, int Index , double u=0., double v=0.);
00436   void SetNodeOnEdge(SMDS_MeshNode * aNode, int Index , double u=0.);
00437   void SetNodeOnVertex(SMDS_MeshNode * aNode, int Index);
00438   void SetMeshElementOnShape(const SMDS_MeshElement * anElt, int Index);
00439 
00440   void AddGroup (SMESHDS_GroupBase* theGroup)      { myGroups.insert(theGroup); }
00441   void RemoveGroup (SMESHDS_GroupBase* theGroup)   { myGroups.erase(theGroup); }
00442   int GetNbGroups() const                      { return myGroups.size(); }
00443   const std::set<SMESHDS_GroupBase*>& GetGroups() const { return myGroups; }
00444 
00445   bool IsGroupOfSubShapes (const TopoDS_Shape& aSubShape) const;
00446 
00447   virtual void compactMesh();
00448   void CleanDownWardConnectivity();
00449   void BuildDownWardConnectivity(bool withEdges);
00450 
00451   ~SMESHDS_Mesh();
00452   
00453 private:
00454   void addNodeToSubmesh( const SMDS_MeshNode* aNode, int Index )
00455   {
00456     //Update or build submesh
00457     std::map<int,SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.find( Index );
00458     if ( it == myShapeIndexToSubMesh.end() )
00459       it = myShapeIndexToSubMesh.insert( std::make_pair(Index, new SMESHDS_SubMesh(this, Index) )).first;
00460     it->second->AddNode( aNode ); // add aNode to submesh
00461   }
00462   
00463   /*int HashCode( const TopoDS_Shape& S, const Standard_Integer theUpper ) const
00464   {
00465       return S.HashCode(2147483647);
00466   }*/ 
00467 
00468   typedef std::list<const SMESHDS_Hypothesis*> THypList;
00469 
00470   typedef NCollection_DataMap< TopoDS_Shape, THypList > ShapeToHypothesis;
00471 
00472   ShapeToHypothesis          myShapeToHypothesis;
00473 
00474   int                        myMeshID, myPersistentID;
00475   TopoDS_Shape               myShape;
00476 
00477   typedef std::map<int,SMESHDS_SubMesh*> TShapeIndexToSubMesh;
00478   TShapeIndexToSubMesh myShapeIndexToSubMesh;
00479 
00480   TopTools_IndexedMapOfShape myIndexToShape;
00481 
00482   typedef std::set<SMESHDS_GroupBase*> TGroups;
00483   TGroups myGroups;
00484 
00485   SMESHDS_Script*            myScript;
00486   bool                       myIsEmbeddedMode;
00487 
00488   // optimize addition of nodes/elements to submeshes by, SetNodeInVolume() etc:
00489   // avoid search of submeshes in maps
00490   bool add( const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh );
00491   SMESHDS_SubMesh* getSubmesh( const TopoDS_Shape & shape);
00492   SMESHDS_SubMesh* getSubmesh( const int            Index );
00493   int                        myCurSubID;
00494   TopoDS_Shape               myCurSubShape;
00495   SMESHDS_SubMesh*           myCurSubMesh;
00496 };
00497 
00498 
00499 #endif
Copyright © 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
Copyright © 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS