00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
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
00054
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
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
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
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
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
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
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
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
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 );
00461 }
00462
00463
00464
00465
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
00489
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