1 // Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 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, or (at your option) any later version.
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 // SMESH SMESHDS : management of mesh data and SMESH document
24 // File : SMESH_Mesh.cxx
25 // Author : Yves FRICAUD, OCC
28 #include "SMESHDS_Mesh.hxx"
30 #include "SMESHDS_Group.hxx"
31 #include "SMDS_VertexPosition.hxx"
32 #include "SMDS_EdgePosition.hxx"
33 #include "SMDS_FacePosition.hxx"
34 #include "SMDS_SpacePosition.hxx"
35 #include "SMDS_Downward.hxx"
36 #include "SMESHDS_GroupOnGeom.hxx"
37 #include "SMESHDS_Script.hxx"
39 #include <Standard_ErrorHandler.hxx>
40 #include <Standard_OutOfRange.hxx>
42 #include <TopExp_Explorer.hxx>
43 #include <TopoDS_Edge.hxx>
44 #include <TopoDS_Face.hxx>
45 #include <TopoDS_Iterator.hxx>
46 #include <TopoDS_Shell.hxx>
47 #include <TopoDS_Solid.hxx>
48 #include <TopoDS_Vertex.hxx>
50 #include "utilities.h"
54 //=======================================================================
57 //=======================================================================
58 SMESHDS_Mesh::SMESHDS_Mesh(int theMeshID, bool theIsEmbeddedMode):
60 myIsEmbeddedMode(theIsEmbeddedMode),
63 myScript = new SMESHDS_Script(theIsEmbeddedMode);
65 SetPersistentId(theMeshID);
68 //=======================================================================
69 bool SMESHDS_Mesh::IsEmbeddedMode()
71 return myIsEmbeddedMode;
74 //================================================================================
76 * \brief Store ID persistent during lifecycle
78 * Initially it was used to have a persistent reference to the mesh from the hypothesis
80 //================================================================================
82 void SMESHDS_Mesh::SetPersistentId(int id)
87 //================================================================================
89 * \brief Return ID persistent during lifecycle
91 //================================================================================
93 int SMESHDS_Mesh::GetPersistentId() const
95 return myPersistentID;
98 //=======================================================================
99 //function : ShapeToMesh
101 //=======================================================================
102 void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S)
104 if ( !myShape.IsNull() && S.IsNull() )
106 // removal of a shape to mesh, delete ...
108 myShapeToHypothesis.Clear();
109 // - shape indices in SMDS_Position of nodes
110 map<int,SMESHDS_SubMesh*>::iterator i_sub = myShapeIndexToSubMesh.begin();
111 for ( ; i_sub != myShapeIndexToSubMesh.end(); i_sub++ ) {
112 if ( !i_sub->second->IsComplexSubmesh() ) {
113 SMDS_NodeIteratorPtr nIt = i_sub->second->GetNodes();
114 while ( nIt->more() )
115 i_sub->second->RemoveNode(nIt->next(), false);
119 TShapeIndexToSubMesh::iterator i_sm = myShapeIndexToSubMesh.begin();
120 for ( ; i_sm != myShapeIndexToSubMesh.end(); ++i_sm )
122 myShapeIndexToSubMesh.clear();
123 myIndexToShape.Clear();
124 // - groups on geometry
125 set<SMESHDS_GroupBase*>::iterator gr = myGroups.begin();
126 while ( gr != myGroups.end() ) {
127 if ( dynamic_cast<SMESHDS_GroupOnGeom*>( *gr ))
128 myGroups.erase( gr++ );
136 TopExp::MapShapes(myShape, myIndexToShape);
140 //=======================================================================
141 //function : AddHypothesis
143 //=======================================================================
145 bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS,
146 const SMESHDS_Hypothesis * H)
148 if (!myShapeToHypothesis.IsBound(SS.Oriented(TopAbs_FORWARD))) {
149 list<const SMESHDS_Hypothesis *> aList;
150 myShapeToHypothesis.Bind(SS.Oriented(TopAbs_FORWARD), aList);
152 list<const SMESHDS_Hypothesis *>& alist =
153 myShapeToHypothesis(SS.Oriented(TopAbs_FORWARD)); // ignore orientation of SS
155 //Check if the Hypothesis is still present
156 list<const SMESHDS_Hypothesis*>::iterator ith = find(alist.begin(),alist.end(), H );
158 if (alist.end() != ith) return false;
164 //=======================================================================
165 //function : RemoveHypothesis
167 //=======================================================================
169 bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S,
170 const SMESHDS_Hypothesis * H)
172 if( myShapeToHypothesis.IsBound( S.Oriented(TopAbs_FORWARD) ) )
174 list<const SMESHDS_Hypothesis *>& alist=myShapeToHypothesis.ChangeFind( S.Oriented(TopAbs_FORWARD) );
175 list<const SMESHDS_Hypothesis*>::iterator ith=find(alist.begin(),alist.end(), H );
176 if (ith != alist.end())
185 //=======================================================================
188 //=======================================================================
189 SMDS_MeshNode* SMESHDS_Mesh::AddNode(double x, double y, double z){
190 SMDS_MeshNode* node = SMDS_Mesh::AddNode(x, y, z);
191 if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
195 SMDS_MeshNode* SMESHDS_Mesh::AddNodeWithID(double x, double y, double z, int ID){
196 SMDS_MeshNode* node = SMDS_Mesh::AddNodeWithID(x,y,z,ID);
197 if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
201 //=======================================================================
202 //function : MoveNode
204 //=======================================================================
206 void SMESHDS_Mesh::MoveNode(const SMDS_MeshNode *n, double x, double y, double z)
208 SMDS_Mesh::MoveNode( n, x, y, z );
209 myScript->MoveNode(n->GetID(), x, y, z);
212 //=======================================================================
213 //function : ChangeElementNodes
215 //=======================================================================
217 bool SMESHDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem,
218 const SMDS_MeshNode * nodes[],
221 //MESSAGE("SMESHDS_Mesh::ChangeElementNodes");
222 if ( ! SMDS_Mesh::ChangeElementNodes( elem, nodes, nbnodes ))
225 vector<int> IDs( nbnodes );
226 for ( int i = 0; i < nbnodes; i++ )
227 IDs [ i ] = nodes[ i ]->GetID();
228 myScript->ChangeElementNodes( elem->GetID(), &IDs[0], nbnodes);
233 //=======================================================================
234 //function : ChangePolygonNodes
236 //=======================================================================
237 bool SMESHDS_Mesh::ChangePolygonNodes
238 (const SMDS_MeshElement * elem,
239 vector<const SMDS_MeshNode*> nodes)
241 ASSERT(nodes.size() > 3);
243 return ChangeElementNodes(elem, &nodes[0], nodes.size());
246 //=======================================================================
247 //function : ChangePolyhedronNodes
249 //=======================================================================
250 bool SMESHDS_Mesh::ChangePolyhedronNodes
251 (const SMDS_MeshElement * elem,
252 std::vector<const SMDS_MeshNode*> nodes,
253 std::vector<int> quantities)
255 ASSERT(nodes.size() > 3);
257 if (!SMDS_Mesh::ChangePolyhedronNodes(elem, nodes, quantities))
260 int i, len = nodes.size();
261 std::vector<int> nodes_ids (len);
262 for (i = 0; i < len; i++) {
263 nodes_ids[i] = nodes[i]->GetID();
265 myScript->ChangePolyhedronNodes(elem->GetID(), nodes_ids, quantities);
270 //=======================================================================
271 //function : Renumber
273 //=======================================================================
275 void SMESHDS_Mesh::Renumber (const bool isNodes, const int startID, const int deltaID)
277 // TODO not possible yet to have node numbers not starting to O and continuous.
278 if (!this->isCompacted())
280 // SMDS_Mesh::Renumber( isNodes, startID, deltaID );
281 // myScript->Renumber( isNodes, startID, deltaID );
284 //=======================================================================
285 //function : Add0DElement
287 //=======================================================================
288 SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElementWithID(int nodeID, int ID)
290 SMDS_Mesh0DElement* anElem = SMDS_Mesh::Add0DElementWithID(nodeID, ID);
291 if (anElem) myScript->Add0DElement(ID, nodeID);
295 SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElementWithID
296 (const SMDS_MeshNode * node, int ID)
298 return Add0DElementWithID(node->GetID(), ID);
301 SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElement(const SMDS_MeshNode * node)
303 SMDS_Mesh0DElement* anElem = SMDS_Mesh::Add0DElement(node);
304 if (anElem) myScript->Add0DElement(anElem->GetID(), node->GetID());
308 //=======================================================================
309 //function :AddBallWithID
311 //=======================================================================
313 SMDS_BallElement* SMESHDS_Mesh::AddBallWithID(int node, double diameter, int ID)
315 SMDS_BallElement* anElem = SMDS_Mesh::AddBallWithID(node,diameter,ID);
316 if (anElem) myScript->AddBall(anElem->GetID(), node, diameter);
320 SMDS_BallElement* SMESHDS_Mesh::AddBallWithID(const SMDS_MeshNode * node,
324 SMDS_BallElement* anElem = SMDS_Mesh::AddBallWithID(node,diameter,ID);
325 if (anElem) myScript->AddBall(anElem->GetID(), node->GetID(), diameter);
329 SMDS_BallElement* SMESHDS_Mesh::AddBall (const SMDS_MeshNode * node,
332 SMDS_BallElement* anElem = SMDS_Mesh::AddBall(node,diameter);
333 if (anElem) myScript->AddBall(anElem->GetID(), node->GetID(), diameter);
337 //=======================================================================
338 //function :AddEdgeWithID
340 //=======================================================================
342 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int ID)
344 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,ID);
345 if(anElem) myScript->AddEdge(ID,n1,n2);
349 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
350 const SMDS_MeshNode * n2,
353 return AddEdgeWithID(n1->GetID(),
358 SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode * n1,
359 const SMDS_MeshNode * n2)
361 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2);
362 if(anElem) myScript->AddEdge(anElem->GetID(),
368 //=======================================================================
371 //=======================================================================
372 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int ID)
374 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, ID);
375 if(anElem) myScript->AddFace(ID,n1,n2,n3);
379 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
380 const SMDS_MeshNode * n2,
381 const SMDS_MeshNode * n3,
384 return AddFaceWithID(n1->GetID(),
390 SMDS_MeshFace* SMESHDS_Mesh::AddFace( const SMDS_MeshNode * n1,
391 const SMDS_MeshNode * n2,
392 const SMDS_MeshNode * n3)
394 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3);
395 if(anElem) myScript->AddFace(anElem->GetID(),
402 //=======================================================================
405 //=======================================================================
406 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4, int ID)
408 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, n4, ID);
409 if(anElem) myScript->AddFace(ID, n1, n2, n3, n4);
413 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
414 const SMDS_MeshNode * n2,
415 const SMDS_MeshNode * n3,
416 const SMDS_MeshNode * n4,
419 return AddFaceWithID(n1->GetID(),
426 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
427 const SMDS_MeshNode * n2,
428 const SMDS_MeshNode * n3,
429 const SMDS_MeshNode * n4)
431 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3, n4);
432 if(anElem) myScript->AddFace(anElem->GetID(),
440 //=======================================================================
441 //function :AddVolume
443 //=======================================================================
444 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int ID)
446 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID);
447 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4);
451 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
452 const SMDS_MeshNode * n2,
453 const SMDS_MeshNode * n3,
454 const SMDS_MeshNode * n4,
457 return AddVolumeWithID(n1->GetID(),
464 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
465 const SMDS_MeshNode * n2,
466 const SMDS_MeshNode * n3,
467 const SMDS_MeshNode * n4)
469 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4);
470 if(anElem) myScript->AddVolume(anElem->GetID(),
478 //=======================================================================
479 //function :AddVolume
481 //=======================================================================
482 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int ID)
484 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID);
485 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5);
489 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
490 const SMDS_MeshNode * n2,
491 const SMDS_MeshNode * n3,
492 const SMDS_MeshNode * n4,
493 const SMDS_MeshNode * n5,
496 return AddVolumeWithID(n1->GetID(),
504 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
505 const SMDS_MeshNode * n2,
506 const SMDS_MeshNode * n3,
507 const SMDS_MeshNode * n4,
508 const SMDS_MeshNode * n5)
510 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5);
511 if(anElem) myScript->AddVolume(anElem->GetID(),
520 //=======================================================================
521 //function :AddVolume
523 //=======================================================================
524 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int ID)
526 SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID);
527 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6);
531 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
532 const SMDS_MeshNode * n2,
533 const SMDS_MeshNode * n3,
534 const SMDS_MeshNode * n4,
535 const SMDS_MeshNode * n5,
536 const SMDS_MeshNode * n6,
539 return AddVolumeWithID(n1->GetID(),
548 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
549 const SMDS_MeshNode * n2,
550 const SMDS_MeshNode * n3,
551 const SMDS_MeshNode * n4,
552 const SMDS_MeshNode * n5,
553 const SMDS_MeshNode * n6)
555 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6);
556 if(anElem) myScript->AddVolume(anElem->GetID(),
566 //=======================================================================
567 //function :AddVolume
569 //=======================================================================
570 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int ID)
572 SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID);
573 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8);
577 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
578 const SMDS_MeshNode * n2,
579 const SMDS_MeshNode * n3,
580 const SMDS_MeshNode * n4,
581 const SMDS_MeshNode * n5,
582 const SMDS_MeshNode * n6,
583 const SMDS_MeshNode * n7,
584 const SMDS_MeshNode * n8,
587 return AddVolumeWithID(n1->GetID(),
598 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
599 const SMDS_MeshNode * n2,
600 const SMDS_MeshNode * n3,
601 const SMDS_MeshNode * n4,
602 const SMDS_MeshNode * n5,
603 const SMDS_MeshNode * n6,
604 const SMDS_MeshNode * n7,
605 const SMDS_MeshNode * n8)
607 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8);
608 if(anElem) myScript->AddVolume(anElem->GetID(),
621 //=======================================================================
622 //function :AddVolume
623 //purpose : add hexagonal prism
624 //=======================================================================
625 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
626 int n5, int n6, int n7, int n8,
627 int n9, int n10, int n11, int n12,
630 SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, ID);
631 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
635 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
636 const SMDS_MeshNode * n2,
637 const SMDS_MeshNode * n3,
638 const SMDS_MeshNode * n4,
639 const SMDS_MeshNode * n5,
640 const SMDS_MeshNode * n6,
641 const SMDS_MeshNode * n7,
642 const SMDS_MeshNode * n8,
643 const SMDS_MeshNode * n9,
644 const SMDS_MeshNode * n10,
645 const SMDS_MeshNode * n11,
646 const SMDS_MeshNode * n12,
649 return AddVolumeWithID(n1->GetID(),
664 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
665 const SMDS_MeshNode * n2,
666 const SMDS_MeshNode * n3,
667 const SMDS_MeshNode * n4,
668 const SMDS_MeshNode * n5,
669 const SMDS_MeshNode * n6,
670 const SMDS_MeshNode * n7,
671 const SMDS_MeshNode * n8,
672 const SMDS_MeshNode * n9,
673 const SMDS_MeshNode * n10,
674 const SMDS_MeshNode * n11,
675 const SMDS_MeshNode * n12)
677 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
678 if(anElem) myScript->AddVolume(anElem->GetID(),
695 //=======================================================================
696 //function : AddPolygonalFace
698 //=======================================================================
699 SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID (const std::vector<int>& nodes_ids,
702 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes_ids, ID);
704 myScript->AddPolygonalFace(ID, nodes_ids);
709 SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID
710 (const std::vector<const SMDS_MeshNode*>& nodes,
713 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID);
715 int i, len = nodes.size();
716 std::vector<int> nodes_ids (len);
717 for (i = 0; i < len; i++) {
718 nodes_ids[i] = nodes[i]->GetID();
720 myScript->AddPolygonalFace(ID, nodes_ids);
725 SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFace
726 (const std::vector<const SMDS_MeshNode*>& nodes)
728 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFace(nodes);
730 int i, len = nodes.size();
731 std::vector<int> nodes_ids (len);
732 for (i = 0; i < len; i++) {
733 nodes_ids[i] = nodes[i]->GetID();
735 myScript->AddPolygonalFace(anElem->GetID(), nodes_ids);
740 //=======================================================================
741 //function : AddPolyhedralVolume
743 //=======================================================================
744 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID (const std::vector<int>& nodes_ids,
745 const std::vector<int>& quantities,
748 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes_ids, quantities, ID);
750 myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
755 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID
756 (const std::vector<const SMDS_MeshNode*>& nodes,
757 const std::vector<int>& quantities,
760 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
762 int i, len = nodes.size();
763 std::vector<int> nodes_ids (len);
764 for (i = 0; i < len; i++) {
765 nodes_ids[i] = nodes[i]->GetID();
767 myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
772 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolume
773 (const std::vector<const SMDS_MeshNode*>& nodes,
774 const std::vector<int>& quantities)
776 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolume(nodes, quantities);
778 int i, len = nodes.size();
779 std::vector<int> nodes_ids (len);
780 for (i = 0; i < len; i++) {
781 nodes_ids[i] = nodes[i]->GetID();
783 myScript->AddPolyhedralVolume(anElem->GetID(), nodes_ids, quantities);
788 //=======================================================================
789 //function : removeFromContainers
791 //=======================================================================
793 static void removeFromContainers (map<int,SMESHDS_SubMesh*>& theSubMeshes,
794 set<SMESHDS_GroupBase*>& theGroups,
795 list<const SMDS_MeshElement*>& theElems,
798 if ( theElems.empty() )
802 // Element can belong to several groups
803 if ( !theGroups.empty() )
805 set<SMESHDS_GroupBase*>::iterator GrIt = theGroups.begin();
806 for ( ; GrIt != theGroups.end(); GrIt++ )
808 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>( *GrIt );
809 if ( !group || group->IsEmpty() ) continue;
811 list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
812 for ( ; elIt != theElems.end(); elIt++ )
814 group->SMDSGroup().Remove( *elIt );
815 if ( group->IsEmpty() ) break;
820 const bool deleted=true;
822 // Rm from sub-meshes
823 // Element should belong to only one sub-mesh
824 if ( !theSubMeshes.empty() )
826 SMESHDS_Mesh* mesh = theSubMeshes.begin()->second->GetParent();
827 list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
829 for ( ; elIt != theElems.end(); ++elIt )
830 if ( SMESHDS_SubMesh* sm = mesh->MeshElements( (*elIt)->getshapeId() ))
831 sm->RemoveNode( static_cast<const SMDS_MeshNode*> (*elIt), deleted );
834 for ( ; elIt != theElems.end(); ++elIt )
835 if ( SMESHDS_SubMesh* sm = mesh->MeshElements( (*elIt)->getshapeId() ))
836 sm->RemoveElement( *elIt, deleted );
841 //=======================================================================
842 //function : RemoveNode
844 //=======================================================================
845 void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n)
847 if ( n->NbInverseElements() == 0 && !(hasConstructionEdges() || hasConstructionFaces()))
849 SMESHDS_SubMesh* subMesh=0;
850 map<int,SMESHDS_SubMesh*>::iterator SubIt =
851 myShapeIndexToSubMesh.find( n->getshapeId() );
852 if ( SubIt != myShapeIndexToSubMesh.end() )
853 subMesh = SubIt->second;
855 SubIt = myShapeIndexToSubMesh.begin();
856 for ( ; !subMesh && SubIt != myShapeIndexToSubMesh.end(); SubIt++ )
857 if (!SubIt->second->IsComplexSubmesh() && SubIt->second->Contains( n ))
858 subMesh = SubIt->second;
860 RemoveFreeNode( n, subMesh, true);
864 myScript->RemoveNode(n->GetID());
866 list<const SMDS_MeshElement *> removedElems;
867 list<const SMDS_MeshElement *> removedNodes;
869 SMDS_Mesh::RemoveElement( n, removedElems, removedNodes, true );
871 removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false );
872 removeFromContainers( myShapeIndexToSubMesh, myGroups, removedNodes, true );
875 //=======================================================================
876 //function : RemoveFreeNode
878 //=======================================================================
879 void SMESHDS_Mesh::RemoveFreeNode(const SMDS_MeshNode * n,
880 SMESHDS_SubMesh * subMesh,
883 myScript->RemoveNode(n->GetID());
886 // Node can belong to several groups
887 if (fromGroups && !myGroups.empty()) {
888 set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
889 for (; GrIt != myGroups.end(); GrIt++) {
890 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
891 if (group && !group->IsEmpty())
892 group->SMDSGroup().Remove(n);
897 // Node should belong to only one sub-mesh
898 if ( !subMesh || !subMesh->RemoveNode(n,/*deleted=*/false))
899 if (( subMesh = MeshElements( n->getshapeId() )))
900 subMesh->RemoveNode(n,/*deleted=*/false );
902 SMDS_Mesh::RemoveFreeElement(n);
905 //=======================================================================
906 //function : RemoveElement
908 //========================================================================
909 void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt)
911 if (elt->GetType() == SMDSAbs_Node)
913 RemoveNode( static_cast<const SMDS_MeshNode*>( elt ));
916 if (!hasConstructionEdges() && !hasConstructionFaces())
918 SMESHDS_SubMesh* subMesh=0;
919 if ( elt->getshapeId() > 0 )
921 map<int,SMESHDS_SubMesh*>::iterator SubIt = myShapeIndexToSubMesh.find( elt->getshapeId() );
922 if ( SubIt != myShapeIndexToSubMesh.end() )
923 subMesh = SubIt->second;
925 RemoveFreeElement( elt, subMesh, true);
929 myScript->RemoveElement(elt->GetID());
931 list<const SMDS_MeshElement *> removedElems;
932 list<const SMDS_MeshElement *> removedNodes;
934 SMDS_Mesh::RemoveElement(elt, removedElems, removedNodes, false);
936 removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false );
939 //=======================================================================
940 //function : RemoveFreeElement
942 //========================================================================
943 void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt,
944 SMESHDS_SubMesh * subMesh,
947 //MESSAGE(" --------------------------------> SMESHDS_Mesh::RemoveFreeElement " << subMesh << " " << fromGroups);
948 if (elt->GetType() == SMDSAbs_Node) {
949 RemoveFreeNode( static_cast<const SMDS_MeshNode*>(elt), subMesh);
953 if (hasConstructionEdges() || hasConstructionFaces())
954 // this methods is only for meshes without descendants
957 myScript->RemoveElement(elt->GetID());
960 // Node can belong to several groups
961 if ( fromGroups && !myGroups.empty() ) {
962 set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
963 for (; GrIt != myGroups.end(); GrIt++) {
964 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
965 if (group && !group->IsEmpty())
966 group->SMDSGroup().Remove(elt);
971 // Element should belong to only one sub-mesh
973 subMesh->RemoveElement(elt, /*deleted=*/false);
975 SMDS_Mesh::RemoveFreeElement(elt);
978 //================================================================================
980 * \brief Remove all data from the mesh
982 //================================================================================
984 void SMESHDS_Mesh::ClearMesh()
986 myScript->ClearMesh();
990 map<int,SMESHDS_SubMesh*>::iterator sub, subEnd = myShapeIndexToSubMesh.end();
991 for ( sub = myShapeIndexToSubMesh.begin(); sub != subEnd; ++sub )
992 sub->second->Clear();
995 TGroups::iterator group, groupEnd = myGroups.end();
996 for ( group = myGroups.begin(); group != groupEnd; ++group ) {
997 if ( SMESHDS_Group* g = dynamic_cast<SMESHDS_Group*>(*group)) {
998 SMDSAbs_ElementType groupType = g->GetType();
1000 g->SetType( groupType );
1004 (*group)->Extent(); // to free cashed elements in GroupOnFilter's
1009 //================================================================================
1011 * \brief return submesh by shape
1012 * \param shape - the sub-shape
1013 * \retval SMESHDS_SubMesh* - the found submesh
1015 * search of submeshes is optimized
1017 //================================================================================
1019 SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const TopoDS_Shape & shape )
1021 if ( shape.IsNull() )
1024 if ( !myCurSubShape.IsNull() && shape.IsSame( myCurSubShape ))
1025 return myCurSubMesh;
1027 getSubmesh( ShapeToIndex( shape ));
1028 myCurSubShape = shape;
1029 return myCurSubMesh;
1032 //================================================================================
1034 * \brief return submesh by sub-shape index
1035 * \param Index - the sub-shape index
1036 * \retval SMESHDS_SubMesh* - the found submesh
1037 * search of submeshes is optimized
1039 //================================================================================
1041 SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const int Index )
1043 //Update or build submesh
1044 if ( Index != myCurSubID ) {
1045 map<int,SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.find( Index );
1046 if ( it == myShapeIndexToSubMesh.end() )
1047 it = myShapeIndexToSubMesh.insert( make_pair(Index, new SMESHDS_SubMesh(this, Index) )).first;
1048 myCurSubMesh = it->second;
1050 myCurSubShape.Nullify(); // myCurSubShape no more corresponds to submesh
1052 return myCurSubMesh;
1055 //================================================================================
1057 * \brief Add element or node to submesh
1058 * \param elem - element to add
1059 * \param subMesh - submesh to be filled in
1061 //================================================================================
1063 bool SMESHDS_Mesh::add(const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh )
1065 if ( elem && subMesh ) {
1066 if ( elem->GetType() == SMDSAbs_Node )
1067 subMesh->AddNode( static_cast<const SMDS_MeshNode* >( elem ));
1069 subMesh->AddElement( elem );
1075 //=======================================================================
1076 //function : SetNodeOnVolume
1078 //=======================================================================
1079 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode,
1080 const TopoDS_Shell & S)
1082 if ( add( aNode, getSubmesh(S) ))
1083 const_cast< SMDS_MeshNode* >
1084 ( aNode )->SetPosition( SMDS_SpacePosition::originSpacePosition() );
1087 //=======================================================================
1088 //function : SetNodeOnVolume
1090 //=======================================================================
1091 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode * aNode,
1092 const TopoDS_Solid & S)
1094 if ( add( aNode, getSubmesh(S) ))
1095 const_cast< SMDS_MeshNode* >
1096 ( aNode )->SetPosition( SMDS_SpacePosition::originSpacePosition() );
1099 //=======================================================================
1100 //function : SetNodeOnFace
1102 //=======================================================================
1103 void SMESHDS_Mesh::SetNodeOnFace(const SMDS_MeshNode * aNode,
1104 const TopoDS_Face & S,
1108 if ( add( aNode, getSubmesh(S) ))
1109 const_cast< SMDS_MeshNode* >
1110 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition( u, v)));
1113 //=======================================================================
1114 //function : SetNodeOnEdge
1116 //=======================================================================
1117 void SMESHDS_Mesh::SetNodeOnEdge(const SMDS_MeshNode * aNode,
1118 const TopoDS_Edge & S,
1121 if ( add( aNode, getSubmesh(S) ))
1122 const_cast< SMDS_MeshNode* >
1123 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(u)));
1126 //=======================================================================
1127 //function : SetNodeOnVertex
1129 //=======================================================================
1130 void SMESHDS_Mesh::SetNodeOnVertex(const SMDS_MeshNode * aNode,
1131 const TopoDS_Vertex & S)
1133 if ( add( aNode, getSubmesh(S) ))
1134 const_cast< SMDS_MeshNode* >
1135 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition()));
1138 //=======================================================================
1139 //function : UnSetNodeOnShape
1141 //=======================================================================
1142 void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode)
1144 int shapeId = aNode->getshapeId();
1147 map<int, SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.find(shapeId);
1148 if (it != myShapeIndexToSubMesh.end())
1149 it->second->RemoveNode(aNode, /*deleted=*/false);
1153 //=======================================================================
1154 //function : SetMeshElementOnShape
1156 //=======================================================================
1157 void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement * anElement,
1158 const TopoDS_Shape & S)
1160 add( anElement, getSubmesh(S) );
1163 //=======================================================================
1164 //function : UnSetMeshElementOnShape
1166 //=======================================================================
1167 void SMESHDS_Mesh::UnSetMeshElementOnShape(const SMDS_MeshElement * elem,
1168 const TopoDS_Shape & S)
1170 int Index = myIndexToShape.FindIndex(S);
1172 map<int,SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.find( Index );
1173 if ( it != myShapeIndexToSubMesh.end() )
1175 if (elem->GetType() == SMDSAbs_Node)
1176 it->second->RemoveNode(static_cast<const SMDS_MeshNode*> (elem), /*deleted=*/false);
1178 it->second->RemoveElement(elem, /*deleted=*/false);
1182 //=======================================================================
1183 //function : ShapeToMesh
1185 //=======================================================================
1186 TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() const
1191 //=======================================================================
1192 //function : IsGroupOfSubShapes
1193 //purpose : return true if at least one sub-shape of theShape is a sub-shape
1194 // of myShape or theShape == myShape
1195 //=======================================================================
1197 bool SMESHDS_Mesh::IsGroupOfSubShapes (const TopoDS_Shape& theShape) const
1199 if ( myIndexToShape.Contains(theShape) )
1202 for ( TopoDS_Iterator it( theShape ); it.More(); it.Next() )
1203 if (IsGroupOfSubShapes( it.Value() ))
1209 ///////////////////////////////////////////////////////////////////////////////
1210 /// Return the sub mesh linked to the a given TopoDS_Shape or NULL if the given
1211 /// TopoDS_Shape is unknown
1212 ///////////////////////////////////////////////////////////////////////////////
1213 SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const
1215 int Index = ShapeToIndex(S);
1216 TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index);
1217 if (anIter != myShapeIndexToSubMesh.end())
1218 return anIter->second;
1223 ///////////////////////////////////////////////////////////////////////////////
1224 /// Return the sub mesh by Id of shape it is linked to
1225 ///////////////////////////////////////////////////////////////////////////////
1226 SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index) const
1228 TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index);
1229 if (anIter != myShapeIndexToSubMesh.end())
1230 return anIter->second;
1235 //=======================================================================
1236 //function : SubMeshIndices
1238 //=======================================================================
1239 list<int> SMESHDS_Mesh::SubMeshIndices() const
1241 list<int> anIndices;
1242 std::map<int,SMESHDS_SubMesh*>::const_iterator anIter = myShapeIndexToSubMesh.begin();
1243 for (; anIter != myShapeIndexToSubMesh.end(); anIter++) {
1244 anIndices.push_back((*anIter).first);
1249 //=======================================================================
1250 //function : GetHypothesis
1252 //=======================================================================
1254 const list<const SMESHDS_Hypothesis*>&
1255 SMESHDS_Mesh::GetHypothesis(const TopoDS_Shape & S) const
1257 if ( myShapeToHypothesis.IsBound( S.Oriented(TopAbs_FORWARD) ) ) // ignore orientation of S
1258 return myShapeToHypothesis.Find( S.Oriented(TopAbs_FORWARD) );
1260 static list<const SMESHDS_Hypothesis*> empty;
1264 //================================================================================
1266 * \brief returns true if the hypothesis is assigned to any sub-shape
1268 //================================================================================
1270 bool SMESHDS_Mesh::IsUsedHypothesis(const SMESHDS_Hypothesis * H) const
1272 ShapeToHypothesis::Iterator s2h( myShapeToHypothesis );
1273 for ( ; s2h.More(); s2h.Next() )
1274 if ( std::find( s2h.Value().begin(), s2h.Value().end(), H ) != s2h.Value().end() )
1279 //=======================================================================
1280 //function : GetScript
1282 //=======================================================================
1283 SMESHDS_Script* SMESHDS_Mesh::GetScript()
1288 //=======================================================================
1289 //function : ClearScript
1291 //=======================================================================
1292 void SMESHDS_Mesh::ClearScript()
1297 //=======================================================================
1298 //function : HasMeshElements
1300 //=======================================================================
1301 bool SMESHDS_Mesh::HasMeshElements(const TopoDS_Shape & S) const
1303 if (myShape.IsNull()) MESSAGE("myShape is NULL");
1304 int Index = myIndexToShape.FindIndex(S);
1305 return myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end();
1308 //=======================================================================
1309 //function : HasHypothesis
1311 //=======================================================================
1312 bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S)
1314 return myShapeToHypothesis.IsBound(S.Oriented(TopAbs_FORWARD));
1317 //=======================================================================
1318 //function : NewSubMesh
1320 //=======================================================================
1321 SMESHDS_SubMesh * SMESHDS_Mesh::NewSubMesh(int Index)
1323 SMESHDS_SubMesh* SM = 0;
1324 TShapeIndexToSubMesh::iterator anIter = myShapeIndexToSubMesh.find(Index);
1325 if (anIter == myShapeIndexToSubMesh.end())
1327 SM = new SMESHDS_SubMesh(this, Index);
1328 myShapeIndexToSubMesh[Index]=SM;
1331 SM = anIter->second;
1335 //=======================================================================
1336 //function : AddCompoundSubmesh
1338 //=======================================================================
1340 int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S,
1341 TopAbs_ShapeEnum type)
1344 if ( IsGroupOfSubShapes( S ))
1346 aMainIndex = myIndexToShape.Add( S );
1347 bool all = ( type == TopAbs_SHAPE );
1348 if ( all ) // corresponding simple submesh may exist
1349 aMainIndex = -aMainIndex;
1350 //MESSAGE("AddCompoundSubmesh index = " << aMainIndex );
1351 SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex );
1352 if ( !aNewSub->IsComplexSubmesh() ) // is empty
1354 int shapeType = Max( TopAbs_SOLID, all ? myShape.ShapeType() : type );
1355 int typeLimit = all ? TopAbs_VERTEX : type;
1356 for ( ; shapeType <= typeLimit; shapeType++ )
1358 TopExp_Explorer exp( S, TopAbs_ShapeEnum( shapeType ));
1359 for ( ; exp.More(); exp.Next() )
1361 int index = myIndexToShape.FindIndex( exp.Current() );
1363 aNewSub->AddSubMesh( NewSubMesh( index ));
1371 //=======================================================================
1372 //function : IndexToShape
1374 //=======================================================================
1375 const TopoDS_Shape& SMESHDS_Mesh::IndexToShape(int ShapeIndex) const
1379 return myIndexToShape.FindKey(ShapeIndex);
1381 catch ( Standard_OutOfRange )
1384 static TopoDS_Shape nullShape;
1388 //================================================================================
1390 * \brief Return max index of sub-mesh
1392 //================================================================================
1394 int SMESHDS_Mesh::MaxSubMeshIndex() const
1396 return myShapeIndexToSubMesh.empty() ? 0 : myShapeIndexToSubMesh.rbegin()->first;
1399 //=======================================================================
1400 //function : ShapeToIndex
1402 //=======================================================================
1403 int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const
1405 if (myShape.IsNull())
1406 MESSAGE("myShape is NULL");
1408 int index = myIndexToShape.FindIndex(S);
1413 //=======================================================================
1414 //function : SetNodeOnVolume
1416 //=======================================================================
1417 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index)
1419 //add(aNode, getSubmesh(Index));
1420 if ( add( aNode, getSubmesh( Index )))
1421 ((SMDS_MeshNode*) aNode)->SetPosition( SMDS_SpacePosition::originSpacePosition());
1424 //=======================================================================
1425 //function : SetNodeOnFace
1427 //=======================================================================
1428 void SMESHDS_Mesh::SetNodeOnFace(const SMDS_MeshNode* aNode, int Index, double u, double v)
1430 //Set Position on Node
1431 if ( add( aNode, getSubmesh( Index )))
1432 const_cast< SMDS_MeshNode* >
1433 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition( u, v)));
1436 //=======================================================================
1437 //function : SetNodeOnEdge
1439 //=======================================================================
1440 void SMESHDS_Mesh::SetNodeOnEdge(const SMDS_MeshNode* aNode,
1444 //Set Position on Node
1445 if ( add( aNode, getSubmesh( Index )))
1446 const_cast< SMDS_MeshNode* >
1447 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(u)));
1450 //=======================================================================
1451 //function : SetNodeOnVertex
1453 //=======================================================================
1454 void SMESHDS_Mesh::SetNodeOnVertex(const SMDS_MeshNode* aNode, int Index)
1456 //Set Position on Node
1457 if ( add( aNode, getSubmesh( Index )))
1458 const_cast< SMDS_MeshNode* >
1459 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition()));
1462 //=======================================================================
1463 //function : SetMeshElementOnShape
1465 //=======================================================================
1466 void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement,
1469 add( anElement, getSubmesh( Index ));
1472 //=======================================================================
1473 //function : ~SMESHDS_Mesh
1475 //=======================================================================
1476 SMESHDS_Mesh::~SMESHDS_Mesh()
1481 TShapeIndexToSubMesh::iterator i_sm = myShapeIndexToSubMesh.begin();
1482 for ( ; i_sm != myShapeIndexToSubMesh.end(); ++i_sm )
1483 delete i_sm->second;
1487 //********************************************************************
1488 //********************************************************************
1489 //******** *********
1490 //***** Methods for addition of quadratic elements ******
1491 //******** *********
1492 //********************************************************************
1493 //********************************************************************
1495 //=======================================================================
1496 //function : AddEdgeWithID
1498 //=======================================================================
1499 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int n12, int ID)
1501 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,n12,ID);
1502 if(anElem) myScript->AddEdge(ID,n1,n2,n12);
1506 //=======================================================================
1507 //function : AddEdge
1509 //=======================================================================
1510 SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode* n1,
1511 const SMDS_MeshNode* n2,
1512 const SMDS_MeshNode* n12)
1514 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2,n12);
1515 if(anElem) myScript->AddEdge(anElem->GetID(),
1522 //=======================================================================
1523 //function : AddEdgeWithID
1525 //=======================================================================
1526 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
1527 const SMDS_MeshNode * n2,
1528 const SMDS_MeshNode * n12,
1531 return AddEdgeWithID(n1->GetID(),
1538 //=======================================================================
1539 //function : AddFace
1541 //=======================================================================
1542 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1543 const SMDS_MeshNode * n2,
1544 const SMDS_MeshNode * n3,
1545 const SMDS_MeshNode * n12,
1546 const SMDS_MeshNode * n23,
1547 const SMDS_MeshNode * n31)
1549 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31);
1550 if(anElem) myScript->AddFace(anElem->GetID(),
1551 n1->GetID(), n2->GetID(), n3->GetID(),
1552 n12->GetID(), n23->GetID(), n31->GetID());
1556 //=======================================================================
1557 //function : AddFaceWithID
1559 //=======================================================================
1560 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3,
1561 int n12,int n23,int n31, int ID)
1563 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,ID);
1564 if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31);
1568 //=======================================================================
1569 //function : AddFaceWithID
1571 //=======================================================================
1572 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1573 const SMDS_MeshNode * n2,
1574 const SMDS_MeshNode * n3,
1575 const SMDS_MeshNode * n12,
1576 const SMDS_MeshNode * n23,
1577 const SMDS_MeshNode * n31,
1580 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1581 n12->GetID(), n23->GetID(), n31->GetID(),
1585 //=======================================================================
1586 //function : AddFace
1588 //=======================================================================
1589 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1590 const SMDS_MeshNode * n2,
1591 const SMDS_MeshNode * n3,
1592 const SMDS_MeshNode * n12,
1593 const SMDS_MeshNode * n23,
1594 const SMDS_MeshNode * n31,
1595 const SMDS_MeshNode * nCenter)
1597 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31,nCenter);
1598 if(anElem) myScript->AddFace(anElem->GetID(),
1599 n1->GetID(), n2->GetID(), n3->GetID(),
1600 n12->GetID(), n23->GetID(), n31->GetID(),
1605 //=======================================================================
1606 //function : AddFaceWithID
1608 //=======================================================================
1609 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3,
1610 int n12,int n23,int n31, int nCenter, int ID)
1612 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,nCenter,ID);
1613 if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31,nCenter);
1617 //=======================================================================
1618 //function : AddFaceWithID
1620 //=======================================================================
1621 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1622 const SMDS_MeshNode * n2,
1623 const SMDS_MeshNode * n3,
1624 const SMDS_MeshNode * n12,
1625 const SMDS_MeshNode * n23,
1626 const SMDS_MeshNode * n31,
1627 const SMDS_MeshNode * nCenter,
1630 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1631 n12->GetID(), n23->GetID(), n31->GetID(),
1632 nCenter->GetID(), ID);
1636 //=======================================================================
1637 //function : AddFace
1639 //=======================================================================
1640 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1641 const SMDS_MeshNode * n2,
1642 const SMDS_MeshNode * n3,
1643 const SMDS_MeshNode * n4,
1644 const SMDS_MeshNode * n12,
1645 const SMDS_MeshNode * n23,
1646 const SMDS_MeshNode * n34,
1647 const SMDS_MeshNode * n41)
1649 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41);
1650 if(anElem) myScript->AddFace(anElem->GetID(),
1651 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1652 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID());
1656 //=======================================================================
1657 //function : AddFaceWithID
1659 //=======================================================================
1660 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4,
1661 int n12,int n23,int n34,int n41, int ID)
1663 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,ID);
1664 if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41);
1668 //=======================================================================
1669 //function : AddFaceWithID
1671 //=======================================================================
1672 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1673 const SMDS_MeshNode * n2,
1674 const SMDS_MeshNode * n3,
1675 const SMDS_MeshNode * n4,
1676 const SMDS_MeshNode * n12,
1677 const SMDS_MeshNode * n23,
1678 const SMDS_MeshNode * n34,
1679 const SMDS_MeshNode * n41,
1682 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1683 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1688 //=======================================================================
1689 //function : AddFace
1691 //=======================================================================
1692 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1693 const SMDS_MeshNode * n2,
1694 const SMDS_MeshNode * n3,
1695 const SMDS_MeshNode * n4,
1696 const SMDS_MeshNode * n12,
1697 const SMDS_MeshNode * n23,
1698 const SMDS_MeshNode * n34,
1699 const SMDS_MeshNode * n41,
1700 const SMDS_MeshNode * nCenter)
1702 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
1703 if(anElem) myScript->AddFace(anElem->GetID(),
1704 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1705 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1710 //=======================================================================
1711 //function : AddFaceWithID
1713 //=======================================================================
1714 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4,
1715 int n12,int n23,int n34,int n41,
1716 int nCenter, int ID)
1718 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,nCenter,ID);
1719 if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
1723 //=======================================================================
1724 //function : AddFaceWithID
1726 //=======================================================================
1727 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1728 const SMDS_MeshNode * n2,
1729 const SMDS_MeshNode * n3,
1730 const SMDS_MeshNode * n4,
1731 const SMDS_MeshNode * n12,
1732 const SMDS_MeshNode * n23,
1733 const SMDS_MeshNode * n34,
1734 const SMDS_MeshNode * n41,
1735 const SMDS_MeshNode * nCenter,
1738 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1739 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1740 nCenter->GetID(), ID);
1744 //=======================================================================
1745 //function : AddVolume
1747 //=======================================================================
1748 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1749 const SMDS_MeshNode * n2,
1750 const SMDS_MeshNode * n3,
1751 const SMDS_MeshNode * n4,
1752 const SMDS_MeshNode * n12,
1753 const SMDS_MeshNode * n23,
1754 const SMDS_MeshNode * n31,
1755 const SMDS_MeshNode * n14,
1756 const SMDS_MeshNode * n24,
1757 const SMDS_MeshNode * n34)
1759 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1760 if(anElem) myScript->AddVolume(anElem->GetID(),
1761 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1762 n12->GetID(), n23->GetID(), n31->GetID(),
1763 n14->GetID(), n24->GetID(), n34->GetID());
1767 //=======================================================================
1768 //function : AddVolumeWithID
1770 //=======================================================================
1771 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
1772 int n12,int n23,int n31,
1773 int n14,int n24,int n34, int ID)
1775 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n12,n23,
1776 n31,n14,n24,n34,ID);
1777 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1781 //=======================================================================
1782 //function : AddVolumeWithID
1783 //purpose : 2d order tetrahedron of 10 nodes
1784 //=======================================================================
1785 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1786 const SMDS_MeshNode * n2,
1787 const SMDS_MeshNode * n3,
1788 const SMDS_MeshNode * n4,
1789 const SMDS_MeshNode * n12,
1790 const SMDS_MeshNode * n23,
1791 const SMDS_MeshNode * n31,
1792 const SMDS_MeshNode * n14,
1793 const SMDS_MeshNode * n24,
1794 const SMDS_MeshNode * n34,
1797 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1798 n12->GetID(), n23->GetID(), n31->GetID(),
1799 n14->GetID(), n24->GetID(), n34->GetID(), ID);
1803 //=======================================================================
1804 //function : AddVolume
1806 //=======================================================================
1807 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1808 const SMDS_MeshNode * n2,
1809 const SMDS_MeshNode * n3,
1810 const SMDS_MeshNode * n4,
1811 const SMDS_MeshNode * n5,
1812 const SMDS_MeshNode * n12,
1813 const SMDS_MeshNode * n23,
1814 const SMDS_MeshNode * n34,
1815 const SMDS_MeshNode * n41,
1816 const SMDS_MeshNode * n15,
1817 const SMDS_MeshNode * n25,
1818 const SMDS_MeshNode * n35,
1819 const SMDS_MeshNode * n45)
1821 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n12,n23,n34,n41,
1824 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1825 n3->GetID(), n4->GetID(), n5->GetID(),
1826 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1827 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID());
1831 //=======================================================================
1832 //function : AddVolumeWithID
1834 //=======================================================================
1835 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5,
1836 int n12,int n23,int n34,int n41,
1837 int n15,int n25,int n35,int n45, int ID)
1839 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,
1841 n15,n25,n35,n45,ID);
1842 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n12,n23,n34,n41,
1847 //=======================================================================
1848 //function : AddVolumeWithID
1849 //purpose : 2d order pyramid of 13 nodes
1850 //=======================================================================
1851 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1852 const SMDS_MeshNode * n2,
1853 const SMDS_MeshNode * n3,
1854 const SMDS_MeshNode * n4,
1855 const SMDS_MeshNode * n5,
1856 const SMDS_MeshNode * n12,
1857 const SMDS_MeshNode * n23,
1858 const SMDS_MeshNode * n34,
1859 const SMDS_MeshNode * n41,
1860 const SMDS_MeshNode * n15,
1861 const SMDS_MeshNode * n25,
1862 const SMDS_MeshNode * n35,
1863 const SMDS_MeshNode * n45,
1866 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1867 n4->GetID(), n5->GetID(),
1868 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1869 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID(),
1874 //=======================================================================
1875 //function : AddVolume
1877 //=======================================================================
1878 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1879 const SMDS_MeshNode * n2,
1880 const SMDS_MeshNode * n3,
1881 const SMDS_MeshNode * n4,
1882 const SMDS_MeshNode * n5,
1883 const SMDS_MeshNode * n6,
1884 const SMDS_MeshNode * n12,
1885 const SMDS_MeshNode * n23,
1886 const SMDS_MeshNode * n31,
1887 const SMDS_MeshNode * n45,
1888 const SMDS_MeshNode * n56,
1889 const SMDS_MeshNode * n64,
1890 const SMDS_MeshNode * n14,
1891 const SMDS_MeshNode * n25,
1892 const SMDS_MeshNode * n36)
1894 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n12,n23,n31,
1895 n45,n56,n64,n14,n25,n36);
1897 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1898 n3->GetID(), n4->GetID(), n5->GetID(), n6->GetID(),
1899 n12->GetID(), n23->GetID(), n31->GetID(),
1900 n45->GetID(), n56->GetID(), n64->GetID(),
1901 n14->GetID(), n25->GetID(), n36->GetID());
1905 //=======================================================================
1906 //function : AddVolumeWithID
1908 //=======================================================================
1909 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3,
1910 int n4, int n5, int n6,
1911 int n12,int n23,int n31,
1912 int n45,int n56,int n64,
1913 int n14,int n25,int n36, int ID)
1915 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,
1919 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n12,n23,n31,
1920 n45,n56,n64,n14,n25,n36);
1924 //=======================================================================
1925 //function : AddVolumeWithID
1926 //purpose : 2d order Pentahedron with 15 nodes
1927 //=======================================================================
1928 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1929 const SMDS_MeshNode * n2,
1930 const SMDS_MeshNode * n3,
1931 const SMDS_MeshNode * n4,
1932 const SMDS_MeshNode * n5,
1933 const SMDS_MeshNode * n6,
1934 const SMDS_MeshNode * n12,
1935 const SMDS_MeshNode * n23,
1936 const SMDS_MeshNode * n31,
1937 const SMDS_MeshNode * n45,
1938 const SMDS_MeshNode * n56,
1939 const SMDS_MeshNode * n64,
1940 const SMDS_MeshNode * n14,
1941 const SMDS_MeshNode * n25,
1942 const SMDS_MeshNode * n36,
1945 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1946 n4->GetID(), n5->GetID(), n6->GetID(),
1947 n12->GetID(), n23->GetID(), n31->GetID(),
1948 n45->GetID(), n56->GetID(), n64->GetID(),
1949 n14->GetID(), n25->GetID(), n36->GetID(),
1954 //=======================================================================
1955 //function : AddVolume
1956 //purpose : add quadratic hexahedron
1957 //=======================================================================
1958 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1959 const SMDS_MeshNode * n2,
1960 const SMDS_MeshNode * n3,
1961 const SMDS_MeshNode * n4,
1962 const SMDS_MeshNode * n5,
1963 const SMDS_MeshNode * n6,
1964 const SMDS_MeshNode * n7,
1965 const SMDS_MeshNode * n8,
1966 const SMDS_MeshNode * n12,
1967 const SMDS_MeshNode * n23,
1968 const SMDS_MeshNode * n34,
1969 const SMDS_MeshNode * n41,
1970 const SMDS_MeshNode * n56,
1971 const SMDS_MeshNode * n67,
1972 const SMDS_MeshNode * n78,
1973 const SMDS_MeshNode * n85,
1974 const SMDS_MeshNode * n15,
1975 const SMDS_MeshNode * n26,
1976 const SMDS_MeshNode * n37,
1977 const SMDS_MeshNode * n48)
1979 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
1984 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1985 n3->GetID(), n4->GetID(), n5->GetID(),
1986 n6->GetID(), n7->GetID(), n8->GetID(),
1987 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1988 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
1989 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID());
1993 //=======================================================================
1994 //function : AddVolumeWithID
1996 //=======================================================================
1997 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
1998 int n5, int n6, int n7, int n8,
1999 int n12,int n23,int n34,int n41,
2000 int n56,int n67,int n78,int n85,
2001 int n15,int n26,int n37,int n48, int ID)
2003 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
2006 n15,n26,n37,n48,ID);
2007 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
2008 n56,n67,n78,n85,n15,n26,n37,n48);
2012 //=======================================================================
2013 //function : AddVolumeWithID
2014 //purpose : 2d order Hexahedrons with 20 nodes
2015 //=======================================================================
2016 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2017 const SMDS_MeshNode * n2,
2018 const SMDS_MeshNode * n3,
2019 const SMDS_MeshNode * n4,
2020 const SMDS_MeshNode * n5,
2021 const SMDS_MeshNode * n6,
2022 const SMDS_MeshNode * n7,
2023 const SMDS_MeshNode * n8,
2024 const SMDS_MeshNode * n12,
2025 const SMDS_MeshNode * n23,
2026 const SMDS_MeshNode * n34,
2027 const SMDS_MeshNode * n41,
2028 const SMDS_MeshNode * n56,
2029 const SMDS_MeshNode * n67,
2030 const SMDS_MeshNode * n78,
2031 const SMDS_MeshNode * n85,
2032 const SMDS_MeshNode * n15,
2033 const SMDS_MeshNode * n26,
2034 const SMDS_MeshNode * n37,
2035 const SMDS_MeshNode * n48,
2038 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
2039 n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
2040 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2041 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2042 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2046 //=======================================================================
2047 //function : AddVolume
2048 //purpose : add tri-quadratic hexahedron of 27 nodes
2049 //=======================================================================
2051 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2052 const SMDS_MeshNode * n2,
2053 const SMDS_MeshNode * n3,
2054 const SMDS_MeshNode * n4,
2055 const SMDS_MeshNode * n5,
2056 const SMDS_MeshNode * n6,
2057 const SMDS_MeshNode * n7,
2058 const SMDS_MeshNode * n8,
2059 const SMDS_MeshNode * n12,
2060 const SMDS_MeshNode * n23,
2061 const SMDS_MeshNode * n34,
2062 const SMDS_MeshNode * n41,
2063 const SMDS_MeshNode * n56,
2064 const SMDS_MeshNode * n67,
2065 const SMDS_MeshNode * n78,
2066 const SMDS_MeshNode * n85,
2067 const SMDS_MeshNode * n15,
2068 const SMDS_MeshNode * n26,
2069 const SMDS_MeshNode * n37,
2070 const SMDS_MeshNode * n48,
2071 const SMDS_MeshNode * n1234,
2072 const SMDS_MeshNode * n1256,
2073 const SMDS_MeshNode * n2367,
2074 const SMDS_MeshNode * n3478,
2075 const SMDS_MeshNode * n1458,
2076 const SMDS_MeshNode * n5678,
2077 const SMDS_MeshNode * nCenter)
2079 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
2083 n1234,n1256,n2367,n3478,n1458,n5678,nCenter);
2085 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
2086 n3->GetID(), n4->GetID(), n5->GetID(),
2087 n6->GetID(), n7->GetID(), n8->GetID(),
2088 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2089 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2090 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2091 n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
2092 n1458->GetID(),n5678->GetID(),nCenter->GetID());
2096 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
2097 int n5, int n6, int n7, int n8,
2098 int n12,int n23,int n34,int n41,
2099 int n56,int n67,int n78,int n85,
2100 int n15,int n26,int n37,int n48,
2101 int n1234,int n1256,int n2367,int n3478,
2102 int n1458,int n5678,int nCenter,
2105 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
2109 n1234, n1256, n2367, n3478,
2110 n1458, n5678, nCenter,
2112 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
2113 n56,n67,n78,n85,n15,n26,n37,n48,
2114 n1234, n1256, n2367, n3478,
2115 n1458, n5678, nCenter);
2119 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2120 const SMDS_MeshNode * n2,
2121 const SMDS_MeshNode * n3,
2122 const SMDS_MeshNode * n4,
2123 const SMDS_MeshNode * n5,
2124 const SMDS_MeshNode * n6,
2125 const SMDS_MeshNode * n7,
2126 const SMDS_MeshNode * n8,
2127 const SMDS_MeshNode * n12,
2128 const SMDS_MeshNode * n23,
2129 const SMDS_MeshNode * n34,
2130 const SMDS_MeshNode * n41,
2131 const SMDS_MeshNode * n56,
2132 const SMDS_MeshNode * n67,
2133 const SMDS_MeshNode * n78,
2134 const SMDS_MeshNode * n85,
2135 const SMDS_MeshNode * n15,
2136 const SMDS_MeshNode * n26,
2137 const SMDS_MeshNode * n37,
2138 const SMDS_MeshNode * n48,
2139 const SMDS_MeshNode * n1234,
2140 const SMDS_MeshNode * n1256,
2141 const SMDS_MeshNode * n2367,
2142 const SMDS_MeshNode * n3478,
2143 const SMDS_MeshNode * n1458,
2144 const SMDS_MeshNode * n5678,
2145 const SMDS_MeshNode * nCenter,
2148 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
2149 n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
2150 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2151 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2152 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2153 n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
2154 n1458->GetID(),n5678->GetID(),nCenter->GetID(), ID);
2157 void SMESHDS_Mesh::compactMesh()
2159 int newNodeSize = 0;
2160 int nbNodes = myNodes.size();
2161 int nbVtkNodes = myGrid->GetNumberOfPoints();
2162 MESSAGE("nbNodes=" << nbNodes << " nbVtkNodes=" << nbVtkNodes);
2163 int nbNodeTemp = nbVtkNodes;
2164 if (nbNodes > nbVtkNodes)
2165 nbNodeTemp = nbNodes;
2166 vector<int> idNodesOldToNew;
2167 idNodesOldToNew.clear();
2168 idNodesOldToNew.resize(nbNodeTemp, -1); // all unused id will be -1
2170 for (int i = 0; i < nbNodes; i++)
2174 int vtkid = myNodes[i]->getVtkId();
2175 idNodesOldToNew[vtkid] = i; // old vtkId --> old smdsId (valid smdsId are >= 0)
2179 bool areNodesModified = (newNodeSize < nbVtkNodes);
2180 MESSAGE("------------------------- compactMesh Nodes Modified: " << areNodesModified);
2181 areNodesModified = true;
2183 int newCellSize = 0;
2184 int nbCells = myCells.size();
2185 int nbVtkCells = myGrid->GetNumberOfCells();
2186 MESSAGE("nbCells=" << nbCells << " nbVtkCells=" << nbVtkCells);
2187 int nbCellTemp = nbVtkCells;
2188 if (nbCells > nbVtkCells)
2189 nbCellTemp = nbCells;
2190 vector<int> idCellsOldToNew;
2191 idCellsOldToNew.clear();
2192 idCellsOldToNew.resize(nbCellTemp, -1); // all unused id will be -1
2194 for (int i = 0; i < nbCells; i++)
2198 // //idCellsOldToNew[i] = myCellIdVtkToSmds[i]; // valid vtk indexes are > = 0
2199 // int vtkid = myCells[i]->getVtkId();
2200 // idCellsOldToNew[vtkid] = i; // old vtkId --> old smdsId (not used in input)
2204 if (areNodesModified)
2205 myGrid->compactGrid(idNodesOldToNew, newNodeSize, idCellsOldToNew, newCellSize);
2207 myGrid->compactGrid(idNodesOldToNew, 0, idCellsOldToNew, newCellSize);
2209 int nbVtkPts = myGrid->GetNumberOfPoints();
2210 nbVtkCells = myGrid->GetNumberOfCells();
2211 if (nbVtkPts != newNodeSize)
2213 MESSAGE("===> nbVtkPts != newNodeSize " << nbVtkPts << " " << newNodeSize);
2214 if (nbVtkPts > newNodeSize) newNodeSize = nbVtkPts; // several points with same SMDS Id
2216 if (nbVtkCells != newCellSize)
2218 MESSAGE("===> nbVtkCells != newCellSize " << nbVtkCells << " " << newCellSize);
2219 if (nbVtkCells > newCellSize) newCellSize = nbVtkCells; // several cells with same SMDS Id
2222 // --- SMDS_MeshNode and myNodes (id in SMDS and in VTK are the same), myNodeIdFactory
2224 if (areNodesModified)
2226 MESSAGE("-------------- modify myNodes");
2227 SetOfNodes newNodes;
2228 newNodes.resize(newNodeSize+1,0); // 0 not used, SMDS numbers 1..n
2230 for (int i = 0; i < nbNodes; i++)
2234 newSmdsId++; // SMDS id start to 1
2235 int oldVtkId = myNodes[i]->getVtkId();
2236 int newVtkId = idNodesOldToNew[oldVtkId];
2237 //MESSAGE("myNodes["<< i << "] vtkId " << oldVtkId << " --> " << newVtkId);
2238 myNodes[i]->setVtkId(newVtkId);
2239 myNodes[i]->setId(newSmdsId);
2240 newNodes[newSmdsId] = myNodes[i];
2241 //MESSAGE("myNodes["<< i << "] --> newNodes[" << newSmdsId << "]");
2244 myNodes.swap(newNodes);
2245 this->myNodeIDFactory->emptyPool(newSmdsId); // newSmdsId = number of nodes
2246 MESSAGE("myNodes.size " << myNodes.size());
2249 // --- SMDS_MeshCell, myCellIdVtkToSmds, myCellIdSmdsToVtk, myCells
2251 int vtkIndexSize = myCellIdVtkToSmds.size();
2253 for (int oldVtkId = 0; oldVtkId < vtkIndexSize; oldVtkId++)
2255 int oldSmdsId = this->myCellIdVtkToSmds[oldVtkId];
2258 int newVtkId = idCellsOldToNew[oldVtkId];
2259 if (newVtkId > maxVtkId)
2260 maxVtkId = newVtkId;
2261 //MESSAGE("myCells["<< oldSmdsId << "] vtkId " << oldVtkId << " --> " << newVtkId);
2262 myCells[oldSmdsId]->setVtkId(newVtkId);
2265 // MESSAGE("myCells.size()=" << myCells.size()
2266 // << " myCellIdSmdsToVtk.size()=" << myCellIdSmdsToVtk.size()
2267 // << " myCellIdVtkToSmds.size()=" << myCellIdVtkToSmds.size() );
2269 SetOfCells newCells;
2270 //vector<int> newSmdsToVtk;
2271 vector<int> newVtkToSmds;
2273 assert(maxVtkId < newCellSize);
2274 newCells.resize(newCellSize+1, 0); // 0 not used, SMDS numbers 1..n
2275 //newSmdsToVtk.resize(newCellSize+1, -1);
2276 newVtkToSmds.resize(newCellSize+1, -1);
2278 int myCellsSize = myCells.size();
2280 for (int i = 0; i < myCellsSize; i++)
2284 newSmdsId++; // SMDS id start to 1
2285 assert(newSmdsId <= newCellSize);
2286 newCells[newSmdsId] = myCells[i];
2287 newCells[newSmdsId]->setId(newSmdsId);
2288 //MESSAGE("myCells["<< i << "] --> newCells[" << newSmdsId << "]");
2289 int idvtk = myCells[i]->getVtkId();
2290 //newSmdsToVtk[newSmdsId] = idvtk;
2291 assert(idvtk < newCellSize);
2292 newVtkToSmds[idvtk] = newSmdsId;
2296 myCells.swap(newCells);
2297 //myCellIdSmdsToVtk.swap(newSmdsToVtk);
2298 myCellIdVtkToSmds.swap(newVtkToSmds);
2299 MESSAGE("myCells.size()=" << myCells.size()
2300 << " myCellIdVtkToSmds.size()=" << myCellIdVtkToSmds.size() );
2301 this->myElementIDFactory->emptyPool(newSmdsId);
2303 this->myScript->SetModified(true); // notify GUI client for buildPrs when update
2305 // --- compact list myNodes and myElements in submeshes
2307 map<int,SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.begin();
2308 for(; it != myShapeIndexToSubMesh.end(); ++it)
2310 (*it).second->compactList();
2315 void SMESHDS_Mesh::CleanDownWardConnectivity()
2317 myGrid->CleanDownwardConnectivity();
2320 void SMESHDS_Mesh::BuildDownWardConnectivity(bool withEdges)
2322 myGrid->BuildDownwardConnectivity(withEdges);
2325 /*! change some nodes in cell without modifying type or internal connectivity.
2326 * Nodes inverse connectivity is maintained up to date.
2327 * @param vtkVolId vtk id of the cell.
2328 * @param localClonedNodeIds map old node id to new node id.
2329 * @return ok if success.
2331 bool SMESHDS_Mesh::ModifyCellNodes(int vtkVolId, std::map<int,int> localClonedNodeIds)
2333 myGrid->ModifyCellNodes(vtkVolId, localClonedNodeIds);