Version: 6.3.1

src/SMDS/SMDS_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 SMDS : implementaion of Salome mesh data structure
00024 //  File   : SMDS_Mesh.hxx
00025 //  Module : SMESH
00026 //
00027 #ifndef _SMDS_Mesh_HeaderFile
00028 #define _SMDS_Mesh_HeaderFile
00029 
00030 #include "SMESH_SMDS.hxx"
00031 
00032 #include "SMDS_MeshNode.hxx"
00033 #include "SMDS_MeshCell.hxx"
00034 #include "SMDS_Mesh0DElement.hxx"
00035 #include "SMDS_MeshEdge.hxx"
00036 #include "SMDS_MeshFace.hxx"
00037 #include "SMDS_MeshVolume.hxx"
00038 #include "SMDS_MeshNodeIDFactory.hxx"
00039 #include "SMDS_MeshElementIDFactory.hxx"
00040 #include "SMDS_MeshInfo.hxx"
00041 #include "SMDS_ElemIterator.hxx"
00042 #include "SMDS_VolumeOfNodes.hxx"
00043 #include "SMDS_VtkEdge.hxx"
00044 #include "SMDS_VtkFace.hxx"
00045 #include "SMDS_VtkVolume.hxx"
00046 #include "ObjectPool.hxx"
00047 #include "SMDS_UnstructuredGrid.hxx"
00048 
00049 #include <boost/shared_ptr.hpp>
00050 #include <set>
00051 #include <list>
00052 #include <vector>
00053 #include <vtkSystemIncludes.h>
00054 
00055 #include "Utils_SALOME_Exception.hxx"
00056 #define MYASSERT(val) if (!(val)) throw SALOME_Exception(LOCALIZED("assertion not verified"));
00057 
00058 class SMDS_EXPORT SMDS_Mesh:public SMDS_MeshObject{
00059 public:
00060   friend class SMDS_MeshIDFactory;
00061   friend class SMDS_MeshNodeIDFactory;
00062   friend class SMDS_MeshElementIDFactory;
00063   friend class SMDS_MeshVolumeVtkNodes;
00064   friend class SMDS_MeshNode;
00065 
00066   SMDS_Mesh();
00067   
00069   static std::vector<SMDS_Mesh*> _meshList;
00070 
00072   inline SMDS_UnstructuredGrid* getGrid() {return myGrid; }
00073   inline int getMeshId() {return myMeshId; }
00074 
00075   SMDS_NodeIteratorPtr nodesIterator          (bool idInceasingOrder=false) const;
00076   SMDS_0DElementIteratorPtr elements0dIterator(bool idInceasingOrder=false) const;
00077   SMDS_EdgeIteratorPtr edgesIterator          (bool idInceasingOrder=false) const;
00078   SMDS_FaceIteratorPtr facesIterator          (bool idInceasingOrder=false) const;
00079   SMDS_VolumeIteratorPtr volumesIterator      (bool idInceasingOrder=false) const;
00080   SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
00081 
00082   SMDSAbs_ElementType GetElementType( const int id, const bool iselem ) const;
00083 
00084   SMDS_Mesh *AddSubMesh();
00085 
00086   virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID);
00087   virtual SMDS_MeshNode* AddNode(double x, double y, double z);
00088 
00089   virtual SMDS_Mesh0DElement* Add0DElementWithID(int n, int ID);
00090   virtual SMDS_Mesh0DElement* Add0DElementWithID(const SMDS_MeshNode * n, int ID);
00091   virtual SMDS_Mesh0DElement* Add0DElement      (const SMDS_MeshNode * n);
00092 
00093   virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID);
00094   virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
00095                                        const SMDS_MeshNode * n2,
00096                                        int ID);
00097   virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
00098                                  const SMDS_MeshNode * n2);
00099 
00100   // 2d order edge with 3 nodes: n12 - node between n1 and n2
00101   virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int n12, int ID);
00102   virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
00103                                        const SMDS_MeshNode * n2,
00104                                        const SMDS_MeshNode * n12,
00105                                        int ID);
00106   virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
00107                                  const SMDS_MeshNode * n2,
00108                                  const SMDS_MeshNode * n12);
00109 
00110   virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID);
00111   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
00112                                        const SMDS_MeshNode * n2,
00113                                        const SMDS_MeshNode * n3,
00114                                        int ID);
00115   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00116                                  const SMDS_MeshNode * n2,
00117                                  const SMDS_MeshNode * n3);
00118 
00119   virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, 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 * n4,
00124                                        int ID);
00125   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00126                                  const SMDS_MeshNode * n2,
00127                                  const SMDS_MeshNode * n3,
00128                                  const SMDS_MeshNode * n4);
00129 
00130   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
00131                                        const SMDS_MeshEdge * e2,
00132                                        const SMDS_MeshEdge * e3, int ID);
00133   virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
00134                                  const SMDS_MeshEdge * e2,
00135                                  const SMDS_MeshEdge * e3);
00136 
00137   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
00138                                        const SMDS_MeshEdge * e2,
00139                                        const SMDS_MeshEdge * e3,
00140                                        const SMDS_MeshEdge * e4, int ID);
00141   virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
00142                                  const SMDS_MeshEdge * e2,
00143                                  const SMDS_MeshEdge * e3,
00144                                  const SMDS_MeshEdge * e4);
00145 
00146   // 2d order triangle of 6 nodes
00147   virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3,
00148                                        int n12,int n23,int n31, int ID);
00149   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
00150                                        const SMDS_MeshNode * n2,
00151                                        const SMDS_MeshNode * n3,
00152                                        const SMDS_MeshNode * n12,
00153                                        const SMDS_MeshNode * n23,
00154                                        const SMDS_MeshNode * n31,
00155                                        int ID);
00156   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00157                                  const SMDS_MeshNode * n2,
00158                                  const SMDS_MeshNode * n3,
00159                                  const SMDS_MeshNode * n12,
00160                                  const SMDS_MeshNode * n23,
00161                                  const SMDS_MeshNode * n31);
00162 
00163   // 2d order quadrangle
00164   virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4,
00165                                        int n12,int n23,int n34,int n41, int ID);
00166   virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
00167                                        const SMDS_MeshNode * n2,
00168                                        const SMDS_MeshNode * n3,
00169                                        const SMDS_MeshNode * n4,
00170                                        const SMDS_MeshNode * n12,
00171                                        const SMDS_MeshNode * n23,
00172                                        const SMDS_MeshNode * n34,
00173                                        const SMDS_MeshNode * n41,
00174                                        int ID);
00175   virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
00176                                  const SMDS_MeshNode * n2,
00177                                  const SMDS_MeshNode * n3,
00178                                  const SMDS_MeshNode * n4,
00179                                  const SMDS_MeshNode * n12,
00180                                  const SMDS_MeshNode * n23,
00181                                  const SMDS_MeshNode * n34,
00182                                  const SMDS_MeshNode * n41);
00183 
00184   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID);
00185   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00186                                            const SMDS_MeshNode * n2,
00187                                            const SMDS_MeshNode * n3,
00188                                            const SMDS_MeshNode * n4,
00189                                            int ID);
00190   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00191                                      const SMDS_MeshNode * n2,
00192                                      const SMDS_MeshNode * n3,
00193                                      const SMDS_MeshNode * n4);
00194 
00195   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00196                                            int n5, int ID);
00197   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00198                                            const SMDS_MeshNode * n2,
00199                                            const SMDS_MeshNode * n3,
00200                                            const SMDS_MeshNode * n4,
00201                                            const SMDS_MeshNode * n5,
00202                                            int ID);
00203   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00204                                      const SMDS_MeshNode * n2,
00205                                      const SMDS_MeshNode * n3,
00206                                      const SMDS_MeshNode * n4,
00207                                      const SMDS_MeshNode * n5);
00208 
00209   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00210                                            int n5, int n6, int ID);
00211   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00212                                            const SMDS_MeshNode * n2,
00213                                            const SMDS_MeshNode * n3,
00214                                            const SMDS_MeshNode * n4,
00215                                            const SMDS_MeshNode * n5,
00216                                            const SMDS_MeshNode * n6,
00217                                            int ID);
00218   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00219                                      const SMDS_MeshNode * n2,
00220                                      const SMDS_MeshNode * n3,
00221                                      const SMDS_MeshNode * n4,
00222                                      const SMDS_MeshNode * n5,
00223                                      const SMDS_MeshNode * n6);
00224 
00225   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00226                                            int n5, int n6, int n7, int n8, int ID);
00227   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00228                                            const SMDS_MeshNode * n2,
00229                                            const SMDS_MeshNode * n3,
00230                                            const SMDS_MeshNode * n4,
00231                                            const SMDS_MeshNode * n5,
00232                                            const SMDS_MeshNode * n6,
00233                                            const SMDS_MeshNode * n7,
00234                                            const SMDS_MeshNode * n8,
00235                                            int ID);
00236   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00237                                      const SMDS_MeshNode * n2,
00238                                      const SMDS_MeshNode * n3,
00239                                      const SMDS_MeshNode * n4,
00240                                      const SMDS_MeshNode * n5,
00241                                      const SMDS_MeshNode * n6,
00242                                      const SMDS_MeshNode * n7,
00243                                      const SMDS_MeshNode * n8);
00244 
00245   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
00246                                            const SMDS_MeshFace * f2,
00247                                            const SMDS_MeshFace * f3,
00248                                            const SMDS_MeshFace * f4, int ID);
00249   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
00250                                      const SMDS_MeshFace * f2,
00251                                      const SMDS_MeshFace * f3,
00252                                      const SMDS_MeshFace * f4);
00253 
00254   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
00255                                            const SMDS_MeshFace * f2,
00256                                            const SMDS_MeshFace * f3,
00257                                            const SMDS_MeshFace * f4,
00258                                            const SMDS_MeshFace * f5, int ID);
00259   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
00260                                      const SMDS_MeshFace * f2,
00261                                      const SMDS_MeshFace * f3,
00262                                      const SMDS_MeshFace * f4,
00263                                      const SMDS_MeshFace * f5);
00264 
00265   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
00266                                            const SMDS_MeshFace * f2,
00267                                            const SMDS_MeshFace * f3,
00268                                            const SMDS_MeshFace * f4,
00269                                            const SMDS_MeshFace * f5,
00270                                            const SMDS_MeshFace * f6, int ID);
00271   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
00272                                      const SMDS_MeshFace * f2,
00273                                      const SMDS_MeshFace * f3,
00274                                      const SMDS_MeshFace * f4,
00275                                      const SMDS_MeshFace * f5,
00276                                      const SMDS_MeshFace * f6);
00277 
00278   // 2d order tetrahedron of 10 nodes
00279   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00280                                            int n12,int n23,int n31,
00281                                            int n14,int n24,int n34, int ID);
00282   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00283                                            const SMDS_MeshNode * n2,
00284                                            const SMDS_MeshNode * n3,
00285                                            const SMDS_MeshNode * n4,
00286                                            const SMDS_MeshNode * n12,
00287                                            const SMDS_MeshNode * n23,
00288                                            const SMDS_MeshNode * n31,
00289                                            const SMDS_MeshNode * n14,
00290                                            const SMDS_MeshNode * n24,
00291                                            const SMDS_MeshNode * n34,
00292                                            int ID);
00293   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00294                                      const SMDS_MeshNode * n2,
00295                                      const SMDS_MeshNode * n3,
00296                                      const SMDS_MeshNode * n4,
00297                                      const SMDS_MeshNode * n12,
00298                                      const SMDS_MeshNode * n23,
00299                                      const SMDS_MeshNode * n31,
00300                                      const SMDS_MeshNode * n14,
00301                                      const SMDS_MeshNode * n24,
00302                                      const SMDS_MeshNode * n34);
00303 
00304   // 2d order pyramid of 13 nodes
00305   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5,
00306                                            int n12,int n23,int n34,int n41,
00307                                            int n15,int n25,int n35,int n45,
00308                                            int ID);
00309   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00310                                            const SMDS_MeshNode * n2,
00311                                            const SMDS_MeshNode * n3,
00312                                            const SMDS_MeshNode * n4,
00313                                            const SMDS_MeshNode * n5,
00314                                            const SMDS_MeshNode * n12,
00315                                            const SMDS_MeshNode * n23,
00316                                            const SMDS_MeshNode * n34,
00317                                            const SMDS_MeshNode * n41,
00318                                            const SMDS_MeshNode * n15,
00319                                            const SMDS_MeshNode * n25,
00320                                            const SMDS_MeshNode * n35,
00321                                            const SMDS_MeshNode * n45,
00322                                            int ID);
00323   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00324                                      const SMDS_MeshNode * n2,
00325                                      const SMDS_MeshNode * n3,
00326                                      const SMDS_MeshNode * n4,
00327                                      const SMDS_MeshNode * n5,
00328                                      const SMDS_MeshNode * n12,
00329                                      const SMDS_MeshNode * n23,
00330                                      const SMDS_MeshNode * n34,
00331                                      const SMDS_MeshNode * n41,
00332                                      const SMDS_MeshNode * n15,
00333                                      const SMDS_MeshNode * n25,
00334                                      const SMDS_MeshNode * n35,
00335                                      const SMDS_MeshNode * n45);
00336 
00337   // 2d order Pentahedron with 15 nodes
00338   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3,
00339                                            int n4, int n5, int n6,
00340                                            int n12,int n23,int n31,
00341                                            int n45,int n56,int n64,
00342                                            int n14,int n25,int n36,
00343                                            int ID);
00344   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00345                                            const SMDS_MeshNode * n2,
00346                                            const SMDS_MeshNode * n3,
00347                                            const SMDS_MeshNode * n4,
00348                                            const SMDS_MeshNode * n5,
00349                                            const SMDS_MeshNode * n6,
00350                                            const SMDS_MeshNode * n12,
00351                                            const SMDS_MeshNode * n23,
00352                                            const SMDS_MeshNode * n31,
00353                                            const SMDS_MeshNode * n45,
00354                                            const SMDS_MeshNode * n56,
00355                                            const SMDS_MeshNode * n64,
00356                                            const SMDS_MeshNode * n14,
00357                                            const SMDS_MeshNode * n25,
00358                                            const SMDS_MeshNode * n36,
00359                                            int ID);
00360   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00361                                      const SMDS_MeshNode * n2,
00362                                      const SMDS_MeshNode * n3,
00363                                      const SMDS_MeshNode * n4,
00364                                      const SMDS_MeshNode * n5,
00365                                      const SMDS_MeshNode * n6,
00366                                      const SMDS_MeshNode * n12,
00367                                      const SMDS_MeshNode * n23,
00368                                      const SMDS_MeshNode * n31,
00369                                      const SMDS_MeshNode * n45,
00370                                      const SMDS_MeshNode * n56,
00371                                      const SMDS_MeshNode * n64,
00372                                      const SMDS_MeshNode * n14,
00373                                      const SMDS_MeshNode * n25,
00374                                      const SMDS_MeshNode * n36);
00375 
00376   // 2d oreder Hexahedrons with 20 nodes
00377   virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
00378                                            int n5, int n6, int n7, int n8,
00379                                            int n12,int n23,int n34,int n41,
00380                                            int n56,int n67,int n78,int n85,
00381                                            int n15,int n26,int n37,int n48,
00382                                            int ID);
00383   virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
00384                                            const SMDS_MeshNode * n2,
00385                                            const SMDS_MeshNode * n3,
00386                                            const SMDS_MeshNode * n4,
00387                                            const SMDS_MeshNode * n5,
00388                                            const SMDS_MeshNode * n6,
00389                                            const SMDS_MeshNode * n7,
00390                                            const SMDS_MeshNode * n8,
00391                                            const SMDS_MeshNode * n12,
00392                                            const SMDS_MeshNode * n23,
00393                                            const SMDS_MeshNode * n34,
00394                                            const SMDS_MeshNode * n41,
00395                                            const SMDS_MeshNode * n56,
00396                                            const SMDS_MeshNode * n67,
00397                                            const SMDS_MeshNode * n78,
00398                                            const SMDS_MeshNode * n85,
00399                                            const SMDS_MeshNode * n15,
00400                                            const SMDS_MeshNode * n26,
00401                                            const SMDS_MeshNode * n37,
00402                                            const SMDS_MeshNode * n48,
00403                                            int ID);
00404   virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
00405                                      const SMDS_MeshNode * n2,
00406                                      const SMDS_MeshNode * n3,
00407                                      const SMDS_MeshNode * n4,
00408                                      const SMDS_MeshNode * n5,
00409                                      const SMDS_MeshNode * n6,
00410                                      const SMDS_MeshNode * n7,
00411                                      const SMDS_MeshNode * n8,
00412                                      const SMDS_MeshNode * n12,
00413                                      const SMDS_MeshNode * n23,
00414                                      const SMDS_MeshNode * n34,
00415                                      const SMDS_MeshNode * n41,
00416                                      const SMDS_MeshNode * n56,
00417                                      const SMDS_MeshNode * n67,
00418                                      const SMDS_MeshNode * n78,
00419                                      const SMDS_MeshNode * n85,
00420                                      const SMDS_MeshNode * n15,
00421                                      const SMDS_MeshNode * n26,
00422                                      const SMDS_MeshNode * n37,
00423                                      const SMDS_MeshNode * n48);
00424 
00425   virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<int> nodes_ids,
00426                                                  const int        ID);
00427 
00428   virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<const SMDS_MeshNode*> nodes,
00429                                                  const int                         ID);
00430 
00431   virtual SMDS_MeshFace* AddPolygonalFace (std::vector<const SMDS_MeshNode*> nodes);
00432 
00433   virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
00434                            (std::vector<int> nodes_ids,
00435                             std::vector<int> quantities,
00436                             const int        ID);
00437 
00438   virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
00439                            (std::vector<const SMDS_MeshNode*> nodes,
00440                             std::vector<int>                  quantities,
00441                             const int                         ID);
00442 
00443   virtual SMDS_MeshVolume* AddPolyhedralVolume
00444                            (std::vector<const SMDS_MeshNode*> nodes,
00445                             std::vector<int>                  quantities);
00446 
00447   virtual SMDS_MeshVolume* AddVolumeFromVtkIds(const std::vector<vtkIdType>& vtkNodeIds);
00448 
00449   virtual SMDS_MeshVolume* AddVolumeFromVtkIdsWithID(const std::vector<vtkIdType>& vtkNodeIds,
00450                                                      const int ID);
00451 
00452   virtual void RemoveElement(const SMDS_MeshElement *        elem,
00453                              std::list<const SMDS_MeshElement *>& removedElems,
00454                              std::list<const SMDS_MeshElement *>& removedNodes,
00455                              const bool                      removenodes = false);
00456   virtual void RemoveElement(const SMDS_MeshElement * elem, bool removenodes = false);
00457   virtual void RemoveNode(const SMDS_MeshNode * node);
00458   virtual void Remove0DElement(const SMDS_Mesh0DElement * elem0d);
00459   virtual void RemoveEdge(const SMDS_MeshEdge * edge);
00460   virtual void RemoveFace(const SMDS_MeshFace * face);
00461   virtual void RemoveVolume(const SMDS_MeshVolume * volume);
00462 
00467   virtual void RemoveFreeElement(const SMDS_MeshElement * elem);
00468 
00469   virtual void Clear();
00470 
00471   virtual bool RemoveFromParent();
00472   virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh);
00473 
00474   bool ChangeElementNodes(const SMDS_MeshElement * elem,
00475                           const SMDS_MeshNode    * nodes[],
00476                           const int                nbnodes);
00477   bool ChangePolyhedronNodes(const SMDS_MeshElement *                 elem,
00478                              const std::vector<const SMDS_MeshNode*>& nodes,
00479                              const std::vector<int> &                 quantities);
00480 
00481   virtual void Renumber (const bool isNodes, const int startID = 1, const int deltaID = 1);
00482   // Renumber all nodes or elements.
00483   virtual void compactMesh();
00484 
00485   const SMDS_MeshNode *FindNode(int idnode) const;
00486   const SMDS_MeshNode *FindNodeVtk(int idnode) const;
00487   const SMDS_Mesh0DElement* Find0DElement(int idnode) const;
00488   const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const;
00489   const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2, int idnode3) const;
00490   const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const;
00491   const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const;
00492   const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3,
00493                                 int idnode4, int idnode5, int idnode6) const;
00494   const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4,
00495                                 int idnode5, int idnode6, int idnode7, int idnode8) const;
00496   const SMDS_MeshElement *FindElement(int IDelem) const;
00497   static const SMDS_Mesh0DElement* Find0DElement(const SMDS_MeshNode * n);
00498   static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
00499                                        const SMDS_MeshNode * n2);
00500   static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
00501                                        const SMDS_MeshNode * n2,
00502                                        const SMDS_MeshNode * n3);
00503   static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
00504                                        const SMDS_MeshNode *n2,
00505                                        const SMDS_MeshNode *n3);
00506   static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
00507                                        const SMDS_MeshNode *n2,
00508                                        const SMDS_MeshNode *n3,
00509                                        const SMDS_MeshNode *n4);
00510   static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
00511                                        const SMDS_MeshNode *n2,
00512                                        const SMDS_MeshNode *n3,
00513                                        const SMDS_MeshNode *n4,
00514                                        const SMDS_MeshNode *n5,
00515                                        const SMDS_MeshNode *n6);
00516   static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
00517                                        const SMDS_MeshNode *n2,
00518                                        const SMDS_MeshNode *n3,
00519                                        const SMDS_MeshNode *n4,
00520                                        const SMDS_MeshNode *n5,
00521                                        const SMDS_MeshNode *n6,
00522                                        const SMDS_MeshNode *n7,
00523                                        const SMDS_MeshNode *n8);
00524 
00525   const SMDS_MeshFace *FindFace(const std::vector<int>& nodes_ids) const;
00526   static const SMDS_MeshFace* FindFace(const std::vector<const SMDS_MeshNode *>& nodes);
00527   static const SMDS_MeshElement* FindElement(const std::vector<const SMDS_MeshNode *>& nodes,
00528                                              const SMDSAbs_ElementType                 type=SMDSAbs_All,
00529                                              const bool                                noMedium=true);
00530 
00536   static int CheckMemory(const bool doNotRaise=false) throw (std::bad_alloc);
00537 
00538   int MaxNodeID() const;
00539   int MinNodeID() const;
00540   int MaxElementID() const;
00541   int MinElementID() const;
00542 
00543   const SMDS_MeshInfo& GetMeshInfo() const { return myInfo; }
00544 
00545   int NbNodes() const;
00546   int Nb0DElements() const;
00547   int NbEdges() const;
00548   int NbFaces() const;
00549   int NbVolumes() const;
00550   int NbSubMesh() const;
00551   void DumpNodes() const;
00552   void Dump0DElements() const;
00553   void DumpEdges() const;
00554   void DumpFaces() const;
00555   void DumpVolumes() const;
00556   void DebugStats() const;
00557   SMDS_Mesh *boundaryFaces();
00558   SMDS_Mesh *boundaryEdges();
00559   virtual ~SMDS_Mesh();
00560   bool hasConstructionEdges();
00561   bool hasConstructionFaces();
00562   bool hasInverseElements();
00563   void setConstructionEdges(bool);
00564   void setConstructionFaces(bool);
00565   void setInverseElements(bool);
00566 
00573   bool Contains (const SMDS_MeshElement* elem) const;
00574 
00575   typedef std::vector<SMDS_MeshNode *> SetOfNodes;
00576   typedef std::vector<SMDS_MeshCell *> SetOfCells;
00577 
00578   void updateNodeMinMax();
00579   void updateBoundingBox();
00580   double getMaxDim();
00581   int fromVtkToSmds(int vtkid);
00582 
00583   void incrementNodesCapacity(int nbNodes);
00584   void incrementCellsCapacity(int nbCells);
00585   void adjustStructure();
00586   void dumpGrid(string ficdump="dumpGrid");
00587   static int chunkSize;
00588 
00590   inline void setMyModified() { this->myModified = true; }
00591 
00592   void Modified();
00593   unsigned long GetMTime();
00594   bool isCompacted();
00595 
00596 protected:
00597   SMDS_Mesh(SMDS_Mesh * parent);
00598 
00599   SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1,
00600                                  const SMDS_MeshNode * node2,
00601                                  const SMDS_MeshNode * node3,
00602                                  int ID);
00603   SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1,
00604                                    const SMDS_MeshNode * node2,
00605                                    const SMDS_MeshNode * node3,
00606                                    const SMDS_MeshNode * node4,
00607                                    int ID);
00608 //  SMDS_Mesh0DElement* Find0DElementOrCreate(const SMDS_MeshNode * n);
00609   SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1,
00610                                   const SMDS_MeshNode * n2);
00611   SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
00612                                   const SMDS_MeshNode *n2,
00613                                   const SMDS_MeshNode *n3);
00614   SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
00615                                   const SMDS_MeshNode *n2,
00616                                   const SMDS_MeshNode *n3,
00617                                   const SMDS_MeshNode *n4);
00618 
00619   bool registerElement(int ID, SMDS_MeshElement * element);
00620 
00621   void addChildrenWithNodes(std::set<const SMDS_MeshElement*>& setOfChildren,
00622                             const SMDS_MeshElement * element,
00623                             std::set<const SMDS_MeshElement*>& nodes);
00624 
00625   inline void adjustmyCellsCapacity(int ID)
00626   {
00627     assert(ID >= 0);
00628     myElementIDFactory->adjustMaxId(ID);
00629     if (ID >= myCells.size())
00630       myCells.resize(ID+SMDS_Mesh::chunkSize,0);
00631   }
00632 
00633   inline void adjustBoundingBox(double x, double y, double z)
00634   {
00635     if (x > xmax) xmax = x;
00636     else if (x < xmin) xmin = x;
00637     if (y > ymax) ymax = y;
00638     else if (y < ymin) ymin = y;
00639     if (z > zmax) zmax = z;
00640     else if (z < zmin) zmin = z;
00641   }
00642 
00643   // Fields PRIVATE
00644 
00646   int myMeshId;
00647 
00649   SMDS_UnstructuredGrid*      myGrid;
00650 
00652   ObjectPool<SMDS_MeshNode>* myNodePool;
00653 
00655   ObjectPool<SMDS_VtkVolume>* myVolumePool;
00656   ObjectPool<SMDS_VtkFace>* myFacePool;
00657   ObjectPool<SMDS_VtkEdge>* myEdgePool;
00658 
00660   SetOfNodes             myNodes;
00661 
00663   SetOfCells             myCells;
00664 
00666   //std::vector<int>       myCellIdSmdsToVtk;
00667 
00669   std::vector<int>       myCellIdVtkToSmds;
00670 
00671   SMDS_Mesh *            myParent;
00672   std::list<SMDS_Mesh *> myChildren;
00673   SMDS_MeshNodeIDFactory *myNodeIDFactory;
00674   SMDS_MeshElementIDFactory *myElementIDFactory;
00675   SMDS_MeshInfo          myInfo;
00676 
00678   unsigned long myModifTime, myCompactTime;
00679 
00680   int myNodeMin;
00681   int myNodeMax;
00682 
00683   bool myHasConstructionEdges;
00684   bool myHasConstructionFaces;
00685   bool myHasInverseElements;
00686 
00688   bool myModified;
00689 
00690   double xmin;
00691   double xmax;
00692   double ymin;
00693   double ymax;
00694   double zmin;
00695   double zmax;
00696 };
00697 
00698 
00699 #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