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"
43 #include <sys/sysinfo.h>
47 //================================================================================
49 * \brief Raise an exception if free memory (ram+swap) too low
50 * \param doNotRaise - if true, suppres exception, just return free memory size
51 * \retval int - amount of available memory in MB or negative number in failure case
53 //================================================================================
55 int SMDS_Mesh::CheckMemory(const bool doNotRaise) throw (std::bad_alloc)
59 int err = sysinfo( &si );
63 static int limit = -1;
65 int status = system("SMDS_MemoryLimit"); // it returns lower limit of free RAM
67 limit = WEXITSTATUS(status);
72 limit = int( limit * 1.5 );
74 cout << "SMDS_Mesh::CheckMemory() memory limit = " << limit << " MB" << endl;
78 const unsigned long Mbyte = 1024 * 1024;
79 // compute separately to avoid overflow
81 ( si.freeram * si.mem_unit ) / Mbyte +
82 ( si.freeswap * si.mem_unit ) / Mbyte;
85 return freeMb - limit;
90 cout<<"SMDS_Mesh::CheckMemory() throws as free memory too low: " << freeMb <<" MB" << endl;
92 throw std::bad_alloc();
98 ///////////////////////////////////////////////////////////////////////////////
99 /// Create a new mesh object
100 ///////////////////////////////////////////////////////////////////////////////
101 SMDS_Mesh::SMDS_Mesh()
103 myNodeIDFactory(new SMDS_MeshElementIDFactory()),
104 myElementIDFactory(new SMDS_MeshElementIDFactory()),
105 myHasConstructionEdges(false), myHasConstructionFaces(false),
106 myHasInverseElements(true)
110 ///////////////////////////////////////////////////////////////////////////////
111 /// Create a new child mesh
112 /// Note that the tree structure of SMDS_Mesh seems to be unused in this version
113 /// (2003-09-08) of SMESH
114 ///////////////////////////////////////////////////////////////////////////////
115 SMDS_Mesh::SMDS_Mesh(SMDS_Mesh * parent)
116 :myParent(parent), myNodeIDFactory(parent->myNodeIDFactory),
117 myElementIDFactory(parent->myElementIDFactory),
118 myHasConstructionEdges(false), myHasConstructionFaces(false),
119 myHasInverseElements(true)
123 ///////////////////////////////////////////////////////////////////////////////
124 ///Create a submesh and add it to the current mesh
125 ///////////////////////////////////////////////////////////////////////////////
127 SMDS_Mesh *SMDS_Mesh::AddSubMesh()
129 SMDS_Mesh *submesh = new SMDS_Mesh(this);
130 myChildren.insert(myChildren.end(), submesh);
134 ///////////////////////////////////////////////////////////////////////////////
135 ///create a MeshNode and add it to the current Mesh
136 ///An ID is automatically assigned to the node.
137 ///@return : The created node
138 ///////////////////////////////////////////////////////////////////////////////
140 SMDS_MeshNode * SMDS_Mesh::AddNode(double x, double y, double z)
142 return SMDS_Mesh::AddNodeWithID(x,y,z,myNodeIDFactory->GetFreeID());
145 ///////////////////////////////////////////////////////////////////////////////
146 ///create a MeshNode and add it to the current Mesh
147 ///@param ID : The ID of the MeshNode to create
148 ///@return : The created node or NULL if a node with this ID already exists
149 ///////////////////////////////////////////////////////////////////////////////
150 SMDS_MeshNode * SMDS_Mesh::AddNodeWithID(double x, double y, double z, int ID)
152 // find the MeshNode corresponding to ID
153 const SMDS_MeshElement *node = myNodeIDFactory->MeshElement(ID);
156 SMDS_MeshNode * node=new SMDS_MeshNode(x, y, z);
158 myNodeIDFactory->BindID(ID,node);
165 ///////////////////////////////////////////////////////////////////////////////
166 /// create a MeshEdge and add it to the current Mesh
167 /// @return : The created MeshEdge
168 ///////////////////////////////////////////////////////////////////////////////
170 SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(int idnode1, int idnode2, int ID)
172 SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
173 SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
174 if(!node1 || !node2) return NULL;
175 return SMDS_Mesh::AddEdgeWithID(node1, node2, ID);
178 ///////////////////////////////////////////////////////////////////////////////
179 /// create a MeshEdge and add it to the current Mesh
180 /// @return : The created MeshEdge
181 ///////////////////////////////////////////////////////////////////////////////
183 SMDS_MeshEdge* SMDS_Mesh::AddEdge(const SMDS_MeshNode * node1,
184 const SMDS_MeshNode * node2)
186 return SMDS_Mesh::AddEdgeWithID(node1, node2, myElementIDFactory->GetFreeID());
189 ///////////////////////////////////////////////////////////////////////////////
190 /// Create a new edge and at it to the mesh
191 /// @param idnode1 ID of the first node
192 /// @param idnode2 ID of the second node
193 /// @param ID ID of the edge to create
194 /// @return The created edge or NULL if an element with this ID already exists or
195 /// if input nodes are not found.
196 ///////////////////////////////////////////////////////////////////////////////
198 SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
199 const SMDS_MeshNode * n2,
202 if ( !n1 || !n2 ) return 0;
205 SMDS_MeshEdge * edge=new SMDS_MeshEdge(n1,n2);
206 if(myElementIDFactory->BindID(ID, edge)) {
207 SMDS_MeshNode *node1,*node2;
208 node1=const_cast<SMDS_MeshNode*>(n1);
209 node2=const_cast<SMDS_MeshNode*>(n2);
210 node1->AddInverseElement(edge);
211 node2->AddInverseElement(edge);
222 ///////////////////////////////////////////////////////////////////////////////
223 /// Add a triangle defined by its nodes. An ID is automatically affected to the
225 ///////////////////////////////////////////////////////////////////////////////
227 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1,
228 const SMDS_MeshNode * n2,
229 const SMDS_MeshNode * n3)
231 return SMDS_Mesh::AddFaceWithID(n1,n2,n3, myElementIDFactory->GetFreeID());
234 ///////////////////////////////////////////////////////////////////////////////
235 /// Add a triangle defined by its nodes IDs
236 ///////////////////////////////////////////////////////////////////////////////
238 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1, int idnode2, int idnode3, int ID)
240 SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
241 SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
242 SMDS_MeshNode * node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
243 if(!node1 || !node2 || !node3) return NULL;
244 return SMDS_Mesh::AddFaceWithID(node1, node2, node3, ID);
247 ///////////////////////////////////////////////////////////////////////////////
248 /// Add a triangle defined by its nodes
249 ///////////////////////////////////////////////////////////////////////////////
251 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
252 const SMDS_MeshNode * n2,
253 const SMDS_MeshNode * n3,
256 SMDS_MeshFace * face=createTriangle(n1, n2, n3);
258 if (face && !registerElement(ID, face)) {
259 RemoveElement(face, false);
265 ///////////////////////////////////////////////////////////////////////////////
266 /// Add a quadrangle defined by its nodes. An ID is automatically affected to the
268 ///////////////////////////////////////////////////////////////////////////////
270 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1,
271 const SMDS_MeshNode * n2,
272 const SMDS_MeshNode * n3,
273 const SMDS_MeshNode * n4)
275 return SMDS_Mesh::AddFaceWithID(n1,n2,n3, n4, myElementIDFactory->GetFreeID());
278 ///////////////////////////////////////////////////////////////////////////////
279 /// Add a quadrangle defined by its nodes IDs
280 ///////////////////////////////////////////////////////////////////////////////
282 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1,
288 SMDS_MeshNode *node1, *node2, *node3, *node4;
289 node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
290 node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
291 node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
292 node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
293 if(!node1 || !node2 || !node3 || !node4) return NULL;
294 return SMDS_Mesh::AddFaceWithID(node1, node2, node3, node4, ID);
297 ///////////////////////////////////////////////////////////////////////////////
298 /// Add a quadrangle defined by its nodes
299 ///////////////////////////////////////////////////////////////////////////////
301 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
302 const SMDS_MeshNode * n2,
303 const SMDS_MeshNode * n3,
304 const SMDS_MeshNode * n4,
307 SMDS_MeshFace * face=createQuadrangle(n1, n2, n3, n4);
309 if (face && !registerElement(ID, face)) {
310 RemoveElement(face, false);
316 ///////////////////////////////////////////////////////////////////////////////
317 /// Add a triangle defined by its edges. An ID is automatically assigned to the
319 ///////////////////////////////////////////////////////////////////////////////
321 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1,
322 const SMDS_MeshEdge * e2,
323 const SMDS_MeshEdge * e3)
325 if (!hasConstructionEdges())
327 return AddFaceWithID(e1,e2,e3, myElementIDFactory->GetFreeID());
330 ///////////////////////////////////////////////////////////////////////////////
331 /// Add a triangle defined by its edges
332 ///////////////////////////////////////////////////////////////////////////////
334 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1,
335 const SMDS_MeshEdge * e2,
336 const SMDS_MeshEdge * e3,
339 if (!hasConstructionEdges())
341 if ( !e1 || !e2 || !e3 ) return 0;
344 SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3);
346 myInfo.myNbTriangles++;
348 if (!registerElement(ID, face)) {
349 RemoveElement(face, false);
355 ///////////////////////////////////////////////////////////////////////////////
356 /// Add a quadrangle defined by its edges. An ID is automatically assigned to the
358 ///////////////////////////////////////////////////////////////////////////////
360 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1,
361 const SMDS_MeshEdge * e2,
362 const SMDS_MeshEdge * e3,
363 const SMDS_MeshEdge * e4)
365 if (!hasConstructionEdges())
367 return AddFaceWithID(e1,e2,e3,e4, myElementIDFactory->GetFreeID());
370 ///////////////////////////////////////////////////////////////////////////////
371 /// Add a quadrangle defined by its edges
372 ///////////////////////////////////////////////////////////////////////////////
374 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1,
375 const SMDS_MeshEdge * e2,
376 const SMDS_MeshEdge * e3,
377 const SMDS_MeshEdge * e4,
380 if (!hasConstructionEdges())
382 if ( !e1 || !e2 || !e3 || !e4 ) return 0;
384 SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3,e4);
386 myInfo.myNbQuadrangles++;
388 if (!registerElement(ID, face))
390 RemoveElement(face, false);
396 ///////////////////////////////////////////////////////////////////////////////
397 ///Create a new tetrahedron and add it to the mesh.
398 ///@return The created tetrahedron
399 ///////////////////////////////////////////////////////////////////////////////
401 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
402 const SMDS_MeshNode * n2,
403 const SMDS_MeshNode * n3,
404 const SMDS_MeshNode * n4)
406 int ID = myElementIDFactory->GetFreeID();
407 SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID);
408 if(v==NULL) myElementIDFactory->ReleaseID(ID);
412 ///////////////////////////////////////////////////////////////////////////////
413 ///Create a new tetrahedron and add it to the mesh.
414 ///@param ID The ID of the new volume
415 ///@return The created tetrahedron or NULL if an element with this ID already exists
416 ///or if input nodes are not found.
417 ///////////////////////////////////////////////////////////////////////////////
419 SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
425 SMDS_MeshNode *node1, *node2, *node3, *node4;
426 node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
427 node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
428 node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
429 node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
430 if(!node1 || !node2 || !node3 || !node4) return NULL;
431 return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, ID);
434 ///////////////////////////////////////////////////////////////////////////////
435 ///Create a new tetrahedron and add it to the mesh.
436 ///@param ID The ID of the new volume
437 ///@return The created tetrahedron
438 ///////////////////////////////////////////////////////////////////////////////
440 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
441 const SMDS_MeshNode * n2,
442 const SMDS_MeshNode * n3,
443 const SMDS_MeshNode * n4,
446 SMDS_MeshVolume* volume = 0;
447 if ( !n1 || !n2 || !n3 || !n4) return volume;
449 if(hasConstructionFaces()) {
450 SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3);
451 SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n4);
452 SMDS_MeshFace * f3=FindFaceOrCreate(n1,n3,n4);
453 SMDS_MeshFace * f4=FindFaceOrCreate(n2,n3,n4);
454 volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4);
455 myVolumes.Add(volume);
458 else if(hasConstructionEdges()) {
459 MESSAGE("Error : Not implemented");
463 volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4);
464 myVolumes.Add(volume);
468 if (!registerElement(ID, volume)) {
469 RemoveElement(volume, false);
475 ///////////////////////////////////////////////////////////////////////////////
476 ///Create a new pyramid and add it to the mesh.
477 ///Nodes 1,2,3 and 4 define the base of the pyramid
478 ///@return The created pyramid
479 ///////////////////////////////////////////////////////////////////////////////
481 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
482 const SMDS_MeshNode * n2,
483 const SMDS_MeshNode * n3,
484 const SMDS_MeshNode * n4,
485 const SMDS_MeshNode * n5)
487 int ID = myElementIDFactory->GetFreeID();
488 SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID);
489 if(v==NULL) myElementIDFactory->ReleaseID(ID);
493 ///////////////////////////////////////////////////////////////////////////////
494 ///Create a new pyramid and add it to the mesh.
495 ///Nodes 1,2,3 and 4 define the base of the pyramid
496 ///@param ID The ID of the new volume
497 ///@return The created pyramid or NULL if an element with this ID already exists
498 ///or if input nodes are not found.
499 ///////////////////////////////////////////////////////////////////////////////
501 SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
508 SMDS_MeshNode *node1, *node2, *node3, *node4, *node5;
509 node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
510 node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
511 node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
512 node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
513 node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5);
514 if(!node1 || !node2 || !node3 || !node4 || !node5) return NULL;
515 return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, ID);
518 ///////////////////////////////////////////////////////////////////////////////
519 ///Create a new pyramid and add it to the mesh.
520 ///Nodes 1,2,3 and 4 define the base of the pyramid
521 ///@param ID The ID of the new volume
522 ///@return The created pyramid
523 ///////////////////////////////////////////////////////////////////////////////
525 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
526 const SMDS_MeshNode * n2,
527 const SMDS_MeshNode * n3,
528 const SMDS_MeshNode * n4,
529 const SMDS_MeshNode * n5,
532 SMDS_MeshVolume* volume = 0;
533 if ( !n1 || !n2 || !n3 || !n4 || !n5) return volume;
535 if(hasConstructionFaces()) {
536 SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4);
537 SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n5);
538 SMDS_MeshFace * f3=FindFaceOrCreate(n2,n3,n5);
539 SMDS_MeshFace * f4=FindFaceOrCreate(n3,n4,n5);
540 volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4);
541 myVolumes.Add(volume);
542 myInfo.myNbPyramids++;
544 else if(hasConstructionEdges()) {
545 MESSAGE("Error : Not implemented");
549 volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5);
550 myVolumes.Add(volume);
551 myInfo.myNbPyramids++;
554 if (!registerElement(ID, volume)) {
555 RemoveElement(volume, false);
561 ///////////////////////////////////////////////////////////////////////////////
562 ///Create a new prism and add it to the mesh.
563 ///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle.
564 ///@return The created prism
565 ///////////////////////////////////////////////////////////////////////////////
567 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
568 const SMDS_MeshNode * n2,
569 const SMDS_MeshNode * n3,
570 const SMDS_MeshNode * n4,
571 const SMDS_MeshNode * n5,
572 const SMDS_MeshNode * n6)
574 int ID = myElementIDFactory->GetFreeID();
575 SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID);
576 if(v==NULL) myElementIDFactory->ReleaseID(ID);
580 ///////////////////////////////////////////////////////////////////////////////
581 ///Create a new prism and add it to the mesh.
582 ///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle.
583 ///@param ID The ID of the new volume
584 ///@return The created prism or NULL if an element with this ID already exists
585 ///or if input nodes are not found.
586 ///////////////////////////////////////////////////////////////////////////////
588 SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
596 SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6;
597 node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
598 node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
599 node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
600 node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
601 node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5);
602 node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6);
603 if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6) return NULL;
604 return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6, ID);
607 ///////////////////////////////////////////////////////////////////////////////
608 ///Create a new prism and add it to the mesh.
609 ///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle.
610 ///@param ID The ID of the new volume
611 ///@return The created prism
612 ///////////////////////////////////////////////////////////////////////////////
614 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
615 const SMDS_MeshNode * n2,
616 const SMDS_MeshNode * n3,
617 const SMDS_MeshNode * n4,
618 const SMDS_MeshNode * n5,
619 const SMDS_MeshNode * n6,
622 SMDS_MeshVolume* volume = 0;
623 if ( !n1 || !n2 || !n3 || !n4 || !n5 || !n6) return volume;
625 if(hasConstructionFaces()) {
626 SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3);
627 SMDS_MeshFace * f2=FindFaceOrCreate(n4,n5,n6);
628 SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n5,n2);
629 SMDS_MeshFace * f4=FindFaceOrCreate(n2,n5,n6,n3);
630 SMDS_MeshFace * f5=FindFaceOrCreate(n3,n6,n4,n1);
631 volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5);
632 myVolumes.Add(volume);
635 else if(hasConstructionEdges()) {
636 MESSAGE("Error : Not implemented");
640 volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6);
641 myVolumes.Add(volume);
645 if (!registerElement(ID, volume)) {
646 RemoveElement(volume, false);
652 ///////////////////////////////////////////////////////////////////////////////
653 ///Create a new hexahedron and add it to the mesh.
654 ///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges.
655 ///@return The created hexahedron
656 ///////////////////////////////////////////////////////////////////////////////
658 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
659 const SMDS_MeshNode * n2,
660 const SMDS_MeshNode * n3,
661 const SMDS_MeshNode * n4,
662 const SMDS_MeshNode * n5,
663 const SMDS_MeshNode * n6,
664 const SMDS_MeshNode * n7,
665 const SMDS_MeshNode * n8)
667 int ID = myElementIDFactory->GetFreeID();
668 SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID);
669 if(v==NULL) myElementIDFactory->ReleaseID(ID);
673 ///////////////////////////////////////////////////////////////////////////////
674 ///Create a new hexahedron and add it to the mesh.
675 ///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges.
676 ///@param ID The ID of the new volume
677 ///@return The created hexahedron or NULL if an element with this ID already
678 ///exists or if input nodes are not found.
679 ///////////////////////////////////////////////////////////////////////////////
681 SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
691 SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6, *node7, *node8;
692 node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
693 node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
694 node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
695 node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
696 node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5);
697 node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6);
698 node7 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode7);
699 node8 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode8);
700 if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6 || !node7 || !node8)
702 return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6,
706 ///////////////////////////////////////////////////////////////////////////////
707 ///Create a new hexahedron and add it to the mesh.
708 ///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges.
709 ///@param ID The ID of the new volume
710 ///@return The created prism or NULL if an element with this ID already exists
711 ///or if input nodes are not found.
712 ///////////////////////////////////////////////////////////////////////////////
714 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
715 const SMDS_MeshNode * n2,
716 const SMDS_MeshNode * n3,
717 const SMDS_MeshNode * n4,
718 const SMDS_MeshNode * n5,
719 const SMDS_MeshNode * n6,
720 const SMDS_MeshNode * n7,
721 const SMDS_MeshNode * n8,
724 SMDS_MeshVolume* volume = 0;
725 if ( !n1 || !n2 || !n3 || !n4 || !n5 || !n6 || !n7 || !n8) return volume;
727 if(hasConstructionFaces()) {
728 SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4);
729 SMDS_MeshFace * f2=FindFaceOrCreate(n5,n6,n7,n8);
730 SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n8,n5);
731 SMDS_MeshFace * f4=FindFaceOrCreate(n1,n2,n6,n5);
732 SMDS_MeshFace * f5=FindFaceOrCreate(n2,n3,n7,n6);
733 SMDS_MeshFace * f6=FindFaceOrCreate(n3,n4,n8,n7);
734 volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6);
735 myVolumes.Add(volume);
738 else if(hasConstructionEdges()) {
739 MESSAGE("Error : Not implemented");
743 // volume=new SMDS_HexahedronOfNodes(n1,n2,n3,n4,n5,n6,n7,n8);
744 volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6,n7,n8);
745 myVolumes.Add(volume);
749 if (!registerElement(ID, volume)) {
750 RemoveElement(volume, false);
756 ///////////////////////////////////////////////////////////////////////////////
757 ///Create a new tetrahedron defined by its faces and add it to the mesh.
758 ///@return The created tetrahedron
759 ///////////////////////////////////////////////////////////////////////////////
761 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1,
762 const SMDS_MeshFace * f2,
763 const SMDS_MeshFace * f3,
764 const SMDS_MeshFace * f4)
766 if (!hasConstructionFaces())
768 return AddVolumeWithID(f1,f2,f3,f4, myElementIDFactory->GetFreeID());
771 ///////////////////////////////////////////////////////////////////////////////
772 ///Create a new tetrahedron defined by its faces and add it to the mesh.
773 ///@param ID The ID of the new volume
774 ///@return The created tetrahedron
775 ///////////////////////////////////////////////////////////////////////////////
777 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1,
778 const SMDS_MeshFace * f2,
779 const SMDS_MeshFace * f3,
780 const SMDS_MeshFace * f4,
783 if (!hasConstructionFaces())
785 if ( !f1 || !f2 || !f3 || !f4) return 0;
787 SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4);
788 myVolumes.Add(volume);
791 if (!registerElement(ID, volume)) {
792 RemoveElement(volume, false);
798 ///////////////////////////////////////////////////////////////////////////////
799 ///Create a new pyramid defined by its faces and add it to the mesh.
800 ///@return The created pyramid
801 ///////////////////////////////////////////////////////////////////////////////
803 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1,
804 const SMDS_MeshFace * f2,
805 const SMDS_MeshFace * f3,
806 const SMDS_MeshFace * f4,
807 const SMDS_MeshFace * f5)
809 if (!hasConstructionFaces())
811 return AddVolumeWithID(f1,f2,f3,f4,f5, myElementIDFactory->GetFreeID());
814 ///////////////////////////////////////////////////////////////////////////////
815 ///Create a new pyramid defined by its faces and add it to the mesh.
816 ///@param ID The ID of the new volume
817 ///@return The created pyramid
818 ///////////////////////////////////////////////////////////////////////////////
820 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1,
821 const SMDS_MeshFace * f2,
822 const SMDS_MeshFace * f3,
823 const SMDS_MeshFace * f4,
824 const SMDS_MeshFace * f5,
827 if (!hasConstructionFaces())
829 if ( !f1 || !f2 || !f3 || !f4 || !f5) return 0;
831 SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5);
832 myVolumes.Add(volume);
833 myInfo.myNbPyramids++;
835 if (!registerElement(ID, volume)) {
836 RemoveElement(volume, false);
842 ///////////////////////////////////////////////////////////////////////////////
843 ///Create a new prism defined by its faces and add it to the mesh.
844 ///@return The created prism
845 ///////////////////////////////////////////////////////////////////////////////
847 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1,
848 const SMDS_MeshFace * f2,
849 const SMDS_MeshFace * f3,
850 const SMDS_MeshFace * f4,
851 const SMDS_MeshFace * f5,
852 const SMDS_MeshFace * f6)
854 if (!hasConstructionFaces())
856 return AddVolumeWithID(f1,f2,f3,f4,f5,f6, myElementIDFactory->GetFreeID());
859 ///////////////////////////////////////////////////////////////////////////////
860 ///Create a new prism defined by its faces and add it to the mesh.
861 ///@param ID The ID of the new volume
862 ///@return The created prism
863 ///////////////////////////////////////////////////////////////////////////////
865 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1,
866 const SMDS_MeshFace * f2,
867 const SMDS_MeshFace * f3,
868 const SMDS_MeshFace * f4,
869 const SMDS_MeshFace * f5,
870 const SMDS_MeshFace * f6,
873 if (!hasConstructionFaces())
875 if ( !f1 || !f2 || !f3 || !f4 || !f5 || !f6) return 0;
877 SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6);
878 myVolumes.Add(volume);
881 if (!registerElement(ID, volume)) {
882 RemoveElement(volume, false);
888 ///////////////////////////////////////////////////////////////////////////////
889 /// Add a polygon defined by its nodes IDs
890 ///////////////////////////////////////////////////////////////////////////////
892 SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID (std::vector<int> nodes_ids,
895 int nbNodes = nodes_ids.size();
896 std::vector<const SMDS_MeshNode*> nodes (nbNodes);
897 for (int i = 0; i < nbNodes; i++) {
898 nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]);
899 if (!nodes[i]) return NULL;
901 return SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID);
904 ///////////////////////////////////////////////////////////////////////////////
905 /// Add a polygon defined by its nodes
906 ///////////////////////////////////////////////////////////////////////////////
908 SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID
909 (std::vector<const SMDS_MeshNode*> nodes,
912 SMDS_MeshFace * face;
915 if (hasConstructionEdges())
917 MESSAGE("Error : Not implemented");
922 for ( int i = 0; i < nodes.size(); ++i )
923 if ( !nodes[ i ] ) return 0;
924 face = new SMDS_PolygonalFaceOfNodes(nodes);
926 myInfo.myNbPolygons++;
929 if (!registerElement(ID, face)) {
930 RemoveElement(face, false);
936 ///////////////////////////////////////////////////////////////////////////////
937 /// Add a polygon defined by its nodes.
938 /// An ID is automatically affected to the created face.
939 ///////////////////////////////////////////////////////////////////////////////
941 SMDS_MeshFace* SMDS_Mesh::AddPolygonalFace (std::vector<const SMDS_MeshNode*> nodes)
943 return SMDS_Mesh::AddPolygonalFaceWithID(nodes, myElementIDFactory->GetFreeID());
946 ///////////////////////////////////////////////////////////////////////////////
947 /// Create a new polyhedral volume and add it to the mesh.
948 /// @param ID The ID of the new volume
949 /// @return The created volume or NULL if an element with this ID already exists
950 /// or if input nodes are not found.
951 ///////////////////////////////////////////////////////////////////////////////
953 SMDS_MeshVolume * SMDS_Mesh::AddPolyhedralVolumeWithID
954 (std::vector<int> nodes_ids,
955 std::vector<int> quantities,
958 int nbNodes = nodes_ids.size();
959 std::vector<const SMDS_MeshNode*> nodes (nbNodes);
960 for (int i = 0; i < nbNodes; i++) {
961 nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]);
962 if (!nodes[i]) return NULL;
964 return SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
967 ///////////////////////////////////////////////////////////////////////////////
968 /// Create a new polyhedral volume and add it to the mesh.
969 /// @param ID The ID of the new volume
970 /// @return The created volume
971 ///////////////////////////////////////////////////////////////////////////////
973 SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolumeWithID
974 (std::vector<const SMDS_MeshNode*> nodes,
975 std::vector<int> quantities,
978 SMDS_MeshVolume* volume;
980 if (hasConstructionFaces()) {
981 MESSAGE("Error : Not implemented");
983 } else if (hasConstructionEdges()) {
984 MESSAGE("Error : Not implemented");
987 for ( int i = 0; i < nodes.size(); ++i )
988 if ( !nodes[ i ] ) return 0;
989 volume = new SMDS_PolyhedralVolumeOfNodes(nodes, quantities);
990 myVolumes.Add(volume);
991 myInfo.myNbPolyhedrons++;
994 if (!registerElement(ID, volume)) {
995 RemoveElement(volume, false);
1001 ///////////////////////////////////////////////////////////////////////////////
1002 /// Create a new polyhedral volume and add it to the mesh.
1003 /// @return The created volume
1004 ///////////////////////////////////////////////////////////////////////////////
1006 SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolume
1007 (std::vector<const SMDS_MeshNode*> nodes,
1008 std::vector<int> quantities)
1010 int ID = myElementIDFactory->GetFreeID();
1011 SMDS_MeshVolume * v = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
1012 if (v == NULL) myElementIDFactory->ReleaseID(ID);
1016 ///////////////////////////////////////////////////////////////////////////////
1017 /// Registers element with the given ID, maintains inverse connections
1018 ///////////////////////////////////////////////////////////////////////////////
1019 bool SMDS_Mesh::registerElement(int ID, SMDS_MeshElement * element)
1021 if (myElementIDFactory->BindID(ID, element)) {
1022 SMDS_ElemIteratorPtr it = element->nodesIterator();
1023 while (it->more()) {
1024 SMDS_MeshNode *node = static_cast<SMDS_MeshNode*>
1025 (const_cast<SMDS_MeshElement*>(it->next()));
1026 node->AddInverseElement(element);
1033 ///////////////////////////////////////////////////////////////////////////////
1034 /// Return the node whose ID is 'ID'.
1035 ///////////////////////////////////////////////////////////////////////////////
1036 const SMDS_MeshNode * SMDS_Mesh::FindNode(int ID) const
1038 return (const SMDS_MeshNode *)myNodeIDFactory->MeshElement(ID);
1041 ///////////////////////////////////////////////////////////////////////////////
1042 ///Create a triangle and add it to the current mesh. This methode do not bind a
1043 ///ID to the create triangle.
1044 ///////////////////////////////////////////////////////////////////////////////
1045 SMDS_MeshFace * SMDS_Mesh::createTriangle(const SMDS_MeshNode * node1,
1046 const SMDS_MeshNode * node2,
1047 const SMDS_MeshNode * node3)
1049 if ( !node1 || !node2 || !node3) return 0;
1051 if(hasConstructionEdges())
1053 SMDS_MeshEdge *edge1, *edge2, *edge3;
1054 edge1=FindEdgeOrCreate(node1,node2);
1055 edge2=FindEdgeOrCreate(node2,node3);
1056 edge3=FindEdgeOrCreate(node3,node1);
1058 SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3);
1064 SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3);
1068 myInfo.myNbTriangles++;
1071 ///////////////////////////////////////////////////////////////////////////////
1072 ///Create a quadrangle and add it to the current mesh. This methode do not bind
1073 ///a ID to the create triangle.
1074 ///////////////////////////////////////////////////////////////////////////////
1075 SMDS_MeshFace * SMDS_Mesh::createQuadrangle(const SMDS_MeshNode * node1,
1076 const SMDS_MeshNode * node2,
1077 const SMDS_MeshNode * node3,
1078 const SMDS_MeshNode * node4)
1080 if ( !node1 || !node2 || !node3 || !node4 ) return 0;
1082 if(hasConstructionEdges())
1084 SMDS_MeshEdge *edge1, *edge2, *edge3, *edge4;
1085 edge1=FindEdgeOrCreate(node1,node2);
1086 edge2=FindEdgeOrCreate(node2,node3);
1087 edge3=FindEdgeOrCreate(node3,node4);
1088 edge4=FindEdgeOrCreate(node4,node1);
1090 SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3,edge4);
1096 SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3,node4);
1100 myInfo.myNbTriangles++;
1103 ///////////////////////////////////////////////////////////////////////////////
1104 /// Remove a node and all the elements which own this node
1105 ///////////////////////////////////////////////////////////////////////////////
1107 void SMDS_Mesh::RemoveNode(const SMDS_MeshNode * node)
1109 RemoveElement(node, true);
1112 ///////////////////////////////////////////////////////////////////////////////
1113 /// Remove an edge and all the elements which own this edge
1114 ///////////////////////////////////////////////////////////////////////////////
1116 void SMDS_Mesh::RemoveEdge(const SMDS_MeshEdge * edge)
1118 RemoveElement(edge,true);
1121 ///////////////////////////////////////////////////////////////////////////////
1122 /// Remove an face and all the elements which own this face
1123 ///////////////////////////////////////////////////////////////////////////////
1125 void SMDS_Mesh::RemoveFace(const SMDS_MeshFace * face)
1127 RemoveElement(face, true);
1130 ///////////////////////////////////////////////////////////////////////////////
1132 ///////////////////////////////////////////////////////////////////////////////
1134 void SMDS_Mesh::RemoveVolume(const SMDS_MeshVolume * volume)
1136 RemoveElement(volume, true);
1139 //=======================================================================
1140 //function : RemoveFromParent
1142 //=======================================================================
1144 bool SMDS_Mesh::RemoveFromParent()
1146 if (myParent==NULL) return false;
1147 else return (myParent->RemoveSubMesh(this));
1150 //=======================================================================
1151 //function : RemoveSubMesh
1153 //=======================================================================
1155 bool SMDS_Mesh::RemoveSubMesh(const SMDS_Mesh * aMesh)
1159 list<SMDS_Mesh *>::iterator itmsh=myChildren.begin();
1160 for (; itmsh!=myChildren.end() && !found; itmsh++)
1162 SMDS_Mesh * submesh = *itmsh;
1163 if (submesh == aMesh)
1166 myChildren.erase(itmsh);
1173 //=======================================================================
1174 //function : ChangeElementNodes
1176 //=======================================================================
1178 bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem,
1179 const SMDS_MeshNode * nodes[],
1182 // keep current nodes of elem
1183 set<const SMDS_MeshElement*> oldNodes;
1184 SMDS_ElemIteratorPtr itn = elem->nodesIterator();
1186 oldNodes.insert( itn->next() );
1190 switch ( elem->GetType() )
1192 case SMDSAbs_Edge: {
1193 if ( nbnodes == 2 ) {
1194 const SMDS_MeshEdge* edge = dynamic_cast<const SMDS_MeshEdge*>( elem );
1196 Ok = const_cast<SMDS_MeshEdge*>( edge )->ChangeNodes( nodes[0], nodes[1] );
1198 else if ( nbnodes == 3 ) {
1199 const SMDS_QuadraticEdge* edge = dynamic_cast<const SMDS_QuadraticEdge*>( elem );
1201 Ok = const_cast<SMDS_QuadraticEdge*>( edge )->ChangeNodes( nodes[0], nodes[1], nodes[2] );
1205 case SMDSAbs_Face: {
1206 const SMDS_FaceOfNodes* face = dynamic_cast<const SMDS_FaceOfNodes*>( elem );
1208 Ok = const_cast<SMDS_FaceOfNodes*>( face )->ChangeNodes( nodes, nbnodes );
1211 const SMDS_QuadraticFaceOfNodes* QF =
1212 dynamic_cast<const SMDS_QuadraticFaceOfNodes*>( elem );
1214 Ok = const_cast<SMDS_QuadraticFaceOfNodes*>( QF )->ChangeNodes( nodes, nbnodes );
1218 const SMDS_PolygonalFaceOfNodes* face = dynamic_cast<const SMDS_PolygonalFaceOfNodes*>(elem);
1220 Ok = const_cast<SMDS_PolygonalFaceOfNodes*>(face)->ChangeNodes(nodes, nbnodes);
1227 //case SMDSAbs_PolygonalFace: {
1228 // const SMDS_PolygonalFaceOfNodes* face = dynamic_cast<const SMDS_PolygonalFaceOfNodes*>(elem);
1230 // Ok = const_cast<SMDS_PolygonalFaceOfNodes*>(face)->ChangeNodes(nodes, nbnodes);
1234 case SMDSAbs_Volume: {
1235 const SMDS_VolumeOfNodes* vol = dynamic_cast<const SMDS_VolumeOfNodes*>( elem );
1237 Ok = const_cast<SMDS_VolumeOfNodes*>( vol )->ChangeNodes( nodes, nbnodes );
1240 const SMDS_QuadraticVolumeOfNodes* QV = dynamic_cast<const SMDS_QuadraticVolumeOfNodes*>( elem );
1242 Ok = const_cast<SMDS_QuadraticVolumeOfNodes*>( QV )->ChangeNodes( nodes, nbnodes );
1248 MESSAGE ( "WRONG ELEM TYPE");
1251 if ( Ok ) { // update InverseElements
1253 // AddInverseElement to new nodes
1254 for ( int i = 0; i < nbnodes; i++ )
1255 if ( oldNodes.find( nodes[i] ) == oldNodes.end() )
1257 const_cast<SMDS_MeshNode*>( nodes[i] )->AddInverseElement( elem );
1259 // remove from oldNodes a node that remains in elem
1260 oldNodes.erase( nodes[i] );
1263 // RemoveInverseElement from the nodes removed from elem
1264 set<const SMDS_MeshElement*>::iterator it;
1265 for ( it = oldNodes.begin(); it != oldNodes.end(); it++ )
1267 SMDS_MeshNode * n = static_cast<SMDS_MeshNode *>
1268 (const_cast<SMDS_MeshElement *>( *it ));
1269 n->RemoveInverseElement( elem );
1273 //MESSAGE ( "::ChangeNodes() Ok = " << Ok);
1278 //=======================================================================
1279 //function : ChangePolyhedronNodes
1280 //purpose : to change nodes of polyhedral volume
1281 //=======================================================================
1282 bool SMDS_Mesh::ChangePolyhedronNodes (const SMDS_MeshElement * elem,
1283 std::vector<const SMDS_MeshNode*> nodes,
1284 std::vector<int> quantities)
1286 if (elem->GetType() != SMDSAbs_Volume) {
1287 MESSAGE("WRONG ELEM TYPE");
1291 const SMDS_PolyhedralVolumeOfNodes* vol = dynamic_cast<const SMDS_PolyhedralVolumeOfNodes*>(elem);
1296 // keep current nodes of elem
1297 set<const SMDS_MeshElement*> oldNodes;
1298 SMDS_ElemIteratorPtr itn = elem->nodesIterator();
1299 while (itn->more()) {
1300 oldNodes.insert(itn->next());
1304 bool Ok = const_cast<SMDS_PolyhedralVolumeOfNodes*>(vol)->ChangeNodes(nodes, quantities);
1309 // update InverseElements
1311 // AddInverseElement to new nodes
1312 int nbnodes = nodes.size();
1313 for (int i = 0; i < nbnodes; i++) {
1314 if (oldNodes.find(nodes[i]) == oldNodes.end()) {
1316 const_cast<SMDS_MeshNode*>(nodes[i])->AddInverseElement(elem);
1318 // remove from oldNodes a node that remains in elem
1319 oldNodes.erase(nodes[i]);
1323 // RemoveInverseElement from the nodes removed from elem
1324 set<const SMDS_MeshElement*>::iterator it;
1325 for (it = oldNodes.begin(); it != oldNodes.end(); it++) {
1326 SMDS_MeshNode * n = static_cast<SMDS_MeshNode *>
1327 (const_cast<SMDS_MeshElement *>( *it ));
1328 n->RemoveInverseElement(elem);
1335 //=======================================================================
1336 //function : FindEdge
1338 //=======================================================================
1340 const SMDS_MeshEdge* SMDS_Mesh::FindEdge(int idnode1, int idnode2) const
1342 const SMDS_MeshNode * node1=FindNode(idnode1);
1343 const SMDS_MeshNode * node2=FindNode(idnode2);
1344 if((node1==NULL)||(node2==NULL)) return NULL;
1345 return FindEdge(node1,node2);
1348 //#include "Profiler.h"
1349 const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1,
1350 const SMDS_MeshNode * node2)
1352 if ( !node1 ) return 0;
1353 const SMDS_MeshEdge * toReturn=NULL;
1356 SMDS_ElemIteratorPtr it1=node1->GetInverseElementIterator(SMDSAbs_Edge);
1359 while(it1->more()) {
1360 const SMDS_MeshElement * e = it1->next();
1361 if ( e->NbNodes() == 2 && e->GetNodeIndex( node2 ) >= 0 ) {
1362 toReturn = static_cast<const SMDS_MeshEdge*>( e );
1371 //=======================================================================
1372 //function : FindEdgeOrCreate
1374 //=======================================================================
1376 SMDS_MeshEdge* SMDS_Mesh::FindEdgeOrCreate(const SMDS_MeshNode * node1,
1377 const SMDS_MeshNode * node2)
1379 if ( !node1 || !node2) return 0;
1380 SMDS_MeshEdge * toReturn=NULL;
1381 toReturn=const_cast<SMDS_MeshEdge*>(FindEdge(node1,node2));
1382 if(toReturn==NULL) {
1384 toReturn=new SMDS_MeshEdge(node1,node2);
1385 myEdges.Add(toReturn);
1392 //=======================================================================
1393 //function : FindEdge
1395 //=======================================================================
1397 const SMDS_MeshEdge* SMDS_Mesh::FindEdge(int idnode1, int idnode2,
1400 const SMDS_MeshNode * node1=FindNode(idnode1);
1401 const SMDS_MeshNode * node2=FindNode(idnode2);
1402 const SMDS_MeshNode * node3=FindNode(idnode3);
1403 return FindEdge(node1,node2,node3);
1406 const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1,
1407 const SMDS_MeshNode * node2,
1408 const SMDS_MeshNode * node3)
1410 if ( !node1 ) return 0;
1411 SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Edge);
1412 while(it1->more()) {
1413 const SMDS_MeshElement * e = it1->next();
1414 if ( e->NbNodes() == 3 ) {
1415 SMDS_ElemIteratorPtr it2 = e->nodesIterator();
1416 while(it2->more()) {
1417 const SMDS_MeshElement* n = it2->next();
1427 return static_cast<const SMDS_MeshEdge *> (e);
1434 //=======================================================================
1435 //function : FindFace
1437 //=======================================================================
1439 const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2,
1442 const SMDS_MeshNode * node1=FindNode(idnode1);
1443 const SMDS_MeshNode * node2=FindNode(idnode2);
1444 const SMDS_MeshNode * node3=FindNode(idnode3);
1445 return FindFace(node1, node2, node3);
1448 const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
1449 const SMDS_MeshNode *node2,
1450 const SMDS_MeshNode *node3)
1452 if ( !node1 ) return 0;
1453 SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
1454 while(it1->more()) {
1455 const SMDS_MeshElement * e = it1->next();
1456 if ( e->NbNodes() == 3 ) {
1457 SMDS_ElemIteratorPtr it2 = e->nodesIterator();
1458 while(it2->more()) {
1459 const SMDS_MeshElement* n = it2->next();
1469 return static_cast<const SMDS_MeshFace *> (e);
1475 SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(const SMDS_MeshNode *node1,
1476 const SMDS_MeshNode *node2,
1477 const SMDS_MeshNode *node3)
1479 SMDS_MeshFace * toReturn=NULL;
1480 toReturn = const_cast<SMDS_MeshFace*>(FindFace(node1,node2,node3));
1481 if(toReturn==NULL) {
1482 toReturn = createTriangle(node1,node2,node3);
1488 //=======================================================================
1489 //function : FindFace
1491 //=======================================================================
1493 const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2,
1494 int idnode3, int idnode4) const
1496 const SMDS_MeshNode * node1=FindNode(idnode1);
1497 const SMDS_MeshNode * node2=FindNode(idnode2);
1498 const SMDS_MeshNode * node3=FindNode(idnode3);
1499 const SMDS_MeshNode * node4=FindNode(idnode4);
1500 return FindFace(node1, node2, node3, node4);
1503 const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
1504 const SMDS_MeshNode *node2,
1505 const SMDS_MeshNode *node3,
1506 const SMDS_MeshNode *node4)
1508 if ( !node1 ) return 0;
1509 SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
1510 while(it1->more()) {
1511 const SMDS_MeshElement * e = it1->next();
1512 if ( e->NbNodes() == 4 ) {
1513 SMDS_ElemIteratorPtr it2 = e->nodesIterator();
1514 while(it2->more()) {
1515 const SMDS_MeshElement* n = it2->next();
1526 return static_cast<const SMDS_MeshFace *> (e);
1532 SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(const SMDS_MeshNode *node1,
1533 const SMDS_MeshNode *node2,
1534 const SMDS_MeshNode *node3,
1535 const SMDS_MeshNode *node4)
1537 SMDS_MeshFace * toReturn=NULL;
1538 toReturn=const_cast<SMDS_MeshFace*>(FindFace(node1,node2,node3,node4));
1539 if(toReturn==NULL) {
1540 toReturn=createQuadrangle(node1,node2,node3,node4);
1546 //=======================================================================
1547 //function : FindFace
1548 //purpose :quadratic triangle
1549 //=======================================================================
1551 const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2,
1552 int idnode3, int idnode4,
1553 int idnode5, int idnode6) const
1555 const SMDS_MeshNode * node1 = FindNode(idnode1);
1556 const SMDS_MeshNode * node2 = FindNode(idnode2);
1557 const SMDS_MeshNode * node3 = FindNode(idnode3);
1558 const SMDS_MeshNode * node4 = FindNode(idnode4);
1559 const SMDS_MeshNode * node5 = FindNode(idnode5);
1560 const SMDS_MeshNode * node6 = FindNode(idnode6);
1561 return FindFace(node1, node2, node3, node4, node5, node6);
1564 const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
1565 const SMDS_MeshNode *node2,
1566 const SMDS_MeshNode *node3,
1567 const SMDS_MeshNode *node4,
1568 const SMDS_MeshNode *node5,
1569 const SMDS_MeshNode *node6)
1571 if ( !node1 ) return 0;
1572 SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
1573 while(it1->more()) {
1574 const SMDS_MeshElement * e = it1->next();
1575 if ( e->NbNodes() == 6 ) {
1576 SMDS_ElemIteratorPtr it2 = e->nodesIterator();
1577 while(it2->more()) {
1578 const SMDS_MeshElement* n = it2->next();
1591 return static_cast<const SMDS_MeshFace *> (e);
1598 //=======================================================================
1599 //function : FindFace
1600 //purpose : quadratic quadrangle
1601 //=======================================================================
1603 const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2,
1604 int idnode3, int idnode4,
1605 int idnode5, int idnode6,
1606 int idnode7, int idnode8) const
1608 const SMDS_MeshNode * node1 = FindNode(idnode1);
1609 const SMDS_MeshNode * node2 = FindNode(idnode2);
1610 const SMDS_MeshNode * node3 = FindNode(idnode3);
1611 const SMDS_MeshNode * node4 = FindNode(idnode4);
1612 const SMDS_MeshNode * node5 = FindNode(idnode5);
1613 const SMDS_MeshNode * node6 = FindNode(idnode6);
1614 const SMDS_MeshNode * node7 = FindNode(idnode7);
1615 const SMDS_MeshNode * node8 = FindNode(idnode8);
1616 return FindFace(node1, node2, node3, node4, node5, node6, node7, node8);
1619 const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1,
1620 const SMDS_MeshNode *node2,
1621 const SMDS_MeshNode *node3,
1622 const SMDS_MeshNode *node4,
1623 const SMDS_MeshNode *node5,
1624 const SMDS_MeshNode *node6,
1625 const SMDS_MeshNode *node7,
1626 const SMDS_MeshNode *node8)
1628 if ( !node1 ) return 0;
1629 SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face);
1630 while(it1->more()) {
1631 const SMDS_MeshElement * e = it1->next();
1632 if ( e->NbNodes() == 8 ) {
1633 SMDS_ElemIteratorPtr it2 = e->nodesIterator();
1634 while(it2->more()) {
1635 const SMDS_MeshElement* n = it2->next();
1650 return static_cast<const SMDS_MeshFace *> (e);
1657 //=======================================================================
1658 //function : FindElement
1660 //=======================================================================
1662 const SMDS_MeshElement* SMDS_Mesh::FindElement(int IDelem) const
1664 return myElementIDFactory->MeshElement(IDelem);
1667 //=======================================================================
1668 //function : FindFace
1669 //purpose : find polygon
1670 //=======================================================================
1672 const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector<int> nodes_ids) const
1674 int nbnodes = nodes_ids.size();
1675 std::vector<const SMDS_MeshNode *> poly_nodes (nbnodes);
1676 for (int inode = 0; inode < nbnodes; inode++) {
1677 const SMDS_MeshNode * node = FindNode(nodes_ids[inode]);
1678 if (node == NULL) return NULL;
1680 return FindFace(poly_nodes);
1683 const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector<const SMDS_MeshNode *> nodes)
1685 if ( nodes.size() > 2 && nodes[0] ) {
1686 SMDS_ElemIteratorPtr itF = nodes[0]->GetInverseElementIterator(SMDSAbs_Face);
1687 while (itF->more()) {
1688 const SMDS_MeshElement* f = itF->next();
1689 if ( f->NbNodes() == nodes.size() ) {
1690 SMDS_ElemIteratorPtr it2 = f->nodesIterator();
1691 while(it2->more()) {
1692 if ( find( nodes.begin(), nodes.end(), it2->next() ) == nodes.end() ) {
1698 return static_cast<const SMDS_MeshFace *> (f);
1705 //=======================================================================
1706 //function : DumpNodes
1708 //=======================================================================
1710 void SMDS_Mesh::DumpNodes() const
1712 MESSAGE("dump nodes of mesh : ");
1713 SMDS_NodeIteratorPtr itnode=nodesIterator();
1714 while(itnode->more()) MESSAGE(itnode->next());
1717 //=======================================================================
1718 //function : DumpEdges
1720 //=======================================================================
1722 void SMDS_Mesh::DumpEdges() const
1724 MESSAGE("dump edges of mesh : ");
1725 SMDS_EdgeIteratorPtr itedge=edgesIterator();
1726 while(itedge->more()) MESSAGE(itedge->next());
1729 //=======================================================================
1730 //function : DumpFaces
1732 //=======================================================================
1734 void SMDS_Mesh::DumpFaces() const
1736 MESSAGE("dump faces of mesh : ");
1737 SMDS_FaceIteratorPtr itface=facesIterator();
1738 while(itface->more()) MESSAGE(itface->next());
1741 //=======================================================================
1742 //function : DumpVolumes
1744 //=======================================================================
1746 void SMDS_Mesh::DumpVolumes() const
1748 MESSAGE("dump volumes of mesh : ");
1749 SMDS_VolumeIteratorPtr itvol=volumesIterator();
1750 while(itvol->more()) MESSAGE(itvol->next());
1753 //=======================================================================
1754 //function : DebugStats
1756 //=======================================================================
1758 void SMDS_Mesh::DebugStats() const
1760 MESSAGE("Debug stats of mesh : ");
1762 MESSAGE("===== NODES ====="<<NbNodes());
1763 MESSAGE("===== EDGES ====="<<NbEdges());
1764 MESSAGE("===== FACES ====="<<NbFaces());
1765 MESSAGE("===== VOLUMES ====="<<NbVolumes());
1767 MESSAGE("End Debug stats of mesh ");
1771 SMDS_NodeIteratorPtr itnode=nodesIterator();
1772 int sizeofnodes = 0;
1773 int sizeoffaces = 0;
1775 while(itnode->more())
1777 const SMDS_MeshNode *node = itnode->next();
1779 sizeofnodes += sizeof(*node);
1781 SMDS_ElemIteratorPtr it = node->GetInverseElementIterator();
1784 const SMDS_MeshElement *me = it->next();
1785 sizeofnodes += sizeof(me);
1790 SMDS_FaceIteratorPtr itface=facesIterator();
1791 while(itface->more())
1793 const SMDS_MeshElement *face = itface->next();
1794 sizeoffaces += sizeof(*face);
1797 MESSAGE("total size of node elements = " << sizeofnodes);;
1798 MESSAGE("total size of face elements = " << sizeoffaces);;
1803 ///////////////////////////////////////////////////////////////////////////////
1804 /// Return the number of nodes
1805 ///////////////////////////////////////////////////////////////////////////////
1806 int SMDS_Mesh::NbNodes() const
1808 return myNodes.Size();
1811 ///////////////////////////////////////////////////////////////////////////////
1812 /// Return the number of edges (including construction edges)
1813 ///////////////////////////////////////////////////////////////////////////////
1814 int SMDS_Mesh::NbEdges() const
1816 return myEdges.Size();
1819 ///////////////////////////////////////////////////////////////////////////////
1820 /// Return the number of faces (including construction faces)
1821 ///////////////////////////////////////////////////////////////////////////////
1822 int SMDS_Mesh::NbFaces() const
1824 return myFaces.Size();
1827 ///////////////////////////////////////////////////////////////////////////////
1828 /// Return the number of volumes
1829 ///////////////////////////////////////////////////////////////////////////////
1830 int SMDS_Mesh::NbVolumes() const
1832 return myVolumes.Size();
1835 ///////////////////////////////////////////////////////////////////////////////
1836 /// Return the number of child mesh of this mesh.
1837 /// Note that the tree structure of SMDS_Mesh seems to be unused in this version
1838 /// (2003-09-08) of SMESH
1839 ///////////////////////////////////////////////////////////////////////////////
1840 int SMDS_Mesh::NbSubMesh() const
1842 return myChildren.size();
1845 ///////////////////////////////////////////////////////////////////////////////
1846 /// Destroy the mesh and all its elements
1847 /// All pointer on elements owned by this mesh become illegals.
1848 ///////////////////////////////////////////////////////////////////////////////
1849 SMDS_Mesh::~SMDS_Mesh()
1851 list<SMDS_Mesh*>::iterator itc=myChildren.begin();
1852 while(itc!=myChildren.end())
1858 SetOfNodes::Iterator itn(myNodes);
1859 for (; itn.More(); itn.Next())
1862 SetOfEdges::Iterator ite(myEdges);
1863 for (; ite.More(); ite.Next())
1865 SMDS_MeshElement* elem = ite.Value();
1867 myElementIDFactory->ReleaseID(elem->GetID());
1871 SetOfFaces::Iterator itf(myFaces);
1872 for (; itf.More(); itf.Next())
1874 SMDS_MeshElement* elem = itf.Value();
1876 myElementIDFactory->ReleaseID(elem->GetID());
1880 SetOfVolumes::Iterator itv(myVolumes);
1881 for (; itv.More(); itv.Next())
1883 SMDS_MeshElement* elem = itv.Value();
1885 myElementIDFactory->ReleaseID(elem->GetID());
1891 delete myNodeIDFactory;
1892 delete myElementIDFactory;
1896 ///////////////////////////////////////////////////////////////////////////////
1897 /// Return true if this mesh create faces with edges.
1898 /// A false returned value mean that faces are created with nodes. A concequence
1899 /// is, iteration on edges (SMDS_Element::edgesIterator) will be unavailable.
1900 ///////////////////////////////////////////////////////////////////////////////
1901 bool SMDS_Mesh::hasConstructionEdges()
1903 return myHasConstructionEdges;
1906 ///////////////////////////////////////////////////////////////////////////////
1907 /// Return true if this mesh create volumes with faces
1908 /// A false returned value mean that volumes are created with nodes or edges.
1909 /// (see hasConstructionEdges)
1910 /// A concequence is, iteration on faces (SMDS_Element::facesIterator) will be
1912 ///////////////////////////////////////////////////////////////////////////////
1913 bool SMDS_Mesh::hasConstructionFaces()
1915 return myHasConstructionFaces;
1918 ///////////////////////////////////////////////////////////////////////////////
1919 /// Return true if nodes are linked to the finit elements, they are belonging to.
1920 /// Currently, It always return true.
1921 ///////////////////////////////////////////////////////////////////////////////
1922 bool SMDS_Mesh::hasInverseElements()
1924 return myHasInverseElements;
1927 ///////////////////////////////////////////////////////////////////////////////
1928 /// Make this mesh creating construction edges (see hasConstructionEdges)
1929 /// @param b true to have construction edges, else false.
1930 ///////////////////////////////////////////////////////////////////////////////
1931 void SMDS_Mesh::setConstructionEdges(bool b)
1933 myHasConstructionEdges=b;
1936 ///////////////////////////////////////////////////////////////////////////////
1937 /// Make this mesh creating construction faces (see hasConstructionFaces)
1938 /// @param b true to have construction faces, else false.
1939 ///////////////////////////////////////////////////////////////////////////////
1940 void SMDS_Mesh::setConstructionFaces(bool b)
1942 myHasConstructionFaces=b;
1945 ///////////////////////////////////////////////////////////////////////////////
1946 /// Make this mesh creating link from nodes to elements (see hasInverseElements)
1947 /// @param b true to link nodes to elements, else false.
1948 ///////////////////////////////////////////////////////////////////////////////
1949 void SMDS_Mesh::setInverseElements(bool b)
1951 if(!b) MESSAGE("Error : inverseElement=false not implemented");
1952 myHasInverseElements=b;
1955 ///////////////////////////////////////////////////////////////////////////////
1956 /// Return an iterator on nodes of the current mesh factory
1957 ///////////////////////////////////////////////////////////////////////////////
1958 class SMDS_Mesh_MyNodeIterator:public SMDS_NodeIterator
1960 SMDS_ElemIteratorPtr myIterator;
1962 SMDS_Mesh_MyNodeIterator(const SMDS_ElemIteratorPtr& it):myIterator(it)
1967 return myIterator->more();
1970 const SMDS_MeshNode* next()
1972 return static_cast<const SMDS_MeshNode*>(myIterator->next());
1976 SMDS_NodeIteratorPtr SMDS_Mesh::nodesIterator() const
1978 return SMDS_NodeIteratorPtr
1979 (new SMDS_Mesh_MyNodeIterator(myNodeIDFactory->elementsIterator()));
1982 ///////////////////////////////////////////////////////////////////////////////
1983 /// Return an iterator on elements of the current mesh factory
1984 ///////////////////////////////////////////////////////////////////////////////
1985 SMDS_ElemIteratorPtr SMDS_Mesh::elementsIterator() const
1987 return myElementIDFactory->elementsIterator();
1990 ///////////////////////////////////////////////////////////////////////////////
1991 ///Return an iterator on edges of the current mesh.
1992 ///////////////////////////////////////////////////////////////////////////////
1993 class SMDS_Mesh_MyEdgeIterator:public SMDS_EdgeIterator
1995 typedef SMDS_Mesh::SetOfEdges SetOfEdges;
1996 SetOfEdges::Iterator myIterator;
1998 SMDS_Mesh_MyEdgeIterator(const SetOfEdges& s):myIterator(s)
2003 while(myIterator.More())
2005 if(myIterator.Value()->GetID()!=-1)
2012 const SMDS_MeshEdge* next()
2014 const SMDS_MeshEdge* current = myIterator.Value();
2020 SMDS_EdgeIteratorPtr SMDS_Mesh::edgesIterator() const
2022 return SMDS_EdgeIteratorPtr(new SMDS_Mesh_MyEdgeIterator(myEdges));
2025 ///////////////////////////////////////////////////////////////////////////////
2026 ///Return an iterator on faces of the current mesh.
2027 ///////////////////////////////////////////////////////////////////////////////
2028 class SMDS_Mesh_MyFaceIterator:public SMDS_FaceIterator
2030 typedef SMDS_Mesh::SetOfFaces SetOfFaces;
2031 SetOfFaces::Iterator myIterator;
2033 SMDS_Mesh_MyFaceIterator(const SetOfFaces& s):myIterator(s)
2038 while(myIterator.More())
2040 if(myIterator.Value()->GetID()!=-1)
2047 const SMDS_MeshFace* next()
2049 const SMDS_MeshFace* current = myIterator.Value();
2055 SMDS_FaceIteratorPtr SMDS_Mesh::facesIterator() const
2057 return SMDS_FaceIteratorPtr(new SMDS_Mesh_MyFaceIterator(myFaces));
2060 ///////////////////////////////////////////////////////////////////////////////
2061 ///Return an iterator on volumes of the current mesh.
2062 ///////////////////////////////////////////////////////////////////////////////
2063 class SMDS_Mesh_MyVolumeIterator:public SMDS_VolumeIterator
2065 typedef SMDS_Mesh::SetOfVolumes SetOfVolumes;
2066 SetOfVolumes::Iterator myIterator;
2068 SMDS_Mesh_MyVolumeIterator(const SetOfVolumes& s):myIterator(s)
2073 return myIterator.More() != Standard_False;
2076 const SMDS_MeshVolume* next()
2078 const SMDS_MeshVolume* current = myIterator.Value();
2084 SMDS_VolumeIteratorPtr SMDS_Mesh::volumesIterator() const
2086 return SMDS_VolumeIteratorPtr(new SMDS_Mesh_MyVolumeIterator(myVolumes));
2089 ///////////////////////////////////////////////////////////////////////////////
2090 /// Do intersection of sets (more than 2)
2091 ///////////////////////////////////////////////////////////////////////////////
2092 static set<const SMDS_MeshElement*> * intersectionOfSets(
2093 set<const SMDS_MeshElement*> vs[], int numberOfSets)
2095 set<const SMDS_MeshElement*>* rsetA=new set<const SMDS_MeshElement*>(vs[0]);
2096 set<const SMDS_MeshElement*>* rsetB;
2098 for(int i=0; i<numberOfSets-1; i++)
2100 rsetB=new set<const SMDS_MeshElement*>();
2102 rsetA->begin(), rsetA->end(),
2103 vs[i+1].begin(), vs[i+1].end(),
2104 inserter(*rsetB, rsetB->begin()));
2111 ///////////////////////////////////////////////////////////////////////////////
2112 /// Return the list of finit elements owning the given element
2113 ///////////////////////////////////////////////////////////////////////////////
2114 static set<const SMDS_MeshElement*> * getFinitElements(const SMDS_MeshElement * element)
2116 int numberOfSets=element->NbNodes();
2117 set<const SMDS_MeshElement*> *initSet = new set<const SMDS_MeshElement*>[numberOfSets];
2119 SMDS_ElemIteratorPtr itNodes=element->nodesIterator();
2122 while(itNodes->more())
2124 const SMDS_MeshNode * n=static_cast<const SMDS_MeshNode*>(itNodes->next());
2125 SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator();
2127 //initSet[i]=set<const SMDS_MeshElement*>();
2129 initSet[i].insert(itFe->next());
2133 set<const SMDS_MeshElement*> *retSet=intersectionOfSets(initSet, numberOfSets);
2138 ///////////////////////////////////////////////////////////////////////////////
2139 /// Return the list of nodes used only by the given elements
2140 ///////////////////////////////////////////////////////////////////////////////
2141 static set<const SMDS_MeshElement*> * getExclusiveNodes(
2142 set<const SMDS_MeshElement*>& elements)
2144 set<const SMDS_MeshElement*> * toReturn=new set<const SMDS_MeshElement*>();
2145 set<const SMDS_MeshElement*>::iterator itElements=elements.begin();
2147 while(itElements!=elements.end())
2149 SMDS_ElemIteratorPtr itNodes = (*itElements)->nodesIterator();
2152 while(itNodes->more())
2154 const SMDS_MeshNode * n=static_cast<const SMDS_MeshNode*>(itNodes->next());
2155 SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator();
2156 set<const SMDS_MeshElement*> s;
2158 s.insert(itFe->next());
2159 if(s==elements) toReturn->insert(n);
2165 ///////////////////////////////////////////////////////////////////////////////
2166 ///Find the children of an element that are made of given nodes
2167 ///@param setOfChildren The set in which matching children will be inserted
2168 ///@param element The element were to search matching children
2169 ///@param nodes The nodes that the children must have to be selected
2170 ///////////////////////////////////////////////////////////////////////////////
2171 void SMDS_Mesh::addChildrenWithNodes(set<const SMDS_MeshElement*>& setOfChildren,
2172 const SMDS_MeshElement * element, set<const SMDS_MeshElement*>& nodes)
2175 switch(element->GetType())
2178 MESSAGE("Internal Error: This should not append");
2182 SMDS_ElemIteratorPtr itn=element->nodesIterator();
2185 const SMDS_MeshElement * e=itn->next();
2186 if(nodes.find(e)!=nodes.end())
2188 setOfChildren.insert(element);
2195 SMDS_ElemIteratorPtr itn=element->nodesIterator();
2198 const SMDS_MeshElement * e=itn->next();
2199 if(nodes.find(e)!=nodes.end())
2201 setOfChildren.insert(element);
2205 if(hasConstructionEdges())
2207 SMDS_ElemIteratorPtr ite=element->edgesIterator();
2209 addChildrenWithNodes(setOfChildren, ite->next(), nodes);
2212 case SMDSAbs_Volume:
2214 if(hasConstructionFaces())
2216 SMDS_ElemIteratorPtr ite=element->facesIterator();
2218 addChildrenWithNodes(setOfChildren, ite->next(), nodes);
2220 else if(hasConstructionEdges())
2222 SMDS_ElemIteratorPtr ite=element->edgesIterator();
2224 addChildrenWithNodes(setOfChildren, ite->next(), nodes);
2230 ///////////////////////////////////////////////////////////////////////////////
2231 ///@param elem The element to delete
2232 ///@param removenodes if true remaining nodes will be removed
2233 ///////////////////////////////////////////////////////////////////////////////
2234 void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem,
2235 const bool removenodes)
2237 list<const SMDS_MeshElement *> removedElems;
2238 list<const SMDS_MeshElement *> removedNodes;
2239 RemoveElement( elem, removedElems, removedNodes, removenodes );
2242 ///////////////////////////////////////////////////////////////////////////////
2243 ///@param elem The element to delete
2244 ///@param removedElems contains all removed elements
2245 ///@param removedNodes contains all removed nodes
2246 ///@param removenodes if true remaining nodes will be removed
2247 ///////////////////////////////////////////////////////////////////////////////
2248 void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem,
2249 list<const SMDS_MeshElement *>& removedElems,
2250 list<const SMDS_MeshElement *>& removedNodes,
2253 // get finite elements built on elem
2254 set<const SMDS_MeshElement*> * s1;
2255 if (!hasConstructionEdges() && elem->GetType() == SMDSAbs_Edge ||
2256 !hasConstructionFaces() && elem->GetType() == SMDSAbs_Face ||
2257 elem->GetType() == SMDSAbs_Volume)
2259 s1 = new set<const SMDS_MeshElement*>();
2263 s1 = getFinitElements(elem);
2265 // get exclusive nodes (which would become free afterwards)
2266 set<const SMDS_MeshElement*> * s2;
2267 if (elem->GetType() == SMDSAbs_Node) // a node is removed
2269 // do not remove nodes except elem
2270 s2 = new set<const SMDS_MeshElement*>();
2275 s2 = getExclusiveNodes(*s1);
2277 // form the set of finite and construction elements to remove
2278 set<const SMDS_MeshElement*> s3;
2279 set<const SMDS_MeshElement*>::iterator it=s1->begin();
2280 while(it!=s1->end())
2282 addChildrenWithNodes(s3, *it ,*s2);
2286 if(elem->GetType()!=SMDSAbs_Node) s3.insert(elem);
2288 // remove finite and construction elements
2292 // Remove element from <InverseElements> of its nodes
2293 SMDS_ElemIteratorPtr itn=(*it)->nodesIterator();
2296 SMDS_MeshNode * n = static_cast<SMDS_MeshNode *>
2297 (const_cast<SMDS_MeshElement *>(itn->next()));
2298 n->RemoveInverseElement( (*it) );
2301 switch((*it)->GetType())
2304 MESSAGE("Internal Error: This should not happen");
2307 myEdges.Remove(static_cast<SMDS_MeshEdge*>
2308 (const_cast<SMDS_MeshElement*>(*it)));
2309 myInfo.RemoveEdge(*it);
2312 myFaces.Remove(static_cast<SMDS_MeshFace*>
2313 (const_cast<SMDS_MeshElement*>(*it)));
2314 myInfo.RemoveFace(*it);
2316 case SMDSAbs_Volume:
2317 myVolumes.Remove(static_cast<SMDS_MeshVolume*>
2318 (const_cast<SMDS_MeshElement*>(*it)));
2319 myInfo.RemoveVolume(*it);
2322 //MESSAGE( "SMDS: RM elem " << (*it)->GetID() );
2323 removedElems.push_back( (*it) );
2324 myElementIDFactory->ReleaseID((*it)->GetID());
2329 // remove exclusive (free) nodes
2333 while(it!=s2->end())
2335 //MESSAGE( "SMDS: RM node " << (*it)->GetID() );
2336 myNodes.Remove(static_cast<SMDS_MeshNode*>
2337 (const_cast<SMDS_MeshElement*>(*it)));
2339 myNodeIDFactory->ReleaseID((*it)->GetID());
2340 removedNodes.push_back( (*it) );
2351 ///////////////////////////////////////////////////////////////////////////////
2352 ///@param elem The element to delete
2353 ///////////////////////////////////////////////////////////////////////////////
2354 void SMDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elem)
2356 SMDSAbs_ElementType aType = elem->GetType();
2357 if (aType == SMDSAbs_Node) {
2358 // only free node can be removed by this method
2359 const SMDS_MeshNode* n = static_cast<const SMDS_MeshNode*>(elem);
2360 SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator();
2361 if (!itFe->more()) { // free node
2362 myNodes.Remove(const_cast<SMDS_MeshNode*>(n));
2364 myNodeIDFactory->ReleaseID(elem->GetID());
2368 if (hasConstructionEdges() || hasConstructionFaces())
2369 // this methods is only for meshes without descendants
2372 // Remove element from <InverseElements> of its nodes
2373 SMDS_ElemIteratorPtr itn = elem->nodesIterator();
2374 while (itn->more()) {
2375 SMDS_MeshNode * n = static_cast<SMDS_MeshNode *>
2376 (const_cast<SMDS_MeshElement *>(itn->next()));
2377 n->RemoveInverseElement(elem);
2380 // in meshes without descendants elements are always free
2383 myEdges.Remove(static_cast<SMDS_MeshEdge*>
2384 (const_cast<SMDS_MeshElement*>(elem)));
2385 myInfo.RemoveEdge(elem);
2388 myFaces.Remove(static_cast<SMDS_MeshFace*>
2389 (const_cast<SMDS_MeshElement*>(elem)));
2390 myInfo.RemoveFace(elem);
2392 case SMDSAbs_Volume:
2393 myVolumes.Remove(static_cast<SMDS_MeshVolume*>
2394 (const_cast<SMDS_MeshElement*>(elem)));
2395 myInfo.RemoveVolume(elem);
2400 myElementIDFactory->ReleaseID(elem->GetID());
2406 * Checks if the element is present in mesh.
2407 * Useful to determine dead pointers.
2409 bool SMDS_Mesh::Contains (const SMDS_MeshElement* elem) const
2411 // we should not imply on validity of *elem, so iterate on containers
2412 // of all types in the hope of finding <elem> somewhere there
2413 SMDS_NodeIteratorPtr itn = nodesIterator();
2415 if (elem == itn->next())
2417 SMDS_EdgeIteratorPtr ite = edgesIterator();
2419 if (elem == ite->next())
2421 SMDS_FaceIteratorPtr itf = facesIterator();
2423 if (elem == itf->next())
2425 SMDS_VolumeIteratorPtr itv = volumesIterator();
2427 if (elem == itv->next())
2432 //=======================================================================
2433 //function : MaxNodeID
2435 //=======================================================================
2437 int SMDS_Mesh::MaxNodeID() const
2439 return myNodeIDFactory->GetMaxID();
2442 //=======================================================================
2443 //function : MinNodeID
2445 //=======================================================================
2447 int SMDS_Mesh::MinNodeID() const
2449 return myNodeIDFactory->GetMinID();
2452 //=======================================================================
2453 //function : MaxElementID
2455 //=======================================================================
2457 int SMDS_Mesh::MaxElementID() const
2459 return myElementIDFactory->GetMaxID();
2462 //=======================================================================
2463 //function : MinElementID
2465 //=======================================================================
2467 int SMDS_Mesh::MinElementID() const
2469 return myElementIDFactory->GetMinID();
2472 //=======================================================================
2473 //function : Renumber
2474 //purpose : Renumber all nodes or elements.
2475 //=======================================================================
2477 void SMDS_Mesh::Renumber (const bool isNodes, const int startID, const int deltaID)
2482 SMDS_MeshElementIDFactory * idFactory =
2483 isNodes ? myNodeIDFactory : myElementIDFactory;
2485 // get existing elements in the order of ID increasing
2486 map<int,SMDS_MeshElement*> elemMap;
2487 SMDS_ElemIteratorPtr idElemIt = idFactory->elementsIterator();
2488 while ( idElemIt->more() ) {
2489 SMDS_MeshElement* elem = const_cast<SMDS_MeshElement*>(idElemIt->next());
2490 int id = elem->GetID();
2491 elemMap.insert(map<int,SMDS_MeshElement*>::value_type(id, elem));
2493 // release their ids
2494 map<int,SMDS_MeshElement*>::iterator elemIt = elemMap.begin();
2495 for ( ; elemIt != elemMap.end(); elemIt++ )
2497 int id = (*elemIt).first;
2498 idFactory->ReleaseID( id );
2502 elemIt = elemMap.begin();
2503 for ( ; elemIt != elemMap.end(); elemIt++ )
2505 idFactory->BindID( ID, (*elemIt).second );
2510 //=======================================================================
2511 //function : GetElementType
2512 //purpose : Return type of element or node with id
2513 //=======================================================================
2515 SMDSAbs_ElementType SMDS_Mesh::GetElementType( const int id, const bool iselem ) const
2517 SMDS_MeshElement* elem = 0;
2519 elem = myElementIDFactory->MeshElement( id );
2521 elem = myNodeIDFactory->MeshElement( id );
2525 //throw SALOME_Exception(LOCALIZED ("this element isn't exist"));
2529 return elem->GetType();
2534 //********************************************************************
2535 //********************************************************************
2536 //******** *********
2537 //***** Methods for addition of quadratic elements ******
2538 //******** *********
2539 //********************************************************************
2540 //********************************************************************
2542 //=======================================================================
2543 //function : AddEdgeWithID
2545 //=======================================================================
2546 SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(int n1, int n2, int n12, int ID)
2548 return SMDS_Mesh::AddEdgeWithID
2549 ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1),
2550 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2),
2551 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12),
2555 //=======================================================================
2556 //function : AddEdge
2558 //=======================================================================
2559 SMDS_MeshEdge* SMDS_Mesh::AddEdge(const SMDS_MeshNode* n1,
2560 const SMDS_MeshNode* n2,
2561 const SMDS_MeshNode* n12)
2563 return SMDS_Mesh::AddEdgeWithID(n1, n2, n12, myElementIDFactory->GetFreeID());
2566 //=======================================================================
2567 //function : AddEdgeWithID
2569 //=======================================================================
2570 SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
2571 const SMDS_MeshNode * n2,
2572 const SMDS_MeshNode * n12,
2575 if ( !n1 || !n2 || !n12 ) return 0;
2576 SMDS_QuadraticEdge* edge = new SMDS_QuadraticEdge(n1,n2,n12);
2577 if(myElementIDFactory->BindID(ID, edge)) {
2578 SMDS_MeshNode *node1,*node2, *node12;
2579 node1 = const_cast<SMDS_MeshNode*>(n1);
2580 node2 = const_cast<SMDS_MeshNode*>(n2);
2581 node12 = const_cast<SMDS_MeshNode*>(n12);
2582 node1->AddInverseElement(edge);
2583 node2->AddInverseElement(edge);
2584 node12->AddInverseElement(edge);
2586 myInfo.myNbQuadEdges++;
2596 //=======================================================================
2597 //function : AddFace
2599 //=======================================================================
2600 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1,
2601 const SMDS_MeshNode * n2,
2602 const SMDS_MeshNode * n3,
2603 const SMDS_MeshNode * n12,
2604 const SMDS_MeshNode * n23,
2605 const SMDS_MeshNode * n31)
2607 return SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,
2608 myElementIDFactory->GetFreeID());
2611 //=======================================================================
2612 //function : AddFaceWithID
2614 //=======================================================================
2615 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int n1, int n2, int n3,
2616 int n12,int n23,int n31, int ID)
2618 return SMDS_Mesh::AddFaceWithID
2619 ((SMDS_MeshNode *)myNodeIDFactory->MeshElement(n1) ,
2620 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n2) ,
2621 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n3) ,
2622 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n12),
2623 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n23),
2624 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n31),
2628 //=======================================================================
2629 //function : AddFaceWithID
2631 //=======================================================================
2632 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
2633 const SMDS_MeshNode * n2,
2634 const SMDS_MeshNode * n3,
2635 const SMDS_MeshNode * n12,
2636 const SMDS_MeshNode * n23,
2637 const SMDS_MeshNode * n31,
2640 if ( !n1 || !n2 || !n3 || !n12 || !n23 || !n31) return 0;
2641 if(hasConstructionEdges()) {
2642 // creation quadratic edges - not implemented
2645 SMDS_QuadraticFaceOfNodes* face =
2646 new SMDS_QuadraticFaceOfNodes(n1,n2,n3,n12,n23,n31);
2648 myInfo.myNbQuadTriangles++;
2650 if (!registerElement(ID, face)) {
2651 RemoveElement(face, false);
2658 //=======================================================================
2659 //function : AddFace
2661 //=======================================================================
2662 SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1,
2663 const SMDS_MeshNode * n2,
2664 const SMDS_MeshNode * n3,
2665 const SMDS_MeshNode * n4,
2666 const SMDS_MeshNode * n12,
2667 const SMDS_MeshNode * n23,
2668 const SMDS_MeshNode * n34,
2669 const SMDS_MeshNode * n41)
2671 return SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,
2672 myElementIDFactory->GetFreeID());
2675 //=======================================================================
2676 //function : AddFaceWithID
2678 //=======================================================================
2679 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4,
2680 int n12,int n23,int n34,int n41, int ID)
2682 return SMDS_Mesh::AddFaceWithID
2683 ((SMDS_MeshNode *)myNodeIDFactory->MeshElement(n1) ,
2684 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n2) ,
2685 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n3) ,
2686 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n4) ,
2687 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n12),
2688 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n23),
2689 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n34),
2690 (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n41),
2694 //=======================================================================
2695 //function : AddFaceWithID
2697 //=======================================================================
2698 SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
2699 const SMDS_MeshNode * n2,
2700 const SMDS_MeshNode * n3,
2701 const SMDS_MeshNode * n4,
2702 const SMDS_MeshNode * n12,
2703 const SMDS_MeshNode * n23,
2704 const SMDS_MeshNode * n34,
2705 const SMDS_MeshNode * n41,
2708 if ( !n1 || !n2 || !n3 || !n4 || !n12 || !n23 || !n34 || !n41) return 0;
2709 if(hasConstructionEdges()) {
2710 // creation quadratic edges - not implemented
2712 SMDS_QuadraticFaceOfNodes* face =
2713 new SMDS_QuadraticFaceOfNodes(n1,n2,n3,n4,n12,n23,n34,n41);
2715 myInfo.myNbQuadQuadrangles++;
2717 if (!registerElement(ID, face)) {
2718 RemoveElement(face, false);
2725 //=======================================================================
2726 //function : AddVolume
2728 //=======================================================================
2729 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2730 const SMDS_MeshNode * n2,
2731 const SMDS_MeshNode * n3,
2732 const SMDS_MeshNode * n4,
2733 const SMDS_MeshNode * n12,
2734 const SMDS_MeshNode * n23,
2735 const SMDS_MeshNode * n31,
2736 const SMDS_MeshNode * n14,
2737 const SMDS_MeshNode * n24,
2738 const SMDS_MeshNode * n34)
2740 int ID = myElementIDFactory->GetFreeID();
2741 SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n12, n23,
2742 n31, n14, n24, n34, ID);
2743 if(v==NULL) myElementIDFactory->ReleaseID(ID);
2747 //=======================================================================
2748 //function : AddVolumeWithID
2750 //=======================================================================
2751 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
2752 int n12,int n23,int n31,
2753 int n14,int n24,int n34, int ID)
2755 return SMDS_Mesh::AddVolumeWithID
2756 ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1) ,
2757 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2) ,
2758 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3) ,
2759 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4) ,
2760 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12),
2761 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23),
2762 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n31),
2763 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n14),
2764 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n24),
2765 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34),
2769 //=======================================================================
2770 //function : AddVolumeWithID
2771 //purpose : 2d order tetrahedron of 10 nodes
2772 //=======================================================================
2773 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2774 const SMDS_MeshNode * n2,
2775 const SMDS_MeshNode * n3,
2776 const SMDS_MeshNode * n4,
2777 const SMDS_MeshNode * n12,
2778 const SMDS_MeshNode * n23,
2779 const SMDS_MeshNode * n31,
2780 const SMDS_MeshNode * n14,
2781 const SMDS_MeshNode * n24,
2782 const SMDS_MeshNode * n34,
2785 if ( !n1 || !n2 || !n3 || !n4 || !n12 || !n23 || !n31 || !n14 || !n24 || !n34)
2787 if(hasConstructionFaces()) {
2788 // creation quadratic faces - not implemented
2791 SMDS_QuadraticVolumeOfNodes * volume =
2792 new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
2793 myVolumes.Add(volume);
2794 myInfo.myNbQuadTetras++;
2796 if (!registerElement(ID, volume)) {
2797 RemoveElement(volume, false);
2804 //=======================================================================
2805 //function : AddVolume
2807 //=======================================================================
2808 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2809 const SMDS_MeshNode * n2,
2810 const SMDS_MeshNode * n3,
2811 const SMDS_MeshNode * n4,
2812 const SMDS_MeshNode * n5,
2813 const SMDS_MeshNode * n12,
2814 const SMDS_MeshNode * n23,
2815 const SMDS_MeshNode * n34,
2816 const SMDS_MeshNode * n41,
2817 const SMDS_MeshNode * n15,
2818 const SMDS_MeshNode * n25,
2819 const SMDS_MeshNode * n35,
2820 const SMDS_MeshNode * n45)
2822 int ID = myElementIDFactory->GetFreeID();
2823 SMDS_MeshVolume * v =
2824 SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n12, n23, n34, n41,
2825 n15, n25, n35, n45, ID);
2826 if(v==NULL) myElementIDFactory->ReleaseID(ID);
2830 //=======================================================================
2831 //function : AddVolumeWithID
2833 //=======================================================================
2834 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5,
2835 int n12,int n23,int n34,int n41,
2836 int n15,int n25,int n35,int n45, int ID)
2838 return SMDS_Mesh::AddVolumeWithID
2839 ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1) ,
2840 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2) ,
2841 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3) ,
2842 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4) ,
2843 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5) ,
2844 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12),
2845 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23),
2846 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34),
2847 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n41),
2848 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n15),
2849 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n25),
2850 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n35),
2851 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n45),
2855 //=======================================================================
2856 //function : AddVolumeWithID
2857 //purpose : 2d order pyramid of 13 nodes
2858 //=======================================================================
2859 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2860 const SMDS_MeshNode * n2,
2861 const SMDS_MeshNode * n3,
2862 const SMDS_MeshNode * n4,
2863 const SMDS_MeshNode * n5,
2864 const SMDS_MeshNode * n12,
2865 const SMDS_MeshNode * n23,
2866 const SMDS_MeshNode * n34,
2867 const SMDS_MeshNode * n41,
2868 const SMDS_MeshNode * n15,
2869 const SMDS_MeshNode * n25,
2870 const SMDS_MeshNode * n35,
2871 const SMDS_MeshNode * n45,
2874 if (!n1 || !n2 || !n3 || !n4 || !n5 || !n12 || !n23 ||
2875 !n34 || !n41 || !n15 || !n25 || !n35 || !n45)
2877 if(hasConstructionFaces()) {
2878 // creation quadratic faces - not implemented
2881 SMDS_QuadraticVolumeOfNodes * volume =
2882 new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n12,n23,
2883 n34,n41,n15,n25,n35,n45);
2884 myVolumes.Add(volume);
2885 myInfo.myNbQuadPyramids++;
2887 if (!registerElement(ID, volume)) {
2888 RemoveElement(volume, false);
2895 //=======================================================================
2896 //function : AddVolume
2898 //=======================================================================
2899 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2900 const SMDS_MeshNode * n2,
2901 const SMDS_MeshNode * n3,
2902 const SMDS_MeshNode * n4,
2903 const SMDS_MeshNode * n5,
2904 const SMDS_MeshNode * n6,
2905 const SMDS_MeshNode * n12,
2906 const SMDS_MeshNode * n23,
2907 const SMDS_MeshNode * n31,
2908 const SMDS_MeshNode * n45,
2909 const SMDS_MeshNode * n56,
2910 const SMDS_MeshNode * n64,
2911 const SMDS_MeshNode * n14,
2912 const SMDS_MeshNode * n25,
2913 const SMDS_MeshNode * n36)
2915 int ID = myElementIDFactory->GetFreeID();
2916 SMDS_MeshVolume * v =
2917 SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n12, n23, n31,
2918 n45, n56, n64, n14, n25, n36, ID);
2919 if(v==NULL) myElementIDFactory->ReleaseID(ID);
2923 //=======================================================================
2924 //function : AddVolumeWithID
2926 //=======================================================================
2927 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3,
2928 int n4, int n5, int n6,
2929 int n12,int n23,int n31,
2930 int n45,int n56,int n64,
2931 int n14,int n25,int n36, int ID)
2933 return SMDS_Mesh::AddVolumeWithID
2934 ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1) ,
2935 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2) ,
2936 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3) ,
2937 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4) ,
2938 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5) ,
2939 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n6) ,
2940 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12),
2941 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23),
2942 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n31),
2943 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n45),
2944 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n56),
2945 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n64),
2946 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n14),
2947 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n25),
2948 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n36),
2952 //=======================================================================
2953 //function : AddVolumeWithID
2954 //purpose : 2d order Pentahedron with 15 nodes
2955 //=======================================================================
2956 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2957 const SMDS_MeshNode * n2,
2958 const SMDS_MeshNode * n3,
2959 const SMDS_MeshNode * n4,
2960 const SMDS_MeshNode * n5,
2961 const SMDS_MeshNode * n6,
2962 const SMDS_MeshNode * n12,
2963 const SMDS_MeshNode * n23,
2964 const SMDS_MeshNode * n31,
2965 const SMDS_MeshNode * n45,
2966 const SMDS_MeshNode * n56,
2967 const SMDS_MeshNode * n64,
2968 const SMDS_MeshNode * n14,
2969 const SMDS_MeshNode * n25,
2970 const SMDS_MeshNode * n36,
2973 if (!n1 || !n2 || !n3 || !n4 || !n5 || !n6 || !n12 || !n23 ||
2974 !n31 || !n45 || !n56 || !n64 || !n14 || !n25 || !n36)
2976 if(hasConstructionFaces()) {
2977 // creation quadratic faces - not implemented
2980 SMDS_QuadraticVolumeOfNodes * volume =
2981 new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n6,n12,n23,n31,
2982 n45,n56,n64,n14,n25,n36);
2983 myVolumes.Add(volume);
2984 myInfo.myNbQuadPrisms++;
2986 if (!registerElement(ID, volume)) {
2987 RemoveElement(volume, false);
2994 //=======================================================================
2995 //function : AddVolume
2997 //=======================================================================
2998 SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2999 const SMDS_MeshNode * n2,
3000 const SMDS_MeshNode * n3,
3001 const SMDS_MeshNode * n4,
3002 const SMDS_MeshNode * n5,
3003 const SMDS_MeshNode * n6,
3004 const SMDS_MeshNode * n7,
3005 const SMDS_MeshNode * n8,
3006 const SMDS_MeshNode * n12,
3007 const SMDS_MeshNode * n23,
3008 const SMDS_MeshNode * n34,
3009 const SMDS_MeshNode * n41,
3010 const SMDS_MeshNode * n56,
3011 const SMDS_MeshNode * n67,
3012 const SMDS_MeshNode * n78,
3013 const SMDS_MeshNode * n85,
3014 const SMDS_MeshNode * n15,
3015 const SMDS_MeshNode * n26,
3016 const SMDS_MeshNode * n37,
3017 const SMDS_MeshNode * n48)
3019 int ID = myElementIDFactory->GetFreeID();
3020 SMDS_MeshVolume * v =
3021 SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, n12, n23, n34, n41,
3022 n56, n67, n78, n85, n15, n26, n37, n48, ID);
3023 if(v==NULL) myElementIDFactory->ReleaseID(ID);
3027 //=======================================================================
3028 //function : AddVolumeWithID
3030 //=======================================================================
3031 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
3032 int n5, int n6, int n7, int n8,
3033 int n12,int n23,int n34,int n41,
3034 int n56,int n67,int n78,int n85,
3035 int n15,int n26,int n37,int n48, int ID)
3037 return SMDS_Mesh::AddVolumeWithID
3038 ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1),
3039 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2),
3040 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3),
3041 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4),
3042 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5),
3043 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n6),
3044 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n7),
3045 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n8),
3046 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12),
3047 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23),
3048 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34),
3049 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n41),
3050 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n56),
3051 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n67),
3052 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n78),
3053 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n85),
3054 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n15),
3055 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n26),
3056 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n37),
3057 (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n48),
3061 //=======================================================================
3062 //function : AddVolumeWithID
3063 //purpose : 2d order Hexahedrons with 20 nodes
3064 //=======================================================================
3065 SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
3066 const SMDS_MeshNode * n2,
3067 const SMDS_MeshNode * n3,
3068 const SMDS_MeshNode * n4,
3069 const SMDS_MeshNode * n5,
3070 const SMDS_MeshNode * n6,
3071 const SMDS_MeshNode * n7,
3072 const SMDS_MeshNode * n8,
3073 const SMDS_MeshNode * n12,
3074 const SMDS_MeshNode * n23,
3075 const SMDS_MeshNode * n34,
3076 const SMDS_MeshNode * n41,
3077 const SMDS_MeshNode * n56,
3078 const SMDS_MeshNode * n67,
3079 const SMDS_MeshNode * n78,
3080 const SMDS_MeshNode * n85,
3081 const SMDS_MeshNode * n15,
3082 const SMDS_MeshNode * n26,
3083 const SMDS_MeshNode * n37,
3084 const SMDS_MeshNode * n48,
3087 if (!n1 || !n2 || !n3 || !n4 || !n5 || !n6 || !n7 || !n8 || !n12 || !n23 ||
3088 !n34 || !n41 || !n56 || !n67 || !n78 || !n85 || !n15 || !n26 || !n37 || !n48)
3090 if(hasConstructionFaces()) {
3092 // creation quadratic faces - not implemented
3094 SMDS_QuadraticVolumeOfNodes * volume =
3095 new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
3096 n56,n67,n78,n85,n15,n26,n37,n48);
3097 myVolumes.Add(volume);
3098 myInfo.myNbQuadHexas++;
3100 if (!registerElement(ID, volume)) {
3101 RemoveElement(volume, false);