1 // SMESH SMDS : implementaion of Salome mesh data structure
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #pragma warning(disable:4786)
26 #include "utilities.h"
27 #include "SMDS_Mesh.hxx"
28 #include "SMDS_VolumeOfNodes.hxx"
29 #include "SMDS_VolumeOfFaces.hxx"
30 #include "SMDS_FaceOfNodes.hxx"
31 #include "SMDS_FaceOfEdges.hxx"
32 #include "SMDS_PolyhedralVolumeOfNodes.hxx"
33 #include "SMDS_PolygonalFaceOfNodes.hxx"
34 #include "SMDS_QuadraticEdge.hxx"
35 #include "SMDS_QuadraticFaceOfNodes.hxx"
36 #include "SMDS_QuadraticVolumeOfNodes.hxx"
42 ///////////////////////////////////////////////////////////////////////////////
43 /// Create a new mesh object
44 ///////////////////////////////////////////////////////////////////////////////
45 SMDS_Mesh::SMDS_Mesh()
47 myNodeIDFactory(new SMDS_MeshElementIDFactory()),
48 myElementIDFactory(new SMDS_MeshElementIDFactory()),
49 myHasConstructionEdges(false), myHasConstructionFaces(false),
50 myHasInverseElements(true)
54 ///////////////////////////////////////////////////////////////////////////////
55 /// Create a new child mesh
56 /// Note that the tree structure of SMDS_Mesh seems to be unused in this version
57 /// (2003-09-08) of SMESH
58 ///////////////////////////////////////////////////////////////////////////////
59 SMDS_Mesh::SMDS_Mesh(SMDS_Mesh * parent)
60 :myParent(parent), myNodeIDFactory(parent->myNodeIDFactory),
61 myElementIDFactory(parent->myElementIDFactory),
62 myHasConstructionEdges(false), myHasConstructionFaces(false),
63 myHasInverseElements(true)
67 ///////////////////////////////////////////////////////////////////////////////
68 ///Create a submesh and add it to the current mesh
69 ///////////////////////////////////////////////////////////////////////////////
71 SMDS_Mesh *SMDS_Mesh::AddSubMesh()
73 SMDS_Mesh *submesh = new SMDS_Mesh(this);
74 myChildren.insert(myChildren.end(), submesh);
78 ///////////////////////////////////////////////////////////////////////////////
79 ///create a MeshNode and add it to the current Mesh
80 ///An ID is automatically assigned to the node.
81 ///@return : The created node
82 ///////////////////////////////////////////////////////////////////////////////
84 SMDS_MeshNode * SMDS_Mesh::AddNode(double x, double y, double z)
86 return SMDS_Mesh::AddNodeWithID(x,y,z,myNodeIDFactory->GetFreeID());
89 ///////////////////////////////////////////////////////////////////////////////
90 ///create a MeshNode and add it to the current Mesh
91 ///@param ID : The ID of the MeshNode to create
92 ///@return : The created node or NULL if a node with this ID already exists
93 ///////////////////////////////////////////////////////////////////////////////
94 SMDS_MeshNode * SMDS_Mesh::AddNodeWithID(double x, double y, double z, int ID)
96 // find the MeshNode corresponding to ID
97 const SMDS_MeshElement *node = myNodeIDFactory->MeshElement(ID);
99 SMDS_MeshNode * node=new SMDS_MeshNode(x, y, z);
101 myNodeIDFactory->BindID(ID,node);
107 ///////////////////////////////////////////////////////////////////////////////
108 /// create a MeshEdge and add it to the current Mesh
109 /// @return : The created MeshEdge
110 ///////////////////////////////////////////////////////////////////////////////
112 SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(int idnode1, int idnode2, int ID)
114 SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
115 SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
116 if(!node1 || !node2) return NULL;
117 return SMDS_Mesh::AddEdgeWithID(node1, node2, ID);
120 ///////////////////////////////////////////////////////////////////////////////
121 /// create a MeshEdge and add it to the current Mesh
122 /// @return : The created MeshEdge
123 ///////////////////////////////////////////////////////////////////////////////
125 SMDS_MeshEdge* SMDS_Mesh::AddEdge(const SMDS_MeshNode * node1,
126 const SMDS_MeshNode * node2)
128 return SMDS_Mesh::AddEdgeWithID(node1, node2, myElementIDFactory->GetFreeID());
131 ///////////////////////////////////////////////////////////////////////////////
132 /// Create a new edge and at it to the mesh
133 /// @param idnode1 ID of the first node
134 /// @param idnode2 ID of the second node
135 /// @param ID ID of the edge to create
136 /// @return The created edge or NULL if an element with this ID already exists or
137 /// if input nodes are not found.
138 ///////////////////////////////////////////////////////////////////////////////
140 SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
141 const SMDS_MeshNode * n2,
144 if ( !n1 || !n2 ) return 0;
146 SMDS_MeshEdge * edge=new SMDS_MeshEdge(n1,n2);
147 if(myElementIDFactory->BindID(ID, edge)) {
148 SMDS_MeshNode *node1,*node2;
149 node1=const_cast<SMDS_MeshNode*>(n1);
150 node2=const_cast<SMDS_MeshNode*>(n2);
151 node1->AddInverseElement(edge);
152 node2->AddInverseElement(edge);
162 ///////////////////////////////////////////////////////////////////////////////
163 /// Add a triangle defined by its nodes. An ID is automatically affected to the
165 ///////////////////////////////////////////////////////////////////////////////
167 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1,
168 const SMDS_MeshNode * n2,
169 const SMDS_MeshNode * n3)
171 return SMDS_Mesh::AddFaceWithID(n1,n2,n3, myElementIDFactory->GetFreeID());
174 ///////////////////////////////////////////////////////////////////////////////
175 /// Add a triangle defined by its nodes IDs
176 ///////////////////////////////////////////////////////////////////////////////
178 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1, int idnode2, int idnode3, int ID)
180 SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
181 SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
182 SMDS_MeshNode * node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
183 if(!node1 || !node2 || !node3) return NULL;
184 return SMDS_Mesh::AddFaceWithID(node1, node2, node3, ID);
187 ///////////////////////////////////////////////////////////////////////////////
188 /// Add a triangle defined by its nodes
189 ///////////////////////////////////////////////////////////////////////////////
191 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
192 const SMDS_MeshNode * n2,
193 const SMDS_MeshNode * n3,
196 SMDS_MeshFace * face=createTriangle(n1, n2, n3);
198 if (face && !registerElement(ID, face)) {
199 RemoveElement(face, false);
205 ///////////////////////////////////////////////////////////////////////////////
206 /// Add a quadrangle defined by its nodes. An ID is automatically affected to the
208 ///////////////////////////////////////////////////////////////////////////////
210 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1,
211 const SMDS_MeshNode * n2,
212 const SMDS_MeshNode * n3,
213 const SMDS_MeshNode * n4)
215 return SMDS_Mesh::AddFaceWithID(n1,n2,n3, n4, myElementIDFactory->GetFreeID());
218 ///////////////////////////////////////////////////////////////////////////////
219 /// Add a quadrangle defined by its nodes IDs
220 ///////////////////////////////////////////////////////////////////////////////
222 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1,
228 SMDS_MeshNode *node1, *node2, *node3, *node4;
229 node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
230 node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
231 node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
232 node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
233 if(!node1 || !node2 || !node3 || !node4) return NULL;
234 return SMDS_Mesh::AddFaceWithID(node1, node2, node3, node4, ID);
237 ///////////////////////////////////////////////////////////////////////////////
238 /// Add a quadrangle defined by its nodes
239 ///////////////////////////////////////////////////////////////////////////////
241 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
242 const SMDS_MeshNode * n2,
243 const SMDS_MeshNode * n3,
244 const SMDS_MeshNode * n4,
247 SMDS_MeshFace * face=createQuadrangle(n1, n2, n3, n4);
249 if (face && !registerElement(ID, face)) {
250 RemoveElement(face, false);
256 ///////////////////////////////////////////////////////////////////////////////
257 /// Add a triangle defined by its edges. An ID is automatically assigned to the
259 ///////////////////////////////////////////////////////////////////////////////
261 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1,
262 const SMDS_MeshEdge * e2,
263 const SMDS_MeshEdge * e3)
265 if (!hasConstructionEdges())
267 return AddFaceWithID(e1,e2,e3, myElementIDFactory->GetFreeID());
270 ///////////////////////////////////////////////////////////////////////////////
271 /// Add a triangle defined by its edges
272 ///////////////////////////////////////////////////////////////////////////////
274 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1,
275 const SMDS_MeshEdge * e2,
276 const SMDS_MeshEdge * e3,
279 if (!hasConstructionEdges())
281 if ( !e1 || !e2 || !e3 ) return 0;
283 SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3);
286 if (!registerElement(ID, face)) {
287 RemoveElement(face, false);
293 ///////////////////////////////////////////////////////////////////////////////
294 /// Add a quadrangle defined by its edges. An ID is automatically assigned to the
296 ///////////////////////////////////////////////////////////////////////////////
298 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1,
299 const SMDS_MeshEdge * e2,
300 const SMDS_MeshEdge * e3,
301 const SMDS_MeshEdge * e4)
303 if (!hasConstructionEdges())
305 return AddFaceWithID(e1,e2,e3,e4, myElementIDFactory->GetFreeID());
308 ///////////////////////////////////////////////////////////////////////////////
309 /// Add a quadrangle defined by its edges
310 ///////////////////////////////////////////////////////////////////////////////
312 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1,
313 const SMDS_MeshEdge * e2,
314 const SMDS_MeshEdge * e3,
315 const SMDS_MeshEdge * e4,
318 if (!hasConstructionEdges())
320 if ( !e1 || !e2 || !e3 || !e4 ) return 0;
321 SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3,e4);
324 if (!registerElement(ID, face))
326 RemoveElement(face, false);
332 ///////////////////////////////////////////////////////////////////////////////
333 ///Create a new tetrahedron and add it to the mesh.
334 ///@return The created tetrahedron
335 ///////////////////////////////////////////////////////////////////////////////
337 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
338 const SMDS_MeshNode * n2,
339 const SMDS_MeshNode * n3,
340 const SMDS_MeshNode * n4)
342 int ID = myElementIDFactory->GetFreeID();
343 SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID);
344 if(v==NULL) myElementIDFactory->ReleaseID(ID);
348 ///////////////////////////////////////////////////////////////////////////////
349 ///Create a new tetrahedron and add it to the mesh.
350 ///@param ID The ID of the new volume
351 ///@return The created tetrahedron or NULL if an element with this ID already exists
352 ///or if input nodes are not found.
353 ///////////////////////////////////////////////////////////////////////////////
355 SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
361 SMDS_MeshNode *node1, *node2, *node3, *node4;
362 node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
363 node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
364 node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
365 node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
366 if(!node1 || !node2 || !node3 || !node4) return NULL;
367 return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, ID);
370 ///////////////////////////////////////////////////////////////////////////////
371 ///Create a new tetrahedron and add it to the mesh.
372 ///@param ID The ID of the new volume
373 ///@return The created tetrahedron
374 ///////////////////////////////////////////////////////////////////////////////
376 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
377 const SMDS_MeshNode * n2,
378 const SMDS_MeshNode * n3,
379 const SMDS_MeshNode * n4,
382 SMDS_MeshVolume* volume = 0;
383 if ( !n1 || !n2 || !n3 || !n4) return volume;
384 if(hasConstructionFaces()) {
385 SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3);
386 SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n4);
387 SMDS_MeshFace * f3=FindFaceOrCreate(n1,n3,n4);
388 SMDS_MeshFace * f4=FindFaceOrCreate(n2,n3,n4);
389 volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4);
390 myVolumes.Add(volume);
392 else if(hasConstructionEdges()) {
393 MESSAGE("Error : Not implemented");
397 volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4);
398 myVolumes.Add(volume);
401 if (!registerElement(ID, volume)) {
402 RemoveElement(volume, false);
408 ///////////////////////////////////////////////////////////////////////////////
409 ///Create a new pyramid and add it to the mesh.
410 ///Nodes 1,2,3 and 4 define the base of the pyramid
411 ///@return The created pyramid
412 ///////////////////////////////////////////////////////////////////////////////
414 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
415 const SMDS_MeshNode * n2,
416 const SMDS_MeshNode * n3,
417 const SMDS_MeshNode * n4,
418 const SMDS_MeshNode * n5)
420 int ID = myElementIDFactory->GetFreeID();
421 SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID);
422 if(v==NULL) myElementIDFactory->ReleaseID(ID);
426 ///////////////////////////////////////////////////////////////////////////////
427 ///Create a new pyramid and add it to the mesh.
428 ///Nodes 1,2,3 and 4 define the base of the pyramid
429 ///@param ID The ID of the new volume
430 ///@return The created pyramid or NULL if an element with this ID already exists
431 ///or if input nodes are not found.
432 ///////////////////////////////////////////////////////////////////////////////
434 SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
441 SMDS_MeshNode *node1, *node2, *node3, *node4, *node5;
442 node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
443 node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
444 node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
445 node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
446 node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5);
447 if(!node1 || !node2 || !node3 || !node4 || !node5) return NULL;
448 return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, ID);
451 ///////////////////////////////////////////////////////////////////////////////
452 ///Create a new pyramid and add it to the mesh.
453 ///Nodes 1,2,3 and 4 define the base of the pyramid
454 ///@param ID The ID of the new volume
455 ///@return The created pyramid
456 ///////////////////////////////////////////////////////////////////////////////
458 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
459 const SMDS_MeshNode * n2,
460 const SMDS_MeshNode * n3,
461 const SMDS_MeshNode * n4,
462 const SMDS_MeshNode * n5,
465 SMDS_MeshVolume* volume = 0;
466 if ( !n1 || !n2 || !n3 || !n4 || !n5) return volume;
467 if(hasConstructionFaces()) {
468 SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4);
469 SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n5);
470 SMDS_MeshFace * f3=FindFaceOrCreate(n2,n3,n5);
471 SMDS_MeshFace * f4=FindFaceOrCreate(n3,n4,n5);
472 volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4);
473 myVolumes.Add(volume);
475 else if(hasConstructionEdges()) {
476 MESSAGE("Error : Not implemented");
480 volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5);
481 myVolumes.Add(volume);
484 if (!registerElement(ID, volume)) {
485 RemoveElement(volume, false);
491 ///////////////////////////////////////////////////////////////////////////////
492 ///Create a new prism and add it to the mesh.
493 ///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle.
494 ///@return The created prism
495 ///////////////////////////////////////////////////////////////////////////////
497 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
498 const SMDS_MeshNode * n2,
499 const SMDS_MeshNode * n3,
500 const SMDS_MeshNode * n4,
501 const SMDS_MeshNode * n5,
502 const SMDS_MeshNode * n6)
504 int ID = myElementIDFactory->GetFreeID();
505 SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID);
506 if(v==NULL) myElementIDFactory->ReleaseID(ID);
510 ///////////////////////////////////////////////////////////////////////////////
511 ///Create a new prism and add it to the mesh.
512 ///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle.
513 ///@param ID The ID of the new volume
514 ///@return The created prism or NULL if an element with this ID already exists
515 ///or if input nodes are not found.
516 ///////////////////////////////////////////////////////////////////////////////
518 SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
526 SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6;
527 node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
528 node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
529 node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
530 node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
531 node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5);
532 node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6);
533 if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6) return NULL;
534 return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6, ID);
537 ///////////////////////////////////////////////////////////////////////////////
538 ///Create a new prism and add it to the mesh.
539 ///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle.
540 ///@param ID The ID of the new volume
541 ///@return The created prism
542 ///////////////////////////////////////////////////////////////////////////////
544 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
545 const SMDS_MeshNode * n2,
546 const SMDS_MeshNode * n3,
547 const SMDS_MeshNode * n4,
548 const SMDS_MeshNode * n5,
549 const SMDS_MeshNode * n6,
552 SMDS_MeshVolume* volume = 0;
553 if ( !n1 || !n2 || !n3 || !n4 || !n5 || !n6) return volume;
554 if(hasConstructionFaces()) {
555 SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3);
556 SMDS_MeshFace * f2=FindFaceOrCreate(n4,n5,n6);
557 SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n5,n2);
558 SMDS_MeshFace * f4=FindFaceOrCreate(n2,n5,n6,n3);
559 SMDS_MeshFace * f5=FindFaceOrCreate(n3,n6,n4,n1);
560 volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5);
561 myVolumes.Add(volume);
563 else if(hasConstructionEdges()) {
564 MESSAGE("Error : Not implemented");
568 volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6);
569 myVolumes.Add(volume);
572 if (!registerElement(ID, volume)) {
573 RemoveElement(volume, false);
579 ///////////////////////////////////////////////////////////////////////////////
580 ///Create a new hexahedron and add it to the mesh.
581 ///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges.
582 ///@return The created hexahedron
583 ///////////////////////////////////////////////////////////////////////////////
585 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
586 const SMDS_MeshNode * n2,
587 const SMDS_MeshNode * n3,
588 const SMDS_MeshNode * n4,
589 const SMDS_MeshNode * n5,
590 const SMDS_MeshNode * n6,
591 const SMDS_MeshNode * n7,
592 const SMDS_MeshNode * n8)
594 int ID = myElementIDFactory->GetFreeID();
595 SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID);
596 if(v==NULL) myElementIDFactory->ReleaseID(ID);
600 ///////////////////////////////////////////////////////////////////////////////
601 ///Create a new hexahedron and add it to the mesh.
602 ///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges.
603 ///@param ID The ID of the new volume
604 ///@return The created hexahedron or NULL if an element with this ID already
605 ///exists or if input nodes are not found.
606 ///////////////////////////////////////////////////////////////////////////////
608 SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
618 SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6, *node7, *node8;
619 node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
620 node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
621 node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
622 node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
623 node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5);
624 node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6);
625 node7 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode7);
626 node8 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode8);
627 if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6 || !node7 || !node8)
629 return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6,
633 ///////////////////////////////////////////////////////////////////////////////
634 ///Create a new hexahedron and add it to the mesh.
635 ///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges.
636 ///@param ID The ID of the new volume
637 ///@return The created prism or NULL if an element with this ID already exists
638 ///or if input nodes are not found.
639 ///////////////////////////////////////////////////////////////////////////////
641 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
642 const SMDS_MeshNode * n2,
643 const SMDS_MeshNode * n3,
644 const SMDS_MeshNode * n4,
645 const SMDS_MeshNode * n5,
646 const SMDS_MeshNode * n6,
647 const SMDS_MeshNode * n7,
648 const SMDS_MeshNode * n8,
651 SMDS_MeshVolume* volume = 0;
652 if ( !n1 || !n2 || !n3 || !n4 || !n5 || !n6 || !n7 || !n8) return volume;
653 if(hasConstructionFaces()) {
654 SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4);
655 SMDS_MeshFace * f2=FindFaceOrCreate(n5,n6,n7,n8);
656 SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n8,n5);
657 SMDS_MeshFace * f4=FindFaceOrCreate(n1,n2,n6,n5);
658 SMDS_MeshFace * f5=FindFaceOrCreate(n2,n3,n7,n6);
659 SMDS_MeshFace * f6=FindFaceOrCreate(n3,n4,n8,n7);
660 volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6);
661 myVolumes.Add(volume);
663 else if(hasConstructionEdges()) {
664 MESSAGE("Error : Not implemented");
668 // volume=new SMDS_HexahedronOfNodes(n1,n2,n3,n4,n5,n6,n7,n8);
669 volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6,n7,n8);
670 myVolumes.Add(volume);
673 if (!registerElement(ID, volume)) {
674 RemoveElement(volume, false);
680 ///////////////////////////////////////////////////////////////////////////////
681 ///Create a new tetrahedron defined by its faces and add it to the mesh.
682 ///@return The created tetrahedron
683 ///////////////////////////////////////////////////////////////////////////////
685 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1,
686 const SMDS_MeshFace * f2,
687 const SMDS_MeshFace * f3,
688 const SMDS_MeshFace * f4)
690 if (!hasConstructionFaces())
692 return AddVolumeWithID(f1,f2,f3,f4, myElementIDFactory->GetFreeID());
695 ///////////////////////////////////////////////////////////////////////////////
696 ///Create a new tetrahedron defined by its faces and add it to the mesh.
697 ///@param ID The ID of the new volume
698 ///@return The created tetrahedron
699 ///////////////////////////////////////////////////////////////////////////////
701 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1,
702 const SMDS_MeshFace * f2,
703 const SMDS_MeshFace * f3,
704 const SMDS_MeshFace * f4,
707 if (!hasConstructionFaces())
709 if ( !f1 || !f2 || !f3 || !f4) return 0;
710 SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4);
711 myVolumes.Add(volume);
713 if (!registerElement(ID, volume)) {
714 RemoveElement(volume, false);
720 ///////////////////////////////////////////////////////////////////////////////
721 ///Create a new pyramid defined by its faces and add it to the mesh.
722 ///@return The created pyramid
723 ///////////////////////////////////////////////////////////////////////////////
725 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1,
726 const SMDS_MeshFace * f2,
727 const SMDS_MeshFace * f3,
728 const SMDS_MeshFace * f4,
729 const SMDS_MeshFace * f5)
731 if (!hasConstructionFaces())
733 return AddVolumeWithID(f1,f2,f3,f4,f5, myElementIDFactory->GetFreeID());
736 ///////////////////////////////////////////////////////////////////////////////
737 ///Create a new pyramid defined by its faces and add it to the mesh.
738 ///@param ID The ID of the new volume
739 ///@return The created pyramid
740 ///////////////////////////////////////////////////////////////////////////////
742 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1,
743 const SMDS_MeshFace * f2,
744 const SMDS_MeshFace * f3,
745 const SMDS_MeshFace * f4,
746 const SMDS_MeshFace * f5,
749 if (!hasConstructionFaces())
751 if ( !f1 || !f2 || !f3 || !f4 || !f5) return 0;
752 SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5);
753 myVolumes.Add(volume);
755 if (!registerElement(ID, volume)) {
756 RemoveElement(volume, false);
762 ///////////////////////////////////////////////////////////////////////////////
763 ///Create a new prism defined by its faces and add it to the mesh.
764 ///@return The created prism
765 ///////////////////////////////////////////////////////////////////////////////
767 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1,
768 const SMDS_MeshFace * f2,
769 const SMDS_MeshFace * f3,
770 const SMDS_MeshFace * f4,
771 const SMDS_MeshFace * f5,
772 const SMDS_MeshFace * f6)
774 if (!hasConstructionFaces())
776 return AddVolumeWithID(f1,f2,f3,f4,f5,f6, myElementIDFactory->GetFreeID());
779 ///////////////////////////////////////////////////////////////////////////////
780 ///Create a new prism defined by its faces and add it to the mesh.
781 ///@param ID The ID of the new volume
782 ///@return The created prism
783 ///////////////////////////////////////////////////////////////////////////////
785 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1,
786 const SMDS_MeshFace * f2,
787 const SMDS_MeshFace * f3,
788 const SMDS_MeshFace * f4,
789 const SMDS_MeshFace * f5,
790 const SMDS_MeshFace * f6,
793 if (!hasConstructionFaces())
795 if ( !f1 || !f2 || !f3 || !f4 || !f5 || !f6) return 0;
796 SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6);
797 myVolumes.Add(volume);
799 if (!registerElement(ID, volume)) {
800 RemoveElement(volume, false);
806 ///////////////////////////////////////////////////////////////////////////////
807 /// Add a polygon defined by its nodes IDs
808 ///////////////////////////////////////////////////////////////////////////////
810 SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID (std::vector<int> nodes_ids,
813 int nbNodes = nodes_ids.size();
814 std::vector<const SMDS_MeshNode*> nodes (nbNodes);
815 for (int i = 0; i < nbNodes; i++) {
816 nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]);
817 if (!nodes[i]) return NULL;
819 return SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID);
822 ///////////////////////////////////////////////////////////////////////////////
823 /// Add a polygon defined by its nodes
824 ///////////////////////////////////////////////////////////////////////////////
826 SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID
827 (std::vector<const SMDS_MeshNode*> nodes,
830 SMDS_MeshFace * face;
832 if (hasConstructionEdges())
834 MESSAGE("Error : Not implemented");
839 for ( int i = 0; i < nodes.size(); ++i )
840 if ( !nodes[ i ] ) return 0;
841 face = new SMDS_PolygonalFaceOfNodes(nodes);
845 if (!registerElement(ID, face)) {
846 RemoveElement(face, false);
852 ///////////////////////////////////////////////////////////////////////////////
853 /// Add a polygon defined by its nodes.
854 /// An ID is automatically affected to the created face.
855 ///////////////////////////////////////////////////////////////////////////////
857 SMDS_MeshFace* SMDS_Mesh::AddPolygonalFace (std::vector<const SMDS_MeshNode*> nodes)
859 return SMDS_Mesh::AddPolygonalFaceWithID(nodes, myElementIDFactory->GetFreeID());
862 ///////////////////////////////////////////////////////////////////////////////
863 /// Create a new polyhedral volume and add it to the mesh.
864 /// @param ID The ID of the new volume
865 /// @return The created volume or NULL if an element with this ID already exists
866 /// or if input nodes are not found.
867 ///////////////////////////////////////////////////////////////////////////////
869 SMDS_MeshVolume * SMDS_Mesh::AddPolyhedralVolumeWithID
870 (std::vector<int> nodes_ids,
871 std::vector<int> quantities,
874 int nbNodes = nodes_ids.size();
875 std::vector<const SMDS_MeshNode*> nodes (nbNodes);
876 for (int i = 0; i < nbNodes; i++) {
877 nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]);
878 if (!nodes[i]) return NULL;
880 return SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
883 ///////////////////////////////////////////////////////////////////////////////
884 /// Create a new polyhedral volume and add it to the mesh.
885 /// @param ID The ID of the new volume
886 /// @return The created volume
887 ///////////////////////////////////////////////////////////////////////////////
889 SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolumeWithID
890 (std::vector<const SMDS_MeshNode*> nodes,
891 std::vector<int> quantities,
894 SMDS_MeshVolume* volume;
895 if (hasConstructionFaces()) {
896 MESSAGE("Error : Not implemented");
898 } else if (hasConstructionEdges()) {
899 MESSAGE("Error : Not implemented");
902 for ( int i = 0; i < nodes.size(); ++i )
903 if ( !nodes[ i ] ) return 0;
904 volume = new SMDS_PolyhedralVolumeOfNodes(nodes, quantities);
905 myVolumes.Add(volume);
908 if (!registerElement(ID, volume)) {
909 RemoveElement(volume, false);
915 ///////////////////////////////////////////////////////////////////////////////
916 /// Create a new polyhedral volume and add it to the mesh.
917 /// @return The created volume
918 ///////////////////////////////////////////////////////////////////////////////
920 SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolume
921 (std::vector<const SMDS_MeshNode*> nodes,
922 std::vector<int> quantities)
924 int ID = myElementIDFactory->GetFreeID();
925 SMDS_MeshVolume * v = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
926 if (v == NULL) myElementIDFactory->ReleaseID(ID);
930 ///////////////////////////////////////////////////////////////////////////////
931 /// Registers element with the given ID, maintains inverse connections
932 ///////////////////////////////////////////////////////////////////////////////
933 bool SMDS_Mesh::registerElement(int ID, SMDS_MeshElement * element)
935 if (myElementIDFactory->BindID(ID, element)) {
936 SMDS_ElemIteratorPtr it = element->nodesIterator();
938 SMDS_MeshNode *node = static_cast<SMDS_MeshNode*>
939 (const_cast<SMDS_MeshElement*>(it->next()));
940 node->AddInverseElement(element);
947 ///////////////////////////////////////////////////////////////////////////////
948 /// Return the node whose ID is 'ID'.
949 ///////////////////////////////////////////////////////////////////////////////
950 const SMDS_MeshNode * SMDS_Mesh::FindNode(int ID) const
952 return (const SMDS_MeshNode *)myNodeIDFactory->MeshElement(ID);
955 ///////////////////////////////////////////////////////////////////////////////
956 ///Create a triangle and add it to the current mesh. This methode do not bind a
957 ///ID to the create triangle.
958 ///////////////////////////////////////////////////////////////////////////////
959 SMDS_MeshFace * SMDS_Mesh::createTriangle(const SMDS_MeshNode * node1,
960 const SMDS_MeshNode * node2,
961 const SMDS_MeshNode * node3)
963 if ( !node1 || !node2 || !node3) return 0;
964 if(hasConstructionEdges())
966 SMDS_MeshEdge *edge1, *edge2, *edge3;
967 edge1=FindEdgeOrCreate(node1,node2);
968 edge2=FindEdgeOrCreate(node2,node3);
969 edge3=FindEdgeOrCreate(node3,node1);
971 SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3);
977 SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3);
983 ///////////////////////////////////////////////////////////////////////////////
984 ///Create a quadrangle and add it to the current mesh. This methode do not bind
985 ///a ID to the create triangle.
986 ///////////////////////////////////////////////////////////////////////////////
987 SMDS_MeshFace * SMDS_Mesh::createQuadrangle(const SMDS_MeshNode * node1,
988 const SMDS_MeshNode * node2,
989 const SMDS_MeshNode * node3,
990 const SMDS_MeshNode * node4)
992 if ( !node1 || !node2 || !node3 || !node4 ) return 0;
993 if(hasConstructionEdges())
995 SMDS_MeshEdge *edge1, *edge2, *edge3, *edge4;
996 edge1=FindEdgeOrCreate(node1,node2);
997 edge2=FindEdgeOrCreate(node2,node3);
998 edge3=FindEdgeOrCreate(node3,node4);
999 edge4=FindEdgeOrCreate(node4,node1);
1001 SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3,edge4);
1007 SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3,node4);
1013 ///////////////////////////////////////////////////////////////////////////////
1014 /// Remove a node and all the elements which own this node
1015 ///////////////////////////////////////////////////////////////////////////////
1017 void SMDS_Mesh::RemoveNode(const SMDS_MeshNode * node)
1019 RemoveElement(node, true);
1022 ///////////////////////////////////////////////////////////////////////////////
1023 /// Remove an edge and all the elements which own this edge
1024 ///////////////////////////////////////////////////////////////////////////////
1026 void SMDS_Mesh::RemoveEdge(const SMDS_MeshEdge * edge)
1028 RemoveElement(edge,true);
1031 ///////////////////////////////////////////////////////////////////////////////
1032 /// Remove an face and all the elements which own this face
1033 ///////////////////////////////////////////////////////////////////////////////
1035 void SMDS_Mesh::RemoveFace(const SMDS_MeshFace * face)
1037 RemoveElement(face, true);
1040 ///////////////////////////////////////////////////////////////////////////////
1042 ///////////////////////////////////////////////////////////////////////////////
1044 void SMDS_Mesh::RemoveVolume(const SMDS_MeshVolume * volume)
1046 RemoveElement(volume, true);
1049 //=======================================================================
1050 //function : RemoveFromParent
1052 //=======================================================================
1054 bool SMDS_Mesh::RemoveFromParent()
1056 if (myParent==NULL) return false;
1057 else return (myParent->RemoveSubMesh(this));
1060 //=======================================================================
1061 //function : RemoveSubMesh
1063 //=======================================================================
1065 bool SMDS_Mesh::RemoveSubMesh(const SMDS_Mesh * aMesh)
1069 list<SMDS_Mesh *>::iterator itmsh=myChildren.begin();
1070 for (; itmsh!=myChildren.end() && !found; itmsh++)
1072 SMDS_Mesh * submesh = *itmsh;
1073 if (submesh == aMesh)
1076 myChildren.erase(itmsh);
1083 //=======================================================================
1084 //function : ChangeElementNodes
1086 //=======================================================================
1088 bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem,
1089 const SMDS_MeshNode * nodes[],
1092 // keep current nodes of elem
1093 set<const SMDS_MeshElement*> oldNodes;
1094 SMDS_ElemIteratorPtr itn = elem->nodesIterator();
1096 oldNodes.insert( itn->next() );
1100 switch ( elem->GetType() )
1102 case SMDSAbs_Edge: {
1103 if ( nbnodes == 2 ) {
1104 const SMDS_MeshEdge* edge = dynamic_cast<const SMDS_MeshEdge*>( elem );
1106 Ok = const_cast<SMDS_MeshEdge*>( edge )->ChangeNodes( nodes[0], nodes[1] );
1108 else if ( nbnodes == 3 ) {
1109 const SMDS_QuadraticEdge* edge = dynamic_cast<const SMDS_QuadraticEdge*>( elem );
1111 Ok = const_cast<SMDS_QuadraticEdge*>( edge )->ChangeNodes( nodes[0], nodes[1], nodes[2] );
1115 case SMDSAbs_Face: {
1116 const SMDS_FaceOfNodes* face = dynamic_cast<const SMDS_FaceOfNodes*>( elem );
1118 Ok = const_cast<SMDS_FaceOfNodes*>( face )->ChangeNodes( nodes, nbnodes );
1121 const SMDS_QuadraticFaceOfNodes* QF =
1122 dynamic_cast<const SMDS_QuadraticFaceOfNodes*>( elem );
1124 Ok = const_cast<SMDS_QuadraticFaceOfNodes*>( QF )->ChangeNodes( nodes, nbnodes );
1128 const SMDS_PolygonalFaceOfNodes* face = dynamic_cast<const SMDS_PolygonalFaceOfNodes*>(elem);
1130 Ok = const_cast<SMDS_PolygonalFaceOfNodes*>(face)->ChangeNodes(nodes, nbnodes);
1137 //case SMDSAbs_PolygonalFace: {
1138 // const SMDS_PolygonalFaceOfNodes* face = dynamic_cast<const SMDS_PolygonalFaceOfNodes*>(elem);
1140 // Ok = const_cast<SMDS_PolygonalFaceOfNodes*>(face)->ChangeNodes(nodes, nbnodes);
1144 case SMDSAbs_Volume: {
1145 const SMDS_VolumeOfNodes* vol = dynamic_cast<const SMDS_VolumeOfNodes*>( elem );
1147 Ok = const_cast<SMDS_VolumeOfNodes*>( vol )->ChangeNodes( nodes, nbnodes );
1150 const SMDS_QuadraticVolumeOfNodes* QV = dynamic_cast<const SMDS_QuadraticVolumeOfNodes*>( elem );
1152 Ok = const_cast<SMDS_QuadraticVolumeOfNodes*>( QV )->ChangeNodes( nodes, nbnodes );
1158 MESSAGE ( "WRONG ELEM TYPE");
1161 if ( Ok ) { // update InverseElements
1163 // AddInverseElement to new nodes
1164 for ( int i = 0; i < nbnodes; i++ )
1165 if ( oldNodes.find( nodes[i] ) == oldNodes.end() )
1167 const_cast<SMDS_MeshNode*>( nodes[i] )->AddInverseElement( elem );
1169 // remove from oldNodes a node that remains in elem
1170 oldNodes.erase( nodes[i] );
1173 // RemoveInverseElement from the nodes removed from elem
1174 set<const SMDS_MeshElement*>::iterator it;
1175 for ( it = oldNodes.begin(); it != oldNodes.end(); it++ )
1177 SMDS_MeshNode * n = static_cast<SMDS_MeshNode *>
1178 (const_cast<SMDS_MeshElement *>( *it ));
1179 n->RemoveInverseElement( elem );
1183 //MESSAGE ( "::ChangeNodes() Ok = " << Ok);
1188 //=======================================================================
1189 //function : ChangePolyhedronNodes
1190 //purpose : to change nodes of polyhedral volume
1191 //=======================================================================
1192 bool SMDS_Mesh::ChangePolyhedronNodes (const SMDS_MeshElement * elem,
1193 std::vector<const SMDS_MeshNode*> nodes,
1194 std::vector<int> quantities)
1196 if (elem->GetType() != SMDSAbs_Volume) {
1197 MESSAGE("WRONG ELEM TYPE");
1201 const SMDS_PolyhedralVolumeOfNodes* vol = dynamic_cast<const SMDS_PolyhedralVolumeOfNodes*>(elem);
1206 // keep current nodes of elem
1207 set<const SMDS_MeshElement*> oldNodes;
1208 SMDS_ElemIteratorPtr itn = elem->nodesIterator();
1209 while (itn->more()) {
1210 oldNodes.insert(itn->next());
1214 bool Ok = const_cast<SMDS_PolyhedralVolumeOfNodes*>(vol)->ChangeNodes(nodes, quantities);
1219 // update InverseElements
1221 // AddInverseElement to new nodes
1222 int nbnodes = nodes.size();
1223 for (int i = 0; i < nbnodes; i++) {
1224 if (oldNodes.find(nodes[i]) == oldNodes.end()) {
1226 const_cast<SMDS_MeshNode*>(nodes[i])->AddInverseElement(elem);
1228 // remove from oldNodes a node that remains in elem
1229 oldNodes.erase(nodes[i]);
1233 // RemoveInverseElement from the nodes removed from elem
1234 set<const SMDS_MeshElement*>::iterator it;
1235 for (it = oldNodes.begin(); it != oldNodes.end(); it++) {
1236 SMDS_MeshNode * n = static_cast<SMDS_MeshNode *>
1237 (const_cast<SMDS_MeshElement *>( *it ));
1238 n->RemoveInverseElement(elem);
1245 //=======================================================================
1246 //function : FindEdge
1248 //=======================================================================
1250 const SMDS_MeshEdge* SMDS_Mesh::FindEdge(int idnode1, int idnode2) const
1252 const SMDS_MeshNode * node1=FindNode(idnode1);
1253 const SMDS_MeshNode * node2=FindNode(idnode2);
1254 if((node1==NULL)||(node2==NULL)) return NULL;
1255 return FindEdge(node1,node2);
1258 //#include "Profiler.h"
1259 const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1,
1260 const SMDS_MeshNode * node2)
1262 const SMDS_MeshEdge * toReturn=NULL;
1265 SMDS_ElemIteratorPtr it1=node1->GetInverseElementIterator(SMDSAbs_Edge);
1268 while(it1->more()) {
1269 const SMDS_MeshElement * e = it1->next();
1270 if ( e->NbNodes() == 2 && e->GetNodeIndex( node2 ) >= 0 ) {
1271 toReturn = static_cast<const SMDS_MeshEdge*>( e );
1280 //=======================================================================
1281 //function : FindEdgeOrCreate
1283 //=======================================================================
1285 SMDS_MeshEdge* SMDS_Mesh::FindEdgeOrCreate(const SMDS_MeshNode * node1,
1286 const SMDS_MeshNode * node2)
1288 if ( !node1 || !node2) return 0;
1289 SMDS_MeshEdge * toReturn=NULL;
1290 toReturn=const_cast<SMDS_MeshEdge*>(FindEdge(node1,node2));
1291 if(toReturn==NULL) {
1292 toReturn=new SMDS_MeshEdge(node1,node2);
1293 myEdges.Add(toReturn);
1299 //=======================================================================
1300 //function : FindEdge
1302 //=======================================================================
1304 const SMDS_MeshEdge* SMDS_Mesh::FindEdge(int idnode1, int idnode2,
1307 const SMDS_MeshNode * node1=FindNode(idnode1);
1308 const SMDS_MeshNode * node2=FindNode(idnode2);
1309 const SMDS_MeshNode * node3=FindNode(idnode3);
1310 return FindEdge(node1,node2,node3);
1313 const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1,
1314 const SMDS_MeshNode * node2,
1315 const SMDS_MeshNode * node3)
1317 SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Edge);
1318 while(it1->more()) {
1319 const SMDS_MeshElement * e = it1->next();
1320 if ( e->NbNodes() == 3 &&
1321 e->GetNodeIndex( node2 ) >= 0 &&
1322 e->GetNodeIndex( node3 ) >= 0 ) {
1323 return static_cast<const SMDS_MeshEdge*>( e );
1330 //=======================================================================
1331 //function : FindFace
1333 //=======================================================================
1335 const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2,
1338 const SMDS_MeshNode * node1=FindNode(idnode1);
1339 const SMDS_MeshNode * node2=FindNode(idnode2);
1340 const SMDS_MeshNode * node3=FindNode(idnode3);
1341 return FindFace(node1, node2, node3);
1344 const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
1345 const SMDS_MeshNode *node2,
1346 const SMDS_MeshNode *node3)
1348 SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
1349 while(it1->more()) {
1350 const SMDS_MeshElement * e = it1->next();
1351 if ( e->NbNodes() == 3 &&
1352 e->GetNodeIndex( node2 ) >= 0 &&
1353 e->GetNodeIndex( node3 ) >= 0 ) {
1354 return static_cast<const SMDS_MeshFace*>( e );
1360 SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(const SMDS_MeshNode *node1,
1361 const SMDS_MeshNode *node2,
1362 const SMDS_MeshNode *node3)
1364 SMDS_MeshFace * toReturn=NULL;
1365 toReturn = const_cast<SMDS_MeshFace*>(FindFace(node1,node2,node3));
1366 if(toReturn==NULL) {
1367 toReturn = createTriangle(node1,node2,node3);
1373 //=======================================================================
1374 //function : FindFace
1376 //=======================================================================
1378 const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2,
1379 int idnode3, int idnode4) const
1381 const SMDS_MeshNode * node1=FindNode(idnode1);
1382 const SMDS_MeshNode * node2=FindNode(idnode2);
1383 const SMDS_MeshNode * node3=FindNode(idnode3);
1384 const SMDS_MeshNode * node4=FindNode(idnode4);
1385 return FindFace(node1, node2, node3, node4);
1388 const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
1389 const SMDS_MeshNode *node2,
1390 const SMDS_MeshNode *node3,
1391 const SMDS_MeshNode *node4)
1393 SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
1394 while(it1->more()) {
1395 const SMDS_MeshElement* f = it1->next();
1396 if ( f->NbNodes() == 4 &&
1397 f->GetNodeIndex( node2 ) >= 0 &&
1398 f->GetNodeIndex( node3 ) >= 0 &&
1399 f->GetNodeIndex( node4 ) >= 0 )
1400 return static_cast<const SMDS_MeshFace *>( f );
1405 SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(const SMDS_MeshNode *node1,
1406 const SMDS_MeshNode *node2,
1407 const SMDS_MeshNode *node3,
1408 const SMDS_MeshNode *node4)
1410 SMDS_MeshFace * toReturn=NULL;
1411 toReturn=const_cast<SMDS_MeshFace*>(FindFace(node1,node2,node3,node4));
1412 if(toReturn==NULL) {
1413 toReturn=createQuadrangle(node1,node2,node3,node4);
1419 //=======================================================================
1420 //function : FindFace
1421 //purpose :quadratic triangle
1422 //=======================================================================
1424 const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2,
1425 int idnode3, int idnode4,
1426 int idnode5, int idnode6) const
1428 const SMDS_MeshNode * node1 = FindNode(idnode1);
1429 const SMDS_MeshNode * node2 = FindNode(idnode2);
1430 const SMDS_MeshNode * node3 = FindNode(idnode3);
1431 const SMDS_MeshNode * node4 = FindNode(idnode4);
1432 const SMDS_MeshNode * node5 = FindNode(idnode5);
1433 const SMDS_MeshNode * node6 = FindNode(idnode6);
1434 return FindFace(node1, node2, node3, node4, node5, node6);
1437 const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
1438 const SMDS_MeshNode *node2,
1439 const SMDS_MeshNode *node3,
1440 const SMDS_MeshNode *node4,
1441 const SMDS_MeshNode *node5,
1442 const SMDS_MeshNode *node6)
1444 SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
1445 while(it1->more()) {
1446 const SMDS_MeshElement* f = it1->next();
1447 if ( f->NbNodes() == 6 &&
1448 f->GetNodeIndex( node2 ) >= 0 &&
1449 f->GetNodeIndex( node3 ) >= 0 &&
1450 f->GetNodeIndex( node4 ) >= 0 &&
1451 f->GetNodeIndex( node5 ) >= 0 &&
1452 f->GetNodeIndex( node6 ) >= 0 )
1453 return static_cast<const SMDS_MeshFace *>( f );
1459 //=======================================================================
1460 //function : FindFace
1461 //purpose : quadratic quadrangle
1462 //=======================================================================
1464 const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2,
1465 int idnode3, int idnode4,
1466 int idnode5, int idnode6,
1467 int idnode7, int idnode8) const
1469 const SMDS_MeshNode * node1 = FindNode(idnode1);
1470 const SMDS_MeshNode * node2 = FindNode(idnode2);
1471 const SMDS_MeshNode * node3 = FindNode(idnode3);
1472 const SMDS_MeshNode * node4 = FindNode(idnode4);
1473 const SMDS_MeshNode * node5 = FindNode(idnode5);
1474 const SMDS_MeshNode * node6 = FindNode(idnode6);
1475 const SMDS_MeshNode * node7 = FindNode(idnode7);
1476 const SMDS_MeshNode * node8 = FindNode(idnode8);
1477 return FindFace(node1, node2, node3, node4, node5, node6, node7, node8);
1480 const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
1481 const SMDS_MeshNode *node2,
1482 const SMDS_MeshNode *node3,
1483 const SMDS_MeshNode *node4,
1484 const SMDS_MeshNode *node5,
1485 const SMDS_MeshNode *node6,
1486 const SMDS_MeshNode *node7,
1487 const SMDS_MeshNode *node8)
1489 SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
1490 while(it1->more()) {
1491 const SMDS_MeshElement* f = it1->next();
1492 if ( f->NbNodes() == 8 &&
1493 f->GetNodeIndex( node2 ) >= 0 &&
1494 f->GetNodeIndex( node3 ) >= 0 &&
1495 f->GetNodeIndex( node4 ) >= 0 &&
1496 f->GetNodeIndex( node5 ) >= 0 &&
1497 f->GetNodeIndex( node6 ) >= 0 &&
1498 f->GetNodeIndex( node7 ) >= 0 &&
1499 f->GetNodeIndex( node8 ) >= 0 )
1500 return static_cast<const SMDS_MeshFace *>( f );
1506 //=======================================================================
1507 //function : FindElement
1509 //=======================================================================
1511 const SMDS_MeshElement* SMDS_Mesh::FindElement(int IDelem) const
1513 return myElementIDFactory->MeshElement(IDelem);
1516 //=======================================================================
1517 //function : FindFace
1518 //purpose : find polygon
1519 //=======================================================================
1521 const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector<int> nodes_ids) const
1523 int nbnodes = nodes_ids.size();
1524 std::vector<const SMDS_MeshNode *> poly_nodes (nbnodes);
1525 for (int inode = 0; inode < nbnodes; inode++) {
1526 const SMDS_MeshNode * node = FindNode(nodes_ids[inode]);
1527 if (node == NULL) return NULL;
1529 return FindFace(poly_nodes);
1532 const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector<const SMDS_MeshNode *> nodes)
1534 if ( nodes.size() > 2 && nodes[0] ) {
1535 SMDS_ElemIteratorPtr itF = nodes[0]->GetInverseElementIterator(SMDSAbs_Face);
1536 while (itF->more()) {
1537 const SMDS_MeshElement* f = itF->next();
1538 if ( f->NbNodes() == nodes.size() ) {
1539 int ok = true, i = 1;
1540 while ( ok && i < nodes.size() )
1541 ok = ( f->GetNodeIndex( nodes[ i ] ) >= 0 );
1543 return static_cast<const SMDS_MeshFace *>( f );
1550 //=======================================================================
1551 //function : DumpNodes
1553 //=======================================================================
1555 void SMDS_Mesh::DumpNodes() const
1557 MESSAGE("dump nodes of mesh : ");
1558 SMDS_NodeIteratorPtr itnode=nodesIterator();
1559 while(itnode->more()) MESSAGE(itnode->next());
1562 //=======================================================================
1563 //function : DumpEdges
1565 //=======================================================================
1567 void SMDS_Mesh::DumpEdges() const
1569 MESSAGE("dump edges of mesh : ");
1570 SMDS_EdgeIteratorPtr itedge=edgesIterator();
1571 while(itedge->more()) MESSAGE(itedge->next());
1574 //=======================================================================
1575 //function : DumpFaces
1577 //=======================================================================
1579 void SMDS_Mesh::DumpFaces() const
1581 MESSAGE("dump faces of mesh : ");
1582 SMDS_FaceIteratorPtr itface=facesIterator();
1583 while(itface->more()) MESSAGE(itface->next());
1586 //=======================================================================
1587 //function : DumpVolumes
1589 //=======================================================================
1591 void SMDS_Mesh::DumpVolumes() const
1593 MESSAGE("dump volumes of mesh : ");
1594 SMDS_VolumeIteratorPtr itvol=volumesIterator();
1595 while(itvol->more()) MESSAGE(itvol->next());
1598 //=======================================================================
1599 //function : DebugStats
1601 //=======================================================================
1603 void SMDS_Mesh::DebugStats() const
1605 MESSAGE("Debug stats of mesh : ");
1607 MESSAGE("===== NODES ====="<<NbNodes());
1608 MESSAGE("===== EDGES ====="<<NbEdges());
1609 MESSAGE("===== FACES ====="<<NbFaces());
1610 MESSAGE("===== VOLUMES ====="<<NbVolumes());
1612 MESSAGE("End Debug stats of mesh ");
1616 SMDS_NodeIteratorPtr itnode=nodesIterator();
1617 int sizeofnodes = 0;
1618 int sizeoffaces = 0;
1620 while(itnode->more())
1622 const SMDS_MeshNode *node = itnode->next();
1624 sizeofnodes += sizeof(*node);
1626 SMDS_ElemIteratorPtr it = node->GetInverseElementIterator();
1629 const SMDS_MeshElement *me = it->next();
1630 sizeofnodes += sizeof(me);
1635 SMDS_FaceIteratorPtr itface=facesIterator();
1636 while(itface->more())
1638 const SMDS_MeshElement *face = itface->next();
1639 sizeoffaces += sizeof(*face);
1642 MESSAGE("total size of node elements = " << sizeofnodes);;
1643 MESSAGE("total size of face elements = " << sizeoffaces);;
1648 ///////////////////////////////////////////////////////////////////////////////
1649 /// Return the number of nodes
1650 ///////////////////////////////////////////////////////////////////////////////
1651 int SMDS_Mesh::NbNodes() const
1653 return myNodes.Size();
1656 ///////////////////////////////////////////////////////////////////////////////
1657 /// Return the number of edges (including construction edges)
1658 ///////////////////////////////////////////////////////////////////////////////
1659 int SMDS_Mesh::NbEdges() const
1661 return myEdges.Size();
1664 ///////////////////////////////////////////////////////////////////////////////
1665 /// Return the number of faces (including construction faces)
1666 ///////////////////////////////////////////////////////////////////////////////
1667 int SMDS_Mesh::NbFaces() const
1669 return myFaces.Size();
1672 ///////////////////////////////////////////////////////////////////////////////
1673 /// Return the number of volumes
1674 ///////////////////////////////////////////////////////////////////////////////
1675 int SMDS_Mesh::NbVolumes() const
1677 return myVolumes.Size();
1680 ///////////////////////////////////////////////////////////////////////////////
1681 /// Return the number of child mesh of this mesh.
1682 /// Note that the tree structure of SMDS_Mesh seems to be unused in this version
1683 /// (2003-09-08) of SMESH
1684 ///////////////////////////////////////////////////////////////////////////////
1685 int SMDS_Mesh::NbSubMesh() const
1687 return myChildren.size();
1690 ///////////////////////////////////////////////////////////////////////////////
1691 /// Destroy the mesh and all its elements
1692 /// All pointer on elements owned by this mesh become illegals.
1693 ///////////////////////////////////////////////////////////////////////////////
1694 SMDS_Mesh::~SMDS_Mesh()
1696 list<SMDS_Mesh*>::iterator itc=myChildren.begin();
1697 while(itc!=myChildren.end())
1703 SetOfNodes::Iterator itn(myNodes);
1704 for (; itn.More(); itn.Next())
1707 SetOfEdges::Iterator ite(myEdges);
1708 for (; ite.More(); ite.Next())
1710 SMDS_MeshElement* elem = ite.Value();
1712 myElementIDFactory->ReleaseID(elem->GetID());
1716 SetOfFaces::Iterator itf(myFaces);
1717 for (; itf.More(); itf.Next())
1719 SMDS_MeshElement* elem = itf.Value();
1721 myElementIDFactory->ReleaseID(elem->GetID());
1725 SetOfVolumes::Iterator itv(myVolumes);
1726 for (; itv.More(); itv.Next())
1728 SMDS_MeshElement* elem = itv.Value();
1730 myElementIDFactory->ReleaseID(elem->GetID());
1736 delete myNodeIDFactory;
1737 delete myElementIDFactory;
1741 ///////////////////////////////////////////////////////////////////////////////
1742 /// Return true if this mesh create faces with edges.
1743 /// A false returned value mean that faces are created with nodes. A concequence
1744 /// is, iteration on edges (SMDS_Element::edgesIterator) will be unavailable.
1745 ///////////////////////////////////////////////////////////////////////////////
1746 bool SMDS_Mesh::hasConstructionEdges()
1748 return myHasConstructionEdges;
1751 ///////////////////////////////////////////////////////////////////////////////
1752 /// Return true if this mesh create volumes with faces
1753 /// A false returned value mean that volumes are created with nodes or edges.
1754 /// (see hasConstructionEdges)
1755 /// A concequence is, iteration on faces (SMDS_Element::facesIterator) will be
1757 ///////////////////////////////////////////////////////////////////////////////
1758 bool SMDS_Mesh::hasConstructionFaces()
1760 return myHasConstructionFaces;
1763 ///////////////////////////////////////////////////////////////////////////////
1764 /// Return true if nodes are linked to the finit elements, they are belonging to.
1765 /// Currently, It always return true.
1766 ///////////////////////////////////////////////////////////////////////////////
1767 bool SMDS_Mesh::hasInverseElements()
1769 return myHasInverseElements;
1772 ///////////////////////////////////////////////////////////////////////////////
1773 /// Make this mesh creating construction edges (see hasConstructionEdges)
1774 /// @param b true to have construction edges, else false.
1775 ///////////////////////////////////////////////////////////////////////////////
1776 void SMDS_Mesh::setConstructionEdges(bool b)
1778 myHasConstructionEdges=b;
1781 ///////////////////////////////////////////////////////////////////////////////
1782 /// Make this mesh creating construction faces (see hasConstructionFaces)
1783 /// @param b true to have construction faces, else false.
1784 ///////////////////////////////////////////////////////////////////////////////
1785 void SMDS_Mesh::setConstructionFaces(bool b)
1787 myHasConstructionFaces=b;
1790 ///////////////////////////////////////////////////////////////////////////////
1791 /// Make this mesh creating link from nodes to elements (see hasInverseElements)
1792 /// @param b true to link nodes to elements, else false.
1793 ///////////////////////////////////////////////////////////////////////////////
1794 void SMDS_Mesh::setInverseElements(bool b)
1796 if(!b) MESSAGE("Error : inverseElement=false not implemented");
1797 myHasInverseElements=b;
1800 ///////////////////////////////////////////////////////////////////////////////
1801 /// Return an iterator on nodes of the current mesh factory
1802 ///////////////////////////////////////////////////////////////////////////////
1803 class SMDS_Mesh_MyNodeIterator:public SMDS_NodeIterator
1805 SMDS_ElemIteratorPtr myIterator;
1807 SMDS_Mesh_MyNodeIterator(const SMDS_ElemIteratorPtr& it):myIterator(it)
1812 return myIterator->more();
1815 const SMDS_MeshNode* next()
1817 return static_cast<const SMDS_MeshNode*>(myIterator->next());
1821 SMDS_NodeIteratorPtr SMDS_Mesh::nodesIterator() const
1823 return SMDS_NodeIteratorPtr
1824 (new SMDS_Mesh_MyNodeIterator(myNodeIDFactory->elementsIterator()));
1827 ///////////////////////////////////////////////////////////////////////////////
1828 /// Return an iterator on elements of the current mesh factory
1829 ///////////////////////////////////////////////////////////////////////////////
1830 SMDS_ElemIteratorPtr SMDS_Mesh::elementsIterator() const
1832 return myElementIDFactory->elementsIterator();
1835 ///////////////////////////////////////////////////////////////////////////////
1836 ///Return an iterator on edges of the current mesh.
1837 ///////////////////////////////////////////////////////////////////////////////
1838 class SMDS_Mesh_MyEdgeIterator:public SMDS_EdgeIterator
1840 typedef SMDS_Mesh::SetOfEdges SetOfEdges;
1841 SetOfEdges::Iterator myIterator;
1843 SMDS_Mesh_MyEdgeIterator(const SetOfEdges& s):myIterator(s)
1848 while(myIterator.More())
1850 if(myIterator.Value()->GetID()!=-1)
1857 const SMDS_MeshEdge* next()
1859 const SMDS_MeshEdge* current = myIterator.Value();
1865 SMDS_EdgeIteratorPtr SMDS_Mesh::edgesIterator() const
1867 return SMDS_EdgeIteratorPtr(new SMDS_Mesh_MyEdgeIterator(myEdges));
1870 ///////////////////////////////////////////////////////////////////////////////
1871 ///Return an iterator on faces of the current mesh.
1872 ///////////////////////////////////////////////////////////////////////////////
1873 class SMDS_Mesh_MyFaceIterator:public SMDS_FaceIterator
1875 typedef SMDS_Mesh::SetOfFaces SetOfFaces;
1876 SetOfFaces::Iterator myIterator;
1878 SMDS_Mesh_MyFaceIterator(const SetOfFaces& s):myIterator(s)
1883 while(myIterator.More())
1885 if(myIterator.Value()->GetID()!=-1)
1892 const SMDS_MeshFace* next()
1894 const SMDS_MeshFace* current = myIterator.Value();
1900 SMDS_FaceIteratorPtr SMDS_Mesh::facesIterator() const
1902 return SMDS_FaceIteratorPtr(new SMDS_Mesh_MyFaceIterator(myFaces));
1905 ///////////////////////////////////////////////////////////////////////////////
1906 ///Return an iterator on volumes of the current mesh.
1907 ///////////////////////////////////////////////////////////////////////////////
1908 class SMDS_Mesh_MyVolumeIterator:public SMDS_VolumeIterator
1910 typedef SMDS_Mesh::SetOfVolumes SetOfVolumes;
1911 SetOfVolumes::Iterator myIterator;
1913 SMDS_Mesh_MyVolumeIterator(const SetOfVolumes& s):myIterator(s)
1918 return myIterator.More() != Standard_False;
1921 const SMDS_MeshVolume* next()
1923 const SMDS_MeshVolume* current = myIterator.Value();
1929 SMDS_VolumeIteratorPtr SMDS_Mesh::volumesIterator() const
1931 return SMDS_VolumeIteratorPtr(new SMDS_Mesh_MyVolumeIterator(myVolumes));
1934 ///////////////////////////////////////////////////////////////////////////////
1935 /// Do intersection of sets (more than 2)
1936 ///////////////////////////////////////////////////////////////////////////////
1937 static set<const SMDS_MeshElement*> * intersectionOfSets(
1938 set<const SMDS_MeshElement*> vs[], int numberOfSets)
1940 set<const SMDS_MeshElement*>* rsetA=new set<const SMDS_MeshElement*>(vs[0]);
1941 set<const SMDS_MeshElement*>* rsetB;
1943 for(int i=0; i<numberOfSets-1; i++)
1945 rsetB=new set<const SMDS_MeshElement*>();
1947 rsetA->begin(), rsetA->end(),
1948 vs[i+1].begin(), vs[i+1].end(),
1949 inserter(*rsetB, rsetB->begin()));
1956 ///////////////////////////////////////////////////////////////////////////////
1957 /// Return the list of finit elements owning the given element
1958 ///////////////////////////////////////////////////////////////////////////////
1959 static set<const SMDS_MeshElement*> * getFinitElements(const SMDS_MeshElement * element)
1961 int numberOfSets=element->NbNodes();
1962 set<const SMDS_MeshElement*> *initSet = new set<const SMDS_MeshElement*>[numberOfSets];
1964 SMDS_ElemIteratorPtr itNodes=element->nodesIterator();
1967 while(itNodes->more())
1969 const SMDS_MeshNode * n=static_cast<const SMDS_MeshNode*>(itNodes->next());
1970 SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator();
1972 //initSet[i]=set<const SMDS_MeshElement*>();
1974 initSet[i].insert(itFe->next());
1978 set<const SMDS_MeshElement*> *retSet=intersectionOfSets(initSet, numberOfSets);
1983 ///////////////////////////////////////////////////////////////////////////////
1984 /// Return the list of nodes used only by the given elements
1985 ///////////////////////////////////////////////////////////////////////////////
1986 static set<const SMDS_MeshElement*> * getExclusiveNodes(
1987 set<const SMDS_MeshElement*>& elements)
1989 set<const SMDS_MeshElement*> * toReturn=new set<const SMDS_MeshElement*>();
1990 set<const SMDS_MeshElement*>::iterator itElements=elements.begin();
1992 while(itElements!=elements.end())
1994 SMDS_ElemIteratorPtr itNodes = (*itElements)->nodesIterator();
1997 while(itNodes->more())
1999 const SMDS_MeshNode * n=static_cast<const SMDS_MeshNode*>(itNodes->next());
2000 SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator();
2001 set<const SMDS_MeshElement*> s;
2003 s.insert(itFe->next());
2004 if(s==elements) toReturn->insert(n);
2010 ///////////////////////////////////////////////////////////////////////////////
2011 ///Find the children of an element that are made of given nodes
2012 ///@param setOfChildren The set in which matching children will be inserted
2013 ///@param element The element were to search matching children
2014 ///@param nodes The nodes that the children must have to be selected
2015 ///////////////////////////////////////////////////////////////////////////////
2016 void SMDS_Mesh::addChildrenWithNodes(set<const SMDS_MeshElement*>& setOfChildren,
2017 const SMDS_MeshElement * element, set<const SMDS_MeshElement*>& nodes)
2020 switch(element->GetType())
2023 MESSAGE("Internal Error: This should not append");
2027 SMDS_ElemIteratorPtr itn=element->nodesIterator();
2030 const SMDS_MeshElement * e=itn->next();
2031 if(nodes.find(e)!=nodes.end())
2033 setOfChildren.insert(element);
2040 SMDS_ElemIteratorPtr itn=element->nodesIterator();
2043 const SMDS_MeshElement * e=itn->next();
2044 if(nodes.find(e)!=nodes.end())
2046 setOfChildren.insert(element);
2050 if(hasConstructionEdges())
2052 SMDS_ElemIteratorPtr ite=element->edgesIterator();
2054 addChildrenWithNodes(setOfChildren, ite->next(), nodes);
2057 case SMDSAbs_Volume:
2059 if(hasConstructionFaces())
2061 SMDS_ElemIteratorPtr ite=element->facesIterator();
2063 addChildrenWithNodes(setOfChildren, ite->next(), nodes);
2065 else if(hasConstructionEdges())
2067 SMDS_ElemIteratorPtr ite=element->edgesIterator();
2069 addChildrenWithNodes(setOfChildren, ite->next(), nodes);
2075 ///////////////////////////////////////////////////////////////////////////////
2076 ///@param elem The element to delete
2077 ///@param removenodes if true remaining nodes will be removed
2078 ///////////////////////////////////////////////////////////////////////////////
2079 void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem,
2080 const bool removenodes)
2082 list<const SMDS_MeshElement *> removedElems;
2083 list<const SMDS_MeshElement *> removedNodes;
2084 RemoveElement( elem, removedElems, removedNodes, removenodes );
2087 ///////////////////////////////////////////////////////////////////////////////
2088 ///@param elem The element to delete
2089 ///@param removedElems contains all removed elements
2090 ///@param removedNodes contains all removed nodes
2091 ///@param removenodes if true remaining nodes will be removed
2092 ///////////////////////////////////////////////////////////////////////////////
2093 void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem,
2094 list<const SMDS_MeshElement *>& removedElems,
2095 list<const SMDS_MeshElement *>& removedNodes,
2098 // get finite elements built on elem
2099 set<const SMDS_MeshElement*> * s1;
2100 if (!hasConstructionEdges() && elem->GetType() == SMDSAbs_Edge ||
2101 !hasConstructionFaces() && elem->GetType() == SMDSAbs_Face ||
2102 elem->GetType() == SMDSAbs_Volume)
2104 s1 = new set<const SMDS_MeshElement*>();
2108 s1 = getFinitElements(elem);
2110 // get exclusive nodes (which would become free afterwards)
2111 set<const SMDS_MeshElement*> * s2;
2112 if (elem->GetType() == SMDSAbs_Node) // a node is removed
2114 // do not remove nodes except elem
2115 s2 = new set<const SMDS_MeshElement*>();
2120 s2 = getExclusiveNodes(*s1);
2122 // form the set of finite and construction elements to remove
2123 set<const SMDS_MeshElement*> s3;
2124 set<const SMDS_MeshElement*>::iterator it=s1->begin();
2125 while(it!=s1->end())
2127 addChildrenWithNodes(s3, *it ,*s2);
2131 if(elem->GetType()!=SMDSAbs_Node) s3.insert(elem);
2133 // remove finite and construction elements
2137 // Remove element from <InverseElements> of its nodes
2138 SMDS_ElemIteratorPtr itn=(*it)->nodesIterator();
2141 SMDS_MeshNode * n = static_cast<SMDS_MeshNode *>
2142 (const_cast<SMDS_MeshElement *>(itn->next()));
2143 n->RemoveInverseElement( (*it) );
2146 switch((*it)->GetType())
2149 MESSAGE("Internal Error: This should not happen");
2152 myEdges.Remove(static_cast<SMDS_MeshEdge*>
2153 (const_cast<SMDS_MeshElement*>(*it)));
2156 myFaces.Remove(static_cast<SMDS_MeshFace*>
2157 (const_cast<SMDS_MeshElement*>(*it)));
2159 case SMDSAbs_Volume:
2160 myVolumes.Remove(static_cast<SMDS_MeshVolume*>
2161 (const_cast<SMDS_MeshElement*>(*it)));
2164 //MESSAGE( "SMDS: RM elem " << (*it)->GetID() );
2165 removedElems.push_back( (*it) );
2166 myElementIDFactory->ReleaseID((*it)->GetID());
2171 // remove exclusive (free) nodes
2175 while(it!=s2->end())
2177 //MESSAGE( "SMDS: RM node " << (*it)->GetID() );
2178 myNodes.Remove(static_cast<SMDS_MeshNode*>
2179 (const_cast<SMDS_MeshElement*>(*it)));
2180 myNodeIDFactory->ReleaseID((*it)->GetID());
2181 removedNodes.push_back( (*it) );
2192 ///////////////////////////////////////////////////////////////////////////////
2193 ///@param elem The element to delete
2194 ///////////////////////////////////////////////////////////////////////////////
2195 void SMDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elem)
2197 SMDSAbs_ElementType aType = elem->GetType();
2198 if (aType == SMDSAbs_Node) {
2199 // only free node can be removed by this method
2200 const SMDS_MeshNode* n = static_cast<const SMDS_MeshNode*>(elem);
2201 SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator();
2202 if (!itFe->more()) { // free node
2203 myNodes.Remove(const_cast<SMDS_MeshNode*>(n));
2204 myNodeIDFactory->ReleaseID(elem->GetID());
2208 if (hasConstructionEdges() || hasConstructionFaces())
2209 // this methods is only for meshes without descendants
2212 // Remove element from <InverseElements> of its nodes
2213 SMDS_ElemIteratorPtr itn = elem->nodesIterator();
2214 while (itn->more()) {
2215 SMDS_MeshNode * n = static_cast<SMDS_MeshNode *>
2216 (const_cast<SMDS_MeshElement *>(itn->next()));
2217 n->RemoveInverseElement(elem);
2220 // in meshes without descendants elements are always free
2223 myEdges.Remove(static_cast<SMDS_MeshEdge*>
2224 (const_cast<SMDS_MeshElement*>(elem)));
2227 myFaces.Remove(static_cast<SMDS_MeshFace*>
2228 (const_cast<SMDS_MeshElement*>(elem)));
2230 case SMDSAbs_Volume:
2231 myVolumes.Remove(static_cast<SMDS_MeshVolume*>
2232 (const_cast<SMDS_MeshElement*>(elem)));
2237 myElementIDFactory->ReleaseID(elem->GetID());
2243 * Checks if the element is present in mesh.
2244 * Useful to determine dead pointers.
2246 bool SMDS_Mesh::Contains (const SMDS_MeshElement* elem) const
2248 // we should not imply on validity of *elem, so iterate on containers
2249 // of all types in the hope of finding <elem> somewhere there
2250 SMDS_NodeIteratorPtr itn = nodesIterator();
2252 if (elem == itn->next())
2254 SMDS_EdgeIteratorPtr ite = edgesIterator();
2256 if (elem == ite->next())
2258 SMDS_FaceIteratorPtr itf = facesIterator();
2260 if (elem == itf->next())
2262 SMDS_VolumeIteratorPtr itv = volumesIterator();
2264 if (elem == itv->next())
2269 //=======================================================================
2270 //function : MaxNodeID
2272 //=======================================================================
2274 int SMDS_Mesh::MaxNodeID() const
2276 return myNodeIDFactory->GetMaxID();
2279 //=======================================================================
2280 //function : MinNodeID
2282 //=======================================================================
2284 int SMDS_Mesh::MinNodeID() const
2286 return myNodeIDFactory->GetMinID();
2289 //=======================================================================
2290 //function : MaxElementID
2292 //=======================================================================
2294 int SMDS_Mesh::MaxElementID() const
2296 return myElementIDFactory->GetMaxID();
2299 //=======================================================================
2300 //function : MinElementID
2302 //=======================================================================
2304 int SMDS_Mesh::MinElementID() const
2306 return myElementIDFactory->GetMinID();
2309 //=======================================================================
2310 //function : Renumber
2311 //purpose : Renumber all nodes or elements.
2312 //=======================================================================
2314 void SMDS_Mesh::Renumber (const bool isNodes, const int startID, const int deltaID)
2319 SMDS_MeshElementIDFactory * idFactory =
2320 isNodes ? myNodeIDFactory : myElementIDFactory;
2322 // get existing elements in the order of ID increasing
2323 map<int,SMDS_MeshElement*> elemMap;
2324 SMDS_ElemIteratorPtr idElemIt = idFactory->elementsIterator();
2325 while ( idElemIt->more() ) {
2326 SMDS_MeshElement* elem = const_cast<SMDS_MeshElement*>(idElemIt->next());
2327 int id = elem->GetID();
2328 elemMap.insert(map<int,SMDS_MeshElement*>::value_type(id, elem));
2330 // release their ids
2331 map<int,SMDS_MeshElement*>::iterator elemIt = elemMap.begin();
2332 for ( ; elemIt != elemMap.end(); elemIt++ )
2334 int id = (*elemIt).first;
2335 idFactory->ReleaseID( id );
2339 elemIt = elemMap.begin();
2340 for ( ; elemIt != elemMap.end(); elemIt++ )
2342 idFactory->BindID( ID, (*elemIt).second );
2347 //=======================================================================
2348 //function : GetElementType
2349 //purpose : Return type of element or node with id
2350 //=======================================================================
2352 SMDSAbs_ElementType SMDS_Mesh::GetElementType( const int id, const bool iselem ) const
2354 SMDS_MeshElement* elem = 0;
2356 elem = myElementIDFactory->MeshElement( id );
2358 elem = myNodeIDFactory->MeshElement( id );
2362 //throw SALOME_Exception(LOCALIZED ("this element isn't exist"));
2366 return elem->GetType();
2371 //********************************************************************
2372 //********************************************************************
2373 //******** *********
2374 //***** Methods for addition of quadratic elements ******
2375 //******** *********
2376 //********************************************************************
2377 //********************************************************************
2379 //=======================================================================
2380 //function : AddEdgeWithID
2382 //=======================================================================
2383 SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(int n1, int n2, int n12, int ID)
2385 return SMDS_Mesh::AddEdgeWithID
2386 ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1),
2387 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2),
2388 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12),
2392 //=======================================================================
2393 //function : AddEdge
2395 //=======================================================================
2396 SMDS_MeshEdge* SMDS_Mesh::AddEdge(const SMDS_MeshNode* n1,
2397 const SMDS_MeshNode* n2,
2398 const SMDS_MeshNode* n12)
2400 return SMDS_Mesh::AddEdgeWithID(n1, n2, n12, myElementIDFactory->GetFreeID());
2403 //=======================================================================
2404 //function : AddEdgeWithID
2406 //=======================================================================
2407 SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
2408 const SMDS_MeshNode * n2,
2409 const SMDS_MeshNode * n12,
2412 if ( !n1 || !n2 || !n12 ) return 0;
2413 SMDS_QuadraticEdge* edge = new SMDS_QuadraticEdge(n1,n2,n12);
2414 if(myElementIDFactory->BindID(ID, edge)) {
2415 SMDS_MeshNode *node1,*node2, *node12;
2416 node1 = const_cast<SMDS_MeshNode*>(n1);
2417 node2 = const_cast<SMDS_MeshNode*>(n2);
2418 node12 = const_cast<SMDS_MeshNode*>(n12);
2419 node1->AddInverseElement(edge);
2420 node2->AddInverseElement(edge);
2421 node12->AddInverseElement(edge);
2432 //=======================================================================
2433 //function : AddFace
2435 //=======================================================================
2436 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1,
2437 const SMDS_MeshNode * n2,
2438 const SMDS_MeshNode * n3,
2439 const SMDS_MeshNode * n12,
2440 const SMDS_MeshNode * n23,
2441 const SMDS_MeshNode * n31)
2443 return SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,
2444 myElementIDFactory->GetFreeID());
2447 //=======================================================================
2448 //function : AddFaceWithID
2450 //=======================================================================
2451 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int n1, int n2, int n3,
2452 int n12,int n23,int n31, int ID)
2454 return SMDS_Mesh::AddFaceWithID
2455 ((SMDS_MeshNode *)myNodeIDFactory->MeshElement(n1) ,
2456 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n2) ,
2457 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n3) ,
2458 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n12),
2459 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n23),
2460 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n31),
2464 //=======================================================================
2465 //function : AddFaceWithID
2467 //=======================================================================
2468 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
2469 const SMDS_MeshNode * n2,
2470 const SMDS_MeshNode * n3,
2471 const SMDS_MeshNode * n12,
2472 const SMDS_MeshNode * n23,
2473 const SMDS_MeshNode * n31,
2476 if ( !n1 || !n2 || !n3 || !n12 || !n23 || !n31) return 0;
2477 if(hasConstructionEdges()) {
2478 // creation quadratic edges - not implemented
2481 SMDS_QuadraticFaceOfNodes* face =
2482 new SMDS_QuadraticFaceOfNodes(n1,n2,n3,n12,n23,n31);
2485 if (!registerElement(ID, face)) {
2486 RemoveElement(face, false);
2493 //=======================================================================
2494 //function : AddFace
2496 //=======================================================================
2497 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1,
2498 const SMDS_MeshNode * n2,
2499 const SMDS_MeshNode * n3,
2500 const SMDS_MeshNode * n4,
2501 const SMDS_MeshNode * n12,
2502 const SMDS_MeshNode * n23,
2503 const SMDS_MeshNode * n34,
2504 const SMDS_MeshNode * n41)
2506 return SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,
2507 myElementIDFactory->GetFreeID());
2510 //=======================================================================
2511 //function : AddFaceWithID
2513 //=======================================================================
2514 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4,
2515 int n12,int n23,int n34,int n41, int ID)
2517 return SMDS_Mesh::AddFaceWithID
2518 ((SMDS_MeshNode *)myNodeIDFactory->MeshElement(n1) ,
2519 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n2) ,
2520 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n3) ,
2521 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n4) ,
2522 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n12),
2523 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n23),
2524 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n34),
2525 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n41),
2529 //=======================================================================
2530 //function : AddFaceWithID
2532 //=======================================================================
2533 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
2534 const SMDS_MeshNode * n2,
2535 const SMDS_MeshNode * n3,
2536 const SMDS_MeshNode * n4,
2537 const SMDS_MeshNode * n12,
2538 const SMDS_MeshNode * n23,
2539 const SMDS_MeshNode * n34,
2540 const SMDS_MeshNode * n41,
2543 if ( !n1 || !n2 || !n3 || !n4 || !n12 || !n23 || !n34 || !n41) return 0;
2544 if(hasConstructionEdges()) {
2545 // creation quadratic edges - not implemented
2547 SMDS_QuadraticFaceOfNodes* face =
2548 new SMDS_QuadraticFaceOfNodes(n1,n2,n3,n4,n12,n23,n34,n41);
2551 if (!registerElement(ID, face)) {
2552 RemoveElement(face, false);
2559 //=======================================================================
2560 //function : AddVolume
2562 //=======================================================================
2563 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2564 const SMDS_MeshNode * n2,
2565 const SMDS_MeshNode * n3,
2566 const SMDS_MeshNode * n4,
2567 const SMDS_MeshNode * n12,
2568 const SMDS_MeshNode * n23,
2569 const SMDS_MeshNode * n31,
2570 const SMDS_MeshNode * n14,
2571 const SMDS_MeshNode * n24,
2572 const SMDS_MeshNode * n34)
2574 int ID = myElementIDFactory->GetFreeID();
2575 SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n12, n23,
2576 n31, n14, n24, n34, ID);
2577 if(v==NULL) myElementIDFactory->ReleaseID(ID);
2581 //=======================================================================
2582 //function : AddVolumeWithID
2584 //=======================================================================
2585 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
2586 int n12,int n23,int n31,
2587 int n14,int n24,int n34, int ID)
2589 return SMDS_Mesh::AddVolumeWithID
2590 ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1) ,
2591 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2) ,
2592 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3) ,
2593 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4) ,
2594 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12),
2595 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23),
2596 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n31),
2597 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n14),
2598 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n24),
2599 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34),
2603 //=======================================================================
2604 //function : AddVolumeWithID
2605 //purpose : 2d order tetrahedron of 10 nodes
2606 //=======================================================================
2607 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2608 const SMDS_MeshNode * n2,
2609 const SMDS_MeshNode * n3,
2610 const SMDS_MeshNode * n4,
2611 const SMDS_MeshNode * n12,
2612 const SMDS_MeshNode * n23,
2613 const SMDS_MeshNode * n31,
2614 const SMDS_MeshNode * n14,
2615 const SMDS_MeshNode * n24,
2616 const SMDS_MeshNode * n34,
2619 if ( !n1 || !n2 || !n3 || !n4 || !n12 || !n23 || !n31 || !n14 || !n24 || !n34)
2621 if(hasConstructionFaces()) {
2622 // creation quadratic faces - not implemented
2625 SMDS_QuadraticVolumeOfNodes * volume =
2626 new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
2627 myVolumes.Add(volume);
2629 if (!registerElement(ID, volume)) {
2630 RemoveElement(volume, false);
2637 //=======================================================================
2638 //function : AddVolume
2640 //=======================================================================
2641 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2642 const SMDS_MeshNode * n2,
2643 const SMDS_MeshNode * n3,
2644 const SMDS_MeshNode * n4,
2645 const SMDS_MeshNode * n5,
2646 const SMDS_MeshNode * n12,
2647 const SMDS_MeshNode * n23,
2648 const SMDS_MeshNode * n34,
2649 const SMDS_MeshNode * n41,
2650 const SMDS_MeshNode * n15,
2651 const SMDS_MeshNode * n25,
2652 const SMDS_MeshNode * n35,
2653 const SMDS_MeshNode * n45)
2655 int ID = myElementIDFactory->GetFreeID();
2656 SMDS_MeshVolume * v =
2657 SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n12, n23, n34, n41,
2658 n15, n25, n35, n45, ID);
2659 if(v==NULL) myElementIDFactory->ReleaseID(ID);
2663 //=======================================================================
2664 //function : AddVolumeWithID
2666 //=======================================================================
2667 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5,
2668 int n12,int n23,int n34,int n41,
2669 int n15,int n25,int n35,int n45, int ID)
2671 return SMDS_Mesh::AddVolumeWithID
2672 ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1) ,
2673 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2) ,
2674 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3) ,
2675 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4) ,
2676 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5) ,
2677 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12),
2678 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23),
2679 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34),
2680 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n41),
2681 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n15),
2682 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n25),
2683 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n35),
2684 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n45),
2688 //=======================================================================
2689 //function : AddVolumeWithID
2690 //purpose : 2d order pyramid of 13 nodes
2691 //=======================================================================
2692 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2693 const SMDS_MeshNode * n2,
2694 const SMDS_MeshNode * n3,
2695 const SMDS_MeshNode * n4,
2696 const SMDS_MeshNode * n5,
2697 const SMDS_MeshNode * n12,
2698 const SMDS_MeshNode * n23,
2699 const SMDS_MeshNode * n34,
2700 const SMDS_MeshNode * n41,
2701 const SMDS_MeshNode * n15,
2702 const SMDS_MeshNode * n25,
2703 const SMDS_MeshNode * n35,
2704 const SMDS_MeshNode * n45,
2707 if (!n1 || !n2 || !n3 || !n4 || !n5 || !n12 || !n23 ||
2708 !n34 || !n41 || !n15 || !n25 || !n35 || !n45)
2710 if(hasConstructionFaces()) {
2711 // creation quadratic faces - not implemented
2714 SMDS_QuadraticVolumeOfNodes * volume =
2715 new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n12,n23,
2716 n34,n41,n15,n25,n35,n45);
2717 myVolumes.Add(volume);
2719 if (!registerElement(ID, volume)) {
2720 RemoveElement(volume, false);
2727 //=======================================================================
2728 //function : AddVolume
2730 //=======================================================================
2731 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2732 const SMDS_MeshNode * n2,
2733 const SMDS_MeshNode * n3,
2734 const SMDS_MeshNode * n4,
2735 const SMDS_MeshNode * n5,
2736 const SMDS_MeshNode * n6,
2737 const SMDS_MeshNode * n12,
2738 const SMDS_MeshNode * n23,
2739 const SMDS_MeshNode * n31,
2740 const SMDS_MeshNode * n45,
2741 const SMDS_MeshNode * n56,
2742 const SMDS_MeshNode * n64,
2743 const SMDS_MeshNode * n14,
2744 const SMDS_MeshNode * n25,
2745 const SMDS_MeshNode * n36)
2747 int ID = myElementIDFactory->GetFreeID();
2748 SMDS_MeshVolume * v =
2749 SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n12, n23, n31,
2750 n45, n56, n64, n14, n25, n36, ID);
2751 if(v==NULL) myElementIDFactory->ReleaseID(ID);
2755 //=======================================================================
2756 //function : AddVolumeWithID
2758 //=======================================================================
2759 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3,
2760 int n4, int n5, int n6,
2761 int n12,int n23,int n31,
2762 int n45,int n56,int n64,
2763 int n14,int n25,int n36, int ID)
2765 return SMDS_Mesh::AddVolumeWithID
2766 ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1) ,
2767 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2) ,
2768 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3) ,
2769 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4) ,
2770 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5) ,
2771 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n6) ,
2772 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12),
2773 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23),
2774 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n31),
2775 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n45),
2776 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n56),
2777 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n64),
2778 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n14),
2779 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n25),
2780 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n36),
2784 //=======================================================================
2785 //function : AddVolumeWithID
2786 //purpose : 2d order Pentahedron with 15 nodes
2787 //=======================================================================
2788 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2789 const SMDS_MeshNode * n2,
2790 const SMDS_MeshNode * n3,
2791 const SMDS_MeshNode * n4,
2792 const SMDS_MeshNode * n5,
2793 const SMDS_MeshNode * n6,
2794 const SMDS_MeshNode * n12,
2795 const SMDS_MeshNode * n23,
2796 const SMDS_MeshNode * n31,
2797 const SMDS_MeshNode * n45,
2798 const SMDS_MeshNode * n56,
2799 const SMDS_MeshNode * n64,
2800 const SMDS_MeshNode * n14,
2801 const SMDS_MeshNode * n25,
2802 const SMDS_MeshNode * n36,
2805 if (!n1 || !n2 || !n3 || !n4 || !n5 || !n6 || !n12 || !n23 ||
2806 !n31 || !n45 || !n56 || !n64 || !n14 || !n25 || !n36)
2808 if(hasConstructionFaces()) {
2809 // creation quadratic faces - not implemented
2812 SMDS_QuadraticVolumeOfNodes * volume =
2813 new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n6,n12,n23,n31,
2814 n45,n56,n64,n14,n25,n36);
2815 myVolumes.Add(volume);
2817 if (!registerElement(ID, volume)) {
2818 RemoveElement(volume, false);
2825 //=======================================================================
2826 //function : AddVolume
2828 //=======================================================================
2829 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2830 const SMDS_MeshNode * n2,
2831 const SMDS_MeshNode * n3,
2832 const SMDS_MeshNode * n4,
2833 const SMDS_MeshNode * n5,
2834 const SMDS_MeshNode * n6,
2835 const SMDS_MeshNode * n7,
2836 const SMDS_MeshNode * n8,
2837 const SMDS_MeshNode * n12,
2838 const SMDS_MeshNode * n23,
2839 const SMDS_MeshNode * n34,
2840 const SMDS_MeshNode * n41,
2841 const SMDS_MeshNode * n56,
2842 const SMDS_MeshNode * n67,
2843 const SMDS_MeshNode * n78,
2844 const SMDS_MeshNode * n85,
2845 const SMDS_MeshNode * n15,
2846 const SMDS_MeshNode * n26,
2847 const SMDS_MeshNode * n37,
2848 const SMDS_MeshNode * n48)
2850 int ID = myElementIDFactory->GetFreeID();
2851 SMDS_MeshVolume * v =
2852 SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, n12, n23, n34, n41,
2853 n56, n67, n78, n85, n15, n26, n37, n48, ID);
2854 if(v==NULL) myElementIDFactory->ReleaseID(ID);
2858 //=======================================================================
2859 //function : AddVolumeWithID
2861 //=======================================================================
2862 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
2863 int n5, int n6, int n7, int n8,
2864 int n12,int n23,int n34,int n41,
2865 int n56,int n67,int n78,int n85,
2866 int n15,int n26,int n37,int n48, int ID)
2868 return SMDS_Mesh::AddVolumeWithID
2869 ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1),
2870 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2),
2871 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3),
2872 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4),
2873 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5),
2874 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n6),
2875 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n7),
2876 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n8),
2877 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12),
2878 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23),
2879 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34),
2880 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n41),
2881 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n56),
2882 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n67),
2883 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n78),
2884 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n85),
2885 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n15),
2886 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n26),
2887 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n37),
2888 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n48),
2892 //=======================================================================
2893 //function : AddVolumeWithID
2894 //purpose : 2d order Hexahedrons with 20 nodes
2895 //=======================================================================
2896 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2897 const SMDS_MeshNode * n2,
2898 const SMDS_MeshNode * n3,
2899 const SMDS_MeshNode * n4,
2900 const SMDS_MeshNode * n5,
2901 const SMDS_MeshNode * n6,
2902 const SMDS_MeshNode * n7,
2903 const SMDS_MeshNode * n8,
2904 const SMDS_MeshNode * n12,
2905 const SMDS_MeshNode * n23,
2906 const SMDS_MeshNode * n34,
2907 const SMDS_MeshNode * n41,
2908 const SMDS_MeshNode * n56,
2909 const SMDS_MeshNode * n67,
2910 const SMDS_MeshNode * n78,
2911 const SMDS_MeshNode * n85,
2912 const SMDS_MeshNode * n15,
2913 const SMDS_MeshNode * n26,
2914 const SMDS_MeshNode * n37,
2915 const SMDS_MeshNode * n48,
2918 if (!n1 || !n2 || !n3 || !n4 || !n5 || !n6 || !n7 || !n8 || !n12 || !n23 ||
2919 !n34 || !n41 || !n56 || !n67 || !n78 || !n85 || !n15 || !n26 || !n37 || !n48)
2921 if(hasConstructionFaces()) {
2923 // creation quadratic faces - not implemented
2925 SMDS_QuadraticVolumeOfNodes * volume =
2926 new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
2927 n56,n67,n78,n85,n15,n26,n37,n48);
2928 myVolumes.Add(volume);
2930 if (!registerElement(ID, volume)) {
2931 RemoveElement(volume, false);