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 "SMDS_Downward.hxx"
31 #include "SMDS_EdgePosition.hxx"
32 #include "SMDS_FacePosition.hxx"
33 #include "SMDS_SpacePosition.hxx"
34 #include "SMDS_VertexPosition.hxx"
35 #include "SMESHDS_Group.hxx"
36 #include "SMESHDS_GroupOnGeom.hxx"
37 #include "SMESHDS_Script.hxx"
38 #include "SMESHDS_TSubMeshHolder.hxx"
40 #include <Standard_ErrorHandler.hxx>
41 #include <Standard_OutOfRange.hxx>
43 #include <TopExp_Explorer.hxx>
44 #include <TopoDS_Edge.hxx>
45 #include <TopoDS_Face.hxx>
46 #include <TopoDS_Iterator.hxx>
47 #include <TopoDS_Shell.hxx>
48 #include <TopoDS_Solid.hxx>
49 #include <TopoDS_Vertex.hxx>
51 #include "utilities.h"
55 class SMESHDS_Mesh::SubMeshHolder : public SMESHDS_TSubMeshHolder< const SMESHDS_SubMesh >
59 //=======================================================================
62 //=======================================================================
63 SMESHDS_Mesh::SMESHDS_Mesh(int theMeshID, bool theIsEmbeddedMode):
65 mySubMeshHolder( new SubMeshHolder ),
66 myIsEmbeddedMode(theIsEmbeddedMode)
68 myScript = new SMESHDS_Script(theIsEmbeddedMode);
69 SetPersistentId(theMeshID);
72 //=======================================================================
73 bool SMESHDS_Mesh::IsEmbeddedMode()
75 return myIsEmbeddedMode;
78 //================================================================================
80 * \brief Store ID persistent during lifecycle
82 * Initially it was used to have a persistent reference to the mesh from the hypothesis
84 //================================================================================
86 void SMESHDS_Mesh::SetPersistentId(int id)
91 //================================================================================
93 * \brief Return ID persistent during lifecycle
95 //================================================================================
97 int SMESHDS_Mesh::GetPersistentId() const
99 return myPersistentID;
102 //=======================================================================
103 //function : ShapeToMesh
105 //=======================================================================
106 void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S)
108 if ( !myShape.IsNull() && S.IsNull() )
110 // removal of a shape to mesh, delete ...
112 myShapeToHypothesis.Clear();
113 // - shape indices in SMDS_Position of nodes
114 SMESHDS_SubMeshIteratorPtr smIt = SubMeshes();
115 while ( SMESHDS_SubMesh* sm = const_cast< SMESHDS_SubMesh* >( smIt->next() )) {
116 if ( !sm->IsComplexSubmesh() ) {
117 SMDS_NodeIteratorPtr nIt = sm->GetNodes();
118 while ( nIt->more() )
119 sm->RemoveNode(nIt->next(), false);
123 mySubMeshHolder->DeleteAll();
125 myIndexToShape.Clear();
126 // - groups on geometry
127 set<SMESHDS_GroupBase*>::iterator gr = myGroups.begin();
128 while ( gr != myGroups.end() ) {
129 if ( dynamic_cast<SMESHDS_GroupOnGeom*>( *gr ))
130 myGroups.erase( gr++ );
138 TopExp::MapShapes(myShape, myIndexToShape);
142 //=======================================================================
143 //function : AddHypothesis
145 //=======================================================================
147 bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS,
148 const SMESHDS_Hypothesis * H)
150 if (!myShapeToHypothesis.IsBound(SS/*.Oriented(TopAbs_FORWARD)*/)) {
151 list<const SMESHDS_Hypothesis *> aList;
152 myShapeToHypothesis.Bind(SS/*.Oriented(TopAbs_FORWARD)*/, aList);
154 list<const SMESHDS_Hypothesis *>& alist =
155 myShapeToHypothesis(SS/*.Oriented(TopAbs_FORWARD)*/); // ignore orientation of SS
157 //Check if the Hypothesis is still present
158 list<const SMESHDS_Hypothesis*>::iterator ith = find(alist.begin(),alist.end(), H );
160 if (alist.end() != ith) return false;
166 //=======================================================================
167 //function : RemoveHypothesis
169 //=======================================================================
171 bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S,
172 const SMESHDS_Hypothesis * H)
174 if( myShapeToHypothesis.IsBound( S/*.Oriented(TopAbs_FORWARD)*/ ) )
176 list<const SMESHDS_Hypothesis *>& alist=myShapeToHypothesis.ChangeFind( S/*.Oriented(TopAbs_FORWARD)*/ );
177 list<const SMESHDS_Hypothesis*>::iterator ith=find(alist.begin(),alist.end(), H );
178 if (ith != alist.end())
187 //=======================================================================
190 //=======================================================================
191 SMDS_MeshNode* SMESHDS_Mesh::AddNode(double x, double y, double z){
192 SMDS_MeshNode* node = SMDS_Mesh::AddNode(x, y, z);
193 if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
197 SMDS_MeshNode* SMESHDS_Mesh::AddNodeWithID(double x, double y, double z, int ID){
198 SMDS_MeshNode* node = SMDS_Mesh::AddNodeWithID(x,y,z,ID);
199 if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
203 //=======================================================================
204 //function : MoveNode
206 //=======================================================================
208 void SMESHDS_Mesh::MoveNode(const SMDS_MeshNode *n, double x, double y, double z)
210 SMDS_Mesh::MoveNode( n, x, y, z );
211 myScript->MoveNode(n->GetID(), x, y, z);
214 //=======================================================================
215 //function : ChangeElementNodes
217 //=======================================================================
219 bool SMESHDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem,
220 const SMDS_MeshNode * nodes[],
223 //MESSAGE("SMESHDS_Mesh::ChangeElementNodes");
224 if ( ! SMDS_Mesh::ChangeElementNodes( elem, nodes, nbnodes ))
227 vector<int> IDs( nbnodes );
228 for ( int i = 0; i < nbnodes; i++ )
229 IDs [ i ] = nodes[ i ]->GetID();
230 myScript->ChangeElementNodes( elem->GetID(), &IDs[0], nbnodes);
235 //=======================================================================
236 //function : ChangePolygonNodes
238 //=======================================================================
239 bool SMESHDS_Mesh::ChangePolygonNodes
240 (const SMDS_MeshElement * elem,
241 vector<const SMDS_MeshNode*> nodes)
243 ASSERT(nodes.size() > 3);
245 return ChangeElementNodes(elem, &nodes[0], nodes.size());
248 //=======================================================================
249 //function : ChangePolyhedronNodes
251 //=======================================================================
252 bool SMESHDS_Mesh::ChangePolyhedronNodes
253 (const SMDS_MeshElement * elem,
254 std::vector<const SMDS_MeshNode*> nodes,
255 std::vector<int> quantities)
257 ASSERT(nodes.size() > 3);
259 if (!SMDS_Mesh::ChangePolyhedronNodes(elem, nodes, quantities))
262 int i, len = nodes.size();
263 std::vector<int> nodes_ids (len);
264 for (i = 0; i < len; i++) {
265 nodes_ids[i] = nodes[i]->GetID();
267 myScript->ChangePolyhedronNodes(elem->GetID(), nodes_ids, quantities);
272 //=======================================================================
273 //function : Renumber
275 //=======================================================================
277 void SMESHDS_Mesh::Renumber (const bool isNodes, const int startID, const int deltaID)
279 // TODO not possible yet to have node numbers not starting to O and continuous.
280 if (!this->isCompacted())
282 // SMDS_Mesh::Renumber( isNodes, startID, deltaID );
283 // myScript->Renumber( isNodes, startID, deltaID );
286 //=======================================================================
287 //function : Add0DElement
289 //=======================================================================
290 SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElementWithID(int nodeID, int ID)
292 SMDS_Mesh0DElement* anElem = SMDS_Mesh::Add0DElementWithID(nodeID, ID);
293 if (anElem) myScript->Add0DElement(ID, nodeID);
297 SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElementWithID
298 (const SMDS_MeshNode * node, int ID)
300 return Add0DElementWithID(node->GetID(), ID);
303 SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElement(const SMDS_MeshNode * node)
305 SMDS_Mesh0DElement* anElem = SMDS_Mesh::Add0DElement(node);
306 if (anElem) myScript->Add0DElement(anElem->GetID(), node->GetID());
310 //=======================================================================
311 //function :AddBallWithID
313 //=======================================================================
315 SMDS_BallElement* SMESHDS_Mesh::AddBallWithID(int node, double diameter, int ID)
317 SMDS_BallElement* anElem = SMDS_Mesh::AddBallWithID(node,diameter,ID);
318 if (anElem) myScript->AddBall(anElem->GetID(), node, diameter);
322 SMDS_BallElement* SMESHDS_Mesh::AddBallWithID(const SMDS_MeshNode * node,
326 SMDS_BallElement* anElem = SMDS_Mesh::AddBallWithID(node,diameter,ID);
327 if (anElem) myScript->AddBall(anElem->GetID(), node->GetID(), diameter);
331 SMDS_BallElement* SMESHDS_Mesh::AddBall (const SMDS_MeshNode * node,
334 SMDS_BallElement* anElem = SMDS_Mesh::AddBall(node,diameter);
335 if (anElem) myScript->AddBall(anElem->GetID(), node->GetID(), diameter);
339 //=======================================================================
340 //function :AddEdgeWithID
342 //=======================================================================
344 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int ID)
346 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,ID);
347 if(anElem) myScript->AddEdge(ID,n1,n2);
351 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
352 const SMDS_MeshNode * n2,
355 return AddEdgeWithID(n1->GetID(),
360 SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode * n1,
361 const SMDS_MeshNode * n2)
363 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2);
364 if(anElem) myScript->AddEdge(anElem->GetID(),
370 //=======================================================================
373 //=======================================================================
374 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int ID)
376 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, ID);
377 if(anElem) myScript->AddFace(ID,n1,n2,n3);
381 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
382 const SMDS_MeshNode * n2,
383 const SMDS_MeshNode * n3,
386 return AddFaceWithID(n1->GetID(),
392 SMDS_MeshFace* SMESHDS_Mesh::AddFace( const SMDS_MeshNode * n1,
393 const SMDS_MeshNode * n2,
394 const SMDS_MeshNode * n3)
396 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3);
397 if(anElem) myScript->AddFace(anElem->GetID(),
404 //=======================================================================
407 //=======================================================================
408 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4, int ID)
410 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, n4, ID);
411 if(anElem) myScript->AddFace(ID, n1, n2, n3, n4);
415 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
416 const SMDS_MeshNode * n2,
417 const SMDS_MeshNode * n3,
418 const SMDS_MeshNode * n4,
421 return AddFaceWithID(n1->GetID(),
428 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
429 const SMDS_MeshNode * n2,
430 const SMDS_MeshNode * n3,
431 const SMDS_MeshNode * n4)
433 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3, n4);
434 if(anElem) myScript->AddFace(anElem->GetID(),
442 //=======================================================================
443 //function :AddVolume
445 //=======================================================================
446 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int ID)
448 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID);
449 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4);
453 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
454 const SMDS_MeshNode * n2,
455 const SMDS_MeshNode * n3,
456 const SMDS_MeshNode * n4,
459 return AddVolumeWithID(n1->GetID(),
466 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
467 const SMDS_MeshNode * n2,
468 const SMDS_MeshNode * n3,
469 const SMDS_MeshNode * n4)
471 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4);
472 if(anElem) myScript->AddVolume(anElem->GetID(),
480 //=======================================================================
481 //function :AddVolume
483 //=======================================================================
484 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int ID)
486 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID);
487 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5);
491 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
492 const SMDS_MeshNode * n2,
493 const SMDS_MeshNode * n3,
494 const SMDS_MeshNode * n4,
495 const SMDS_MeshNode * n5,
498 return AddVolumeWithID(n1->GetID(),
506 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
507 const SMDS_MeshNode * n2,
508 const SMDS_MeshNode * n3,
509 const SMDS_MeshNode * n4,
510 const SMDS_MeshNode * n5)
512 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5);
513 if(anElem) myScript->AddVolume(anElem->GetID(),
522 //=======================================================================
523 //function :AddVolume
525 //=======================================================================
526 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int ID)
528 SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID);
529 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6);
533 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
534 const SMDS_MeshNode * n2,
535 const SMDS_MeshNode * n3,
536 const SMDS_MeshNode * n4,
537 const SMDS_MeshNode * n5,
538 const SMDS_MeshNode * n6,
541 return AddVolumeWithID(n1->GetID(),
550 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
551 const SMDS_MeshNode * n2,
552 const SMDS_MeshNode * n3,
553 const SMDS_MeshNode * n4,
554 const SMDS_MeshNode * n5,
555 const SMDS_MeshNode * n6)
557 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6);
558 if(anElem) myScript->AddVolume(anElem->GetID(),
568 //=======================================================================
569 //function :AddVolume
571 //=======================================================================
572 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int ID)
574 SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID);
575 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8);
579 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
580 const SMDS_MeshNode * n2,
581 const SMDS_MeshNode * n3,
582 const SMDS_MeshNode * n4,
583 const SMDS_MeshNode * n5,
584 const SMDS_MeshNode * n6,
585 const SMDS_MeshNode * n7,
586 const SMDS_MeshNode * n8,
589 return AddVolumeWithID(n1->GetID(),
600 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
601 const SMDS_MeshNode * n2,
602 const SMDS_MeshNode * n3,
603 const SMDS_MeshNode * n4,
604 const SMDS_MeshNode * n5,
605 const SMDS_MeshNode * n6,
606 const SMDS_MeshNode * n7,
607 const SMDS_MeshNode * n8)
609 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8);
610 if(anElem) myScript->AddVolume(anElem->GetID(),
623 //=======================================================================
624 //function :AddVolume
625 //purpose : add hexagonal prism
626 //=======================================================================
627 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
628 int n5, int n6, int n7, int n8,
629 int n9, int n10, int n11, int n12,
632 SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, ID);
633 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
637 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
638 const SMDS_MeshNode * n2,
639 const SMDS_MeshNode * n3,
640 const SMDS_MeshNode * n4,
641 const SMDS_MeshNode * n5,
642 const SMDS_MeshNode * n6,
643 const SMDS_MeshNode * n7,
644 const SMDS_MeshNode * n8,
645 const SMDS_MeshNode * n9,
646 const SMDS_MeshNode * n10,
647 const SMDS_MeshNode * n11,
648 const SMDS_MeshNode * n12,
651 return AddVolumeWithID(n1->GetID(),
666 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
667 const SMDS_MeshNode * n2,
668 const SMDS_MeshNode * n3,
669 const SMDS_MeshNode * n4,
670 const SMDS_MeshNode * n5,
671 const SMDS_MeshNode * n6,
672 const SMDS_MeshNode * n7,
673 const SMDS_MeshNode * n8,
674 const SMDS_MeshNode * n9,
675 const SMDS_MeshNode * n10,
676 const SMDS_MeshNode * n11,
677 const SMDS_MeshNode * n12)
679 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
680 if(anElem) myScript->AddVolume(anElem->GetID(),
697 //=======================================================================
698 //function : AddPolygonalFace
700 //=======================================================================
701 SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID (const std::vector<int>& nodes_ids,
704 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes_ids, ID);
706 myScript->AddPolygonalFace(ID, nodes_ids);
711 SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID
712 (const std::vector<const SMDS_MeshNode*>& nodes,
715 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID);
717 int i, len = nodes.size();
718 std::vector<int> nodes_ids (len);
719 for (i = 0; i < len; i++) {
720 nodes_ids[i] = nodes[i]->GetID();
722 myScript->AddPolygonalFace(ID, nodes_ids);
727 SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFace
728 (const std::vector<const SMDS_MeshNode*>& nodes)
730 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFace(nodes);
732 int i, len = nodes.size();
733 std::vector<int> nodes_ids (len);
734 for (i = 0; i < len; i++) {
735 nodes_ids[i] = nodes[i]->GetID();
737 myScript->AddPolygonalFace(anElem->GetID(), nodes_ids);
742 //=======================================================================
743 //function : AddPolyhedralVolume
745 //=======================================================================
746 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID (const std::vector<int>& nodes_ids,
747 const std::vector<int>& quantities,
750 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes_ids, quantities, ID);
752 myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
757 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID
758 (const std::vector<const SMDS_MeshNode*>& nodes,
759 const std::vector<int>& quantities,
762 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
764 int i, len = nodes.size();
765 std::vector<int> nodes_ids (len);
766 for (i = 0; i < len; i++) {
767 nodes_ids[i] = nodes[i]->GetID();
769 myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
774 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolume
775 (const std::vector<const SMDS_MeshNode*>& nodes,
776 const std::vector<int>& quantities)
778 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolume(nodes, quantities);
780 int i, len = nodes.size();
781 std::vector<int> nodes_ids (len);
782 for (i = 0; i < len; i++) {
783 nodes_ids[i] = nodes[i]->GetID();
785 myScript->AddPolyhedralVolume(anElem->GetID(), nodes_ids, quantities);
790 //=======================================================================
791 //function : removeFromContainers
793 //=======================================================================
795 static void removeFromContainers (SMESHDS_Mesh* theMesh,
796 set<SMESHDS_GroupBase*>& theGroups,
797 list<const SMDS_MeshElement*>& theElems,
800 if ( theElems.empty() )
804 // Element can belong to several groups
805 if ( !theGroups.empty() )
807 set<SMESHDS_GroupBase*>::iterator GrIt = theGroups.begin();
808 for ( ; GrIt != theGroups.end(); GrIt++ )
810 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>( *GrIt );
811 if ( !group || group->IsEmpty() ) continue;
813 list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
814 for ( ; elIt != theElems.end(); elIt++ )
816 group->SMDSGroup().Remove( *elIt );
817 if ( group->IsEmpty() ) break;
822 const bool deleted=true;
824 // Rm from sub-meshes
825 // Element should belong to only one sub-mesh
826 if ( theMesh->SubMeshes()->more() )
828 list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
830 for ( ; elIt != theElems.end(); ++elIt )
831 if ( SMESHDS_SubMesh* sm = theMesh->MeshElements( (*elIt)->getshapeId() ))
832 sm->RemoveNode( static_cast<const SMDS_MeshNode*> (*elIt), deleted );
835 for ( ; elIt != theElems.end(); ++elIt )
836 if ( SMESHDS_SubMesh* sm = theMesh->MeshElements( (*elIt)->getshapeId() ))
837 sm->RemoveElement( *elIt, deleted );
842 //=======================================================================
843 //function : RemoveNode
845 //=======================================================================
846 void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n)
848 if ( n->NbInverseElements() == 0 && !(hasConstructionEdges() || hasConstructionFaces()))
850 SMESHDS_SubMesh* subMesh = MeshElements( n->getshapeId() );
851 SMESHDS_SubMeshIteratorPtr subIt;
854 for ( ; !subMesh && subIt->more(); ) {
855 subMesh = const_cast< SMESHDS_SubMesh* >( subIt->next() );
856 if ( subMesh->IsComplexSubmesh() || !subMesh->Contains( n ))
859 RemoveFreeNode( n, subMesh, true);
863 myScript->RemoveNode(n->GetID());
865 list<const SMDS_MeshElement *> removedElems;
866 list<const SMDS_MeshElement *> removedNodes;
868 SMDS_Mesh::RemoveElement( n, removedElems, removedNodes, true );
870 removeFromContainers( this, myGroups, removedElems, false );
871 removeFromContainers( this, myGroups, removedNodes, true );
874 //=======================================================================
875 //function : RemoveFreeNode
877 //=======================================================================
878 void SMESHDS_Mesh::RemoveFreeNode(const SMDS_MeshNode * n,
879 SMESHDS_SubMesh * subMesh,
882 myScript->RemoveNode(n->GetID());
885 // Node can belong to several groups
886 if (fromGroups && !myGroups.empty()) {
887 set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
888 for (; GrIt != myGroups.end(); GrIt++) {
889 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
890 if (group && !group->IsEmpty())
891 group->SMDSGroup().Remove(n);
896 // Node should belong to only one sub-mesh
897 if ( !subMesh || !subMesh->RemoveNode(n,/*deleted=*/false))
898 if (( subMesh = MeshElements( n->getshapeId() )))
899 subMesh->RemoveNode(n,/*deleted=*/false );
901 SMDS_Mesh::RemoveFreeElement(n);
904 //=======================================================================
905 //function : RemoveElement
907 //========================================================================
908 void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt)
910 if (elt->GetType() == SMDSAbs_Node)
912 RemoveNode( static_cast<const SMDS_MeshNode*>( elt ));
915 if (!hasConstructionEdges() && !hasConstructionFaces())
917 SMESHDS_SubMesh* subMesh=0;
918 if ( elt->getshapeId() > 0 )
919 subMesh = MeshElements( elt->getshapeId() );
921 RemoveFreeElement( elt, subMesh, true);
925 myScript->RemoveElement(elt->GetID());
927 list<const SMDS_MeshElement *> removedElems;
928 list<const SMDS_MeshElement *> removedNodes;
930 SMDS_Mesh::RemoveElement(elt, removedElems, removedNodes, false);
932 removeFromContainers( this, myGroups, removedElems, false );
935 //=======================================================================
936 //function : RemoveFreeElement
938 //========================================================================
939 void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt,
940 SMESHDS_SubMesh * subMesh,
943 //MESSAGE(" --------------------------------> SMESHDS_Mesh::RemoveFreeElement " << subMesh << " " << fromGroups);
944 if (elt->GetType() == SMDSAbs_Node) {
945 RemoveFreeNode( static_cast<const SMDS_MeshNode*>(elt), subMesh);
949 if (hasConstructionEdges() || hasConstructionFaces())
950 // this methods is only for meshes without descendants
953 myScript->RemoveElement(elt->GetID());
956 // Node can belong to several groups
957 if ( fromGroups && !myGroups.empty() ) {
958 set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
959 for (; GrIt != myGroups.end(); GrIt++) {
960 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
961 if (group && !group->IsEmpty())
962 group->SMDSGroup().Remove(elt);
967 // Element should belong to only one sub-mesh
969 subMesh->RemoveElement(elt, /*deleted=*/false);
971 SMDS_Mesh::RemoveFreeElement(elt);
974 //================================================================================
976 * \brief Remove all data from the mesh
978 //================================================================================
980 void SMESHDS_Mesh::ClearMesh()
982 myScript->ClearMesh();
986 SMESHDS_SubMeshIteratorPtr smIt = SubMeshes();
987 while ( SMESHDS_SubMesh* sm = const_cast< SMESHDS_SubMesh* >( smIt->next() ))
991 TGroups::iterator group, groupEnd = myGroups.end();
992 for ( group = myGroups.begin(); group != groupEnd; ++group ) {
993 if ( SMESHDS_Group* g = dynamic_cast<SMESHDS_Group*>(*group)) {
994 SMDSAbs_ElementType groupType = g->GetType();
996 g->SetType( groupType );
1000 (*group)->Extent(); // to free cashed elements in GroupOnFilter's
1005 //================================================================================
1007 * \brief return submesh by shape
1008 * \param shape - the sub-shape
1009 * \retval SMESHDS_SubMesh* - the found submesh
1011 //================================================================================
1013 SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const TopoDS_Shape & shape )
1015 if ( shape.IsNull() )
1018 return NewSubMesh( ShapeToIndex( shape ));
1021 //================================================================================
1023 * \brief Add element or node to submesh
1024 * \param elem - element to add
1025 * \param subMesh - submesh to be filled in
1027 //================================================================================
1029 bool SMESHDS_Mesh::add(const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh )
1031 if ( elem && subMesh ) {
1032 if ( elem->GetType() == SMDSAbs_Node )
1033 subMesh->AddNode( static_cast<const SMDS_MeshNode* >( elem ));
1035 subMesh->AddElement( elem );
1041 //=======================================================================
1042 //function : SetNodeOnVolume
1044 //=======================================================================
1045 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode,
1046 const TopoDS_Shell & S)
1048 if ( add( aNode, getSubmesh(S) ))
1049 const_cast< SMDS_MeshNode* >
1050 ( aNode )->SetPosition( SMDS_SpacePosition::originSpacePosition() );
1053 //=======================================================================
1054 //function : SetNodeOnVolume
1056 //=======================================================================
1057 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode * aNode,
1058 const TopoDS_Solid & S)
1060 if ( add( aNode, getSubmesh(S) ))
1061 const_cast< SMDS_MeshNode* >
1062 ( aNode )->SetPosition( SMDS_SpacePosition::originSpacePosition() );
1065 //=======================================================================
1066 //function : SetNodeOnFace
1068 //=======================================================================
1069 void SMESHDS_Mesh::SetNodeOnFace(const SMDS_MeshNode * aNode,
1070 const TopoDS_Face & S,
1074 if ( add( aNode, getSubmesh(S) ))
1075 const_cast< SMDS_MeshNode* >
1076 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition( u, v)));
1079 //=======================================================================
1080 //function : SetNodeOnEdge
1082 //=======================================================================
1083 void SMESHDS_Mesh::SetNodeOnEdge(const SMDS_MeshNode * aNode,
1084 const TopoDS_Edge & S,
1087 if ( add( aNode, getSubmesh(S) ))
1088 const_cast< SMDS_MeshNode* >
1089 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(u)));
1092 //=======================================================================
1093 //function : SetNodeOnVertex
1095 //=======================================================================
1096 void SMESHDS_Mesh::SetNodeOnVertex(const SMDS_MeshNode * aNode,
1097 const TopoDS_Vertex & S)
1099 if ( add( aNode, getSubmesh(S) ))
1100 const_cast< SMDS_MeshNode* >
1101 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition()));
1104 //=======================================================================
1105 //function : UnSetNodeOnShape
1107 //=======================================================================
1108 void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode)
1110 int shapeId = aNode->getshapeId();
1112 if ( SMESHDS_SubMesh* sm = MeshElements( shapeId ))
1113 sm->RemoveNode(aNode, /*deleted=*/false);
1116 //=======================================================================
1117 //function : SetMeshElementOnShape
1119 //=======================================================================
1120 void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement * anElement,
1121 const TopoDS_Shape & S)
1123 add( anElement, getSubmesh(S) );
1126 //=======================================================================
1127 //function : UnSetMeshElementOnShape
1129 //=======================================================================
1130 void SMESHDS_Mesh::UnSetMeshElementOnShape(const SMDS_MeshElement * elem,
1131 const TopoDS_Shape & S)
1133 if ( SMESHDS_SubMesh* sm = MeshElements( S ))
1135 if (elem->GetType() == SMDSAbs_Node)
1136 sm->RemoveNode(static_cast<const SMDS_MeshNode*> (elem), /*deleted=*/false);
1138 sm->RemoveElement(elem, /*deleted=*/false);
1142 //=======================================================================
1143 //function : ShapeToMesh
1145 //=======================================================================
1146 TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() const
1151 //=======================================================================
1152 //function : IsGroupOfSubShapes
1153 //purpose : return true if at least one sub-shape of theShape is a sub-shape
1154 // of myShape or theShape == myShape
1155 //=======================================================================
1157 bool SMESHDS_Mesh::IsGroupOfSubShapes (const TopoDS_Shape& theShape) const
1159 if ( myIndexToShape.Contains(theShape) )
1162 for ( TopoDS_Iterator it( theShape ); it.More(); it.Next() )
1163 if (IsGroupOfSubShapes( it.Value() ))
1169 ///////////////////////////////////////////////////////////////////////////////
1170 /// Return the sub mesh linked to the a given TopoDS_Shape or NULL if the given
1171 /// TopoDS_Shape is unknown
1172 ///////////////////////////////////////////////////////////////////////////////
1173 SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const
1175 int Index = ShapeToIndex(S);
1176 return (SMESHDS_SubMesh *) ( Index ? mySubMeshHolder->Get( Index ) : 0 );
1179 ///////////////////////////////////////////////////////////////////////////////
1180 /// Return the sub mesh by Id of shape it is linked to
1181 ///////////////////////////////////////////////////////////////////////////////
1182 SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index) const
1184 return const_cast< SMESHDS_SubMesh* >( mySubMeshHolder->Get( Index ));
1187 //=======================================================================
1188 //function : SubMeshIndices
1190 //=======================================================================
1191 list<int> SMESHDS_Mesh::SubMeshIndices() const
1193 list<int> anIndices;
1194 SMESHDS_SubMeshIteratorPtr smIt = SubMeshes();
1195 while ( const SMESHDS_SubMesh* sm = smIt->next() )
1196 anIndices.push_back( sm->GetID() );
1201 //=======================================================================
1202 //function : SubMeshes
1204 //=======================================================================
1206 SMESHDS_SubMeshIteratorPtr SMESHDS_Mesh::SubMeshes() const
1208 return SMESHDS_SubMeshIteratorPtr( mySubMeshHolder->GetIterator() );
1211 //=======================================================================
1212 //function : GetHypothesis
1214 //=======================================================================
1216 const list<const SMESHDS_Hypothesis*>&
1217 SMESHDS_Mesh::GetHypothesis(const TopoDS_Shape & S) const
1219 if ( myShapeToHypothesis.IsBound( S/*.Oriented(TopAbs_FORWARD)*/ ) ) // ignore orientation of S
1220 return myShapeToHypothesis.Find( S/*.Oriented(TopAbs_FORWARD)*/ );
1222 static list<const SMESHDS_Hypothesis*> empty;
1226 //================================================================================
1228 * \brief returns true if the hypothesis is assigned to any sub-shape
1230 //================================================================================
1232 bool SMESHDS_Mesh::IsUsedHypothesis(const SMESHDS_Hypothesis * H) const
1234 ShapeToHypothesis::Iterator s2h( myShapeToHypothesis );
1235 for ( ; s2h.More(); s2h.Next() )
1236 if ( std::find( s2h.Value().begin(), s2h.Value().end(), H ) != s2h.Value().end() )
1241 //=======================================================================
1242 //function : GetScript
1244 //=======================================================================
1245 SMESHDS_Script* SMESHDS_Mesh::GetScript()
1250 //=======================================================================
1251 //function : ClearScript
1253 //=======================================================================
1254 void SMESHDS_Mesh::ClearScript()
1259 //=======================================================================
1260 //function : HasMeshElements
1262 //=======================================================================
1263 bool SMESHDS_Mesh::HasMeshElements(const TopoDS_Shape & S) const
1265 int Index = myIndexToShape.FindIndex(S);
1266 return mySubMeshHolder->Get( Index );
1269 //=======================================================================
1270 //function : HasHypothesis
1272 //=======================================================================
1273 bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S)
1275 return myShapeToHypothesis.IsBound(S/*.Oriented(TopAbs_FORWARD)*/);
1278 //=======================================================================
1279 //function : NewSubMesh
1281 //=======================================================================
1282 SMESHDS_SubMesh * SMESHDS_Mesh::NewSubMesh(int Index)
1284 SMESHDS_SubMesh* SM = MeshElements( Index );
1287 SM = new SMESHDS_SubMesh(this, Index);
1288 mySubMeshHolder->Add( Index, SM );
1293 //=======================================================================
1294 //function : AddCompoundSubmesh
1296 //=======================================================================
1298 int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S,
1299 TopAbs_ShapeEnum type)
1302 if ( IsGroupOfSubShapes( S ))
1304 aMainIndex = myIndexToShape.Add( S );
1305 bool all = ( type == TopAbs_SHAPE );
1306 if ( all ) // corresponding simple submesh may exist
1307 aMainIndex = -aMainIndex;
1308 //MESSAGE("AddCompoundSubmesh index = " << aMainIndex );
1309 SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex );
1310 if ( !aNewSub->IsComplexSubmesh() ) // is empty
1312 int shapeType = Max( TopAbs_SOLID, all ? myShape.ShapeType() : type );
1313 int typeLimit = all ? TopAbs_VERTEX : type;
1314 for ( ; shapeType <= typeLimit; shapeType++ )
1316 TopExp_Explorer exp( S, TopAbs_ShapeEnum( shapeType ));
1317 for ( ; exp.More(); exp.Next() )
1319 int index = myIndexToShape.FindIndex( exp.Current() );
1321 aNewSub->AddSubMesh( NewSubMesh( index ));
1329 //=======================================================================
1330 //function : IndexToShape
1332 //=======================================================================
1333 const TopoDS_Shape& SMESHDS_Mesh::IndexToShape(int ShapeIndex) const
1337 if ( ShapeIndex > 0 )
1338 return myIndexToShape.FindKey(ShapeIndex);
1340 catch ( Standard_OutOfRange )
1343 static TopoDS_Shape nullShape;
1347 //================================================================================
1349 * \brief Return max index of sub-mesh
1351 //================================================================================
1353 int SMESHDS_Mesh::MaxSubMeshIndex() const
1355 return mySubMeshHolder->GetMaxID();
1358 //=======================================================================
1359 //function : ShapeToIndex
1361 //=======================================================================
1362 int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const
1364 if (myShape.IsNull())
1365 MESSAGE("myShape is NULL");
1367 int index = myIndexToShape.FindIndex(S);
1372 //=======================================================================
1373 //function : SetNodeOnVolume
1375 //=======================================================================
1376 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index)
1378 if ( add( aNode, NewSubMesh( Index )))
1379 ((SMDS_MeshNode*) aNode)->SetPosition( SMDS_SpacePosition::originSpacePosition());
1382 //=======================================================================
1383 //function : SetNodeOnFace
1385 //=======================================================================
1386 void SMESHDS_Mesh::SetNodeOnFace(const SMDS_MeshNode* aNode, int Index, double u, double v)
1388 //Set Position on Node
1389 if ( add( aNode, NewSubMesh( Index )))
1390 const_cast< SMDS_MeshNode* >
1391 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition( u, v)));
1394 //=======================================================================
1395 //function : SetNodeOnEdge
1397 //=======================================================================
1398 void SMESHDS_Mesh::SetNodeOnEdge(const SMDS_MeshNode* aNode,
1402 //Set Position on Node
1403 if ( add( aNode, NewSubMesh( Index )))
1404 const_cast< SMDS_MeshNode* >
1405 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(u)));
1408 //=======================================================================
1409 //function : SetNodeOnVertex
1411 //=======================================================================
1412 void SMESHDS_Mesh::SetNodeOnVertex(const SMDS_MeshNode* aNode, int Index)
1414 //Set Position on Node
1415 if ( add( aNode, NewSubMesh( Index )))
1416 const_cast< SMDS_MeshNode* >
1417 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition()));
1420 //=======================================================================
1421 //function : SetMeshElementOnShape
1423 //=======================================================================
1424 void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement,
1427 add( anElement, NewSubMesh( Index ));
1430 //=======================================================================
1431 //function : ~SMESHDS_Mesh
1433 //=======================================================================
1434 SMESHDS_Mesh::~SMESHDS_Mesh()
1439 delete mySubMeshHolder;
1443 //********************************************************************
1444 //********************************************************************
1445 //******** *********
1446 //***** Methods for addition of quadratic elements ******
1447 //******** *********
1448 //********************************************************************
1449 //********************************************************************
1451 //=======================================================================
1452 //function : AddEdgeWithID
1454 //=======================================================================
1455 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int n12, int ID)
1457 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,n12,ID);
1458 if(anElem) myScript->AddEdge(ID,n1,n2,n12);
1462 //=======================================================================
1463 //function : AddEdge
1465 //=======================================================================
1466 SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode* n1,
1467 const SMDS_MeshNode* n2,
1468 const SMDS_MeshNode* n12)
1470 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2,n12);
1471 if(anElem) myScript->AddEdge(anElem->GetID(),
1478 //=======================================================================
1479 //function : AddEdgeWithID
1481 //=======================================================================
1482 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
1483 const SMDS_MeshNode * n2,
1484 const SMDS_MeshNode * n12,
1487 return AddEdgeWithID(n1->GetID(),
1494 //=======================================================================
1495 //function : AddFace
1497 //=======================================================================
1498 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1499 const SMDS_MeshNode * n2,
1500 const SMDS_MeshNode * n3,
1501 const SMDS_MeshNode * n12,
1502 const SMDS_MeshNode * n23,
1503 const SMDS_MeshNode * n31)
1505 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31);
1506 if(anElem) myScript->AddFace(anElem->GetID(),
1507 n1->GetID(), n2->GetID(), n3->GetID(),
1508 n12->GetID(), n23->GetID(), n31->GetID());
1512 //=======================================================================
1513 //function : AddFaceWithID
1515 //=======================================================================
1516 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3,
1517 int n12,int n23,int n31, int ID)
1519 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,ID);
1520 if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31);
1524 //=======================================================================
1525 //function : AddFaceWithID
1527 //=======================================================================
1528 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1529 const SMDS_MeshNode * n2,
1530 const SMDS_MeshNode * n3,
1531 const SMDS_MeshNode * n12,
1532 const SMDS_MeshNode * n23,
1533 const SMDS_MeshNode * n31,
1536 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1537 n12->GetID(), n23->GetID(), n31->GetID(),
1541 //=======================================================================
1542 //function : AddFace
1544 //=======================================================================
1545 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1546 const SMDS_MeshNode * n2,
1547 const SMDS_MeshNode * n3,
1548 const SMDS_MeshNode * n12,
1549 const SMDS_MeshNode * n23,
1550 const SMDS_MeshNode * n31,
1551 const SMDS_MeshNode * nCenter)
1553 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31,nCenter);
1554 if(anElem) myScript->AddFace(anElem->GetID(),
1555 n1->GetID(), n2->GetID(), n3->GetID(),
1556 n12->GetID(), n23->GetID(), n31->GetID(),
1561 //=======================================================================
1562 //function : AddFaceWithID
1564 //=======================================================================
1565 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3,
1566 int n12,int n23,int n31, int nCenter, int ID)
1568 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,nCenter,ID);
1569 if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31,nCenter);
1573 //=======================================================================
1574 //function : AddFaceWithID
1576 //=======================================================================
1577 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1578 const SMDS_MeshNode * n2,
1579 const SMDS_MeshNode * n3,
1580 const SMDS_MeshNode * n12,
1581 const SMDS_MeshNode * n23,
1582 const SMDS_MeshNode * n31,
1583 const SMDS_MeshNode * nCenter,
1586 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1587 n12->GetID(), n23->GetID(), n31->GetID(),
1588 nCenter->GetID(), ID);
1592 //=======================================================================
1593 //function : AddFace
1595 //=======================================================================
1596 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1597 const SMDS_MeshNode * n2,
1598 const SMDS_MeshNode * n3,
1599 const SMDS_MeshNode * n4,
1600 const SMDS_MeshNode * n12,
1601 const SMDS_MeshNode * n23,
1602 const SMDS_MeshNode * n34,
1603 const SMDS_MeshNode * n41)
1605 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41);
1606 if(anElem) myScript->AddFace(anElem->GetID(),
1607 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1608 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID());
1612 //=======================================================================
1613 //function : AddFaceWithID
1615 //=======================================================================
1616 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4,
1617 int n12,int n23,int n34,int n41, int ID)
1619 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,ID);
1620 if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41);
1624 //=======================================================================
1625 //function : AddFaceWithID
1627 //=======================================================================
1628 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1629 const SMDS_MeshNode * n2,
1630 const SMDS_MeshNode * n3,
1631 const SMDS_MeshNode * n4,
1632 const SMDS_MeshNode * n12,
1633 const SMDS_MeshNode * n23,
1634 const SMDS_MeshNode * n34,
1635 const SMDS_MeshNode * n41,
1638 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1639 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1644 //=======================================================================
1645 //function : AddFace
1647 //=======================================================================
1648 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1649 const SMDS_MeshNode * n2,
1650 const SMDS_MeshNode * n3,
1651 const SMDS_MeshNode * n4,
1652 const SMDS_MeshNode * n12,
1653 const SMDS_MeshNode * n23,
1654 const SMDS_MeshNode * n34,
1655 const SMDS_MeshNode * n41,
1656 const SMDS_MeshNode * nCenter)
1658 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
1659 if(anElem) myScript->AddFace(anElem->GetID(),
1660 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1661 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1666 //=======================================================================
1667 //function : AddFaceWithID
1669 //=======================================================================
1670 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4,
1671 int n12,int n23,int n34,int n41,
1672 int nCenter, int ID)
1674 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,nCenter,ID);
1675 if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
1679 //=======================================================================
1680 //function : AddFaceWithID
1682 //=======================================================================
1683 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1684 const SMDS_MeshNode * n2,
1685 const SMDS_MeshNode * n3,
1686 const SMDS_MeshNode * n4,
1687 const SMDS_MeshNode * n12,
1688 const SMDS_MeshNode * n23,
1689 const SMDS_MeshNode * n34,
1690 const SMDS_MeshNode * n41,
1691 const SMDS_MeshNode * nCenter,
1694 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1695 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1696 nCenter->GetID(), ID);
1700 //=======================================================================
1701 //function : AddVolume
1703 //=======================================================================
1704 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1705 const SMDS_MeshNode * n2,
1706 const SMDS_MeshNode * n3,
1707 const SMDS_MeshNode * n4,
1708 const SMDS_MeshNode * n12,
1709 const SMDS_MeshNode * n23,
1710 const SMDS_MeshNode * n31,
1711 const SMDS_MeshNode * n14,
1712 const SMDS_MeshNode * n24,
1713 const SMDS_MeshNode * n34)
1715 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1716 if(anElem) myScript->AddVolume(anElem->GetID(),
1717 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1718 n12->GetID(), n23->GetID(), n31->GetID(),
1719 n14->GetID(), n24->GetID(), n34->GetID());
1723 //=======================================================================
1724 //function : AddVolumeWithID
1726 //=======================================================================
1727 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
1728 int n12,int n23,int n31,
1729 int n14,int n24,int n34, int ID)
1731 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n12,n23,
1732 n31,n14,n24,n34,ID);
1733 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1737 //=======================================================================
1738 //function : AddVolumeWithID
1739 //purpose : 2d order tetrahedron of 10 nodes
1740 //=======================================================================
1741 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1742 const SMDS_MeshNode * n2,
1743 const SMDS_MeshNode * n3,
1744 const SMDS_MeshNode * n4,
1745 const SMDS_MeshNode * n12,
1746 const SMDS_MeshNode * n23,
1747 const SMDS_MeshNode * n31,
1748 const SMDS_MeshNode * n14,
1749 const SMDS_MeshNode * n24,
1750 const SMDS_MeshNode * n34,
1753 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1754 n12->GetID(), n23->GetID(), n31->GetID(),
1755 n14->GetID(), n24->GetID(), n34->GetID(), ID);
1759 //=======================================================================
1760 //function : AddVolume
1762 //=======================================================================
1763 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1764 const SMDS_MeshNode * n2,
1765 const SMDS_MeshNode * n3,
1766 const SMDS_MeshNode * n4,
1767 const SMDS_MeshNode * n5,
1768 const SMDS_MeshNode * n12,
1769 const SMDS_MeshNode * n23,
1770 const SMDS_MeshNode * n34,
1771 const SMDS_MeshNode * n41,
1772 const SMDS_MeshNode * n15,
1773 const SMDS_MeshNode * n25,
1774 const SMDS_MeshNode * n35,
1775 const SMDS_MeshNode * n45)
1777 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n12,n23,n34,n41,
1780 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1781 n3->GetID(), n4->GetID(), n5->GetID(),
1782 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1783 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID());
1787 //=======================================================================
1788 //function : AddVolumeWithID
1790 //=======================================================================
1791 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5,
1792 int n12,int n23,int n34,int n41,
1793 int n15,int n25,int n35,int n45, int ID)
1795 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,
1797 n15,n25,n35,n45,ID);
1798 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n12,n23,n34,n41,
1803 //=======================================================================
1804 //function : AddVolumeWithID
1805 //purpose : 2d order pyramid of 13 nodes
1806 //=======================================================================
1807 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(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,
1822 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1823 n4->GetID(), n5->GetID(),
1824 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1825 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID(),
1830 //=======================================================================
1831 //function : AddVolume
1833 //=======================================================================
1834 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1835 const SMDS_MeshNode * n2,
1836 const SMDS_MeshNode * n3,
1837 const SMDS_MeshNode * n4,
1838 const SMDS_MeshNode * n5,
1839 const SMDS_MeshNode * n6,
1840 const SMDS_MeshNode * n12,
1841 const SMDS_MeshNode * n23,
1842 const SMDS_MeshNode * n31,
1843 const SMDS_MeshNode * n45,
1844 const SMDS_MeshNode * n56,
1845 const SMDS_MeshNode * n64,
1846 const SMDS_MeshNode * n14,
1847 const SMDS_MeshNode * n25,
1848 const SMDS_MeshNode * n36)
1850 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n12,n23,n31,
1851 n45,n56,n64,n14,n25,n36);
1853 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1854 n3->GetID(), n4->GetID(), n5->GetID(), n6->GetID(),
1855 n12->GetID(), n23->GetID(), n31->GetID(),
1856 n45->GetID(), n56->GetID(), n64->GetID(),
1857 n14->GetID(), n25->GetID(), n36->GetID());
1861 //=======================================================================
1862 //function : AddVolumeWithID
1864 //=======================================================================
1865 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3,
1866 int n4, int n5, int n6,
1867 int n12,int n23,int n31,
1868 int n45,int n56,int n64,
1869 int n14,int n25,int n36, int ID)
1871 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,
1875 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n12,n23,n31,
1876 n45,n56,n64,n14,n25,n36);
1880 //=======================================================================
1881 //function : AddVolumeWithID
1882 //purpose : 2d order Pentahedron with 15 nodes
1883 //=======================================================================
1884 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1885 const SMDS_MeshNode * n2,
1886 const SMDS_MeshNode * n3,
1887 const SMDS_MeshNode * n4,
1888 const SMDS_MeshNode * n5,
1889 const SMDS_MeshNode * n6,
1890 const SMDS_MeshNode * n12,
1891 const SMDS_MeshNode * n23,
1892 const SMDS_MeshNode * n31,
1893 const SMDS_MeshNode * n45,
1894 const SMDS_MeshNode * n56,
1895 const SMDS_MeshNode * n64,
1896 const SMDS_MeshNode * n14,
1897 const SMDS_MeshNode * n25,
1898 const SMDS_MeshNode * n36,
1901 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1902 n4->GetID(), n5->GetID(), n6->GetID(),
1903 n12->GetID(), n23->GetID(), n31->GetID(),
1904 n45->GetID(), n56->GetID(), n64->GetID(),
1905 n14->GetID(), n25->GetID(), n36->GetID(),
1910 //=======================================================================
1911 //function : AddVolume
1912 //purpose : add quadratic hexahedron
1913 //=======================================================================
1914 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1915 const SMDS_MeshNode * n2,
1916 const SMDS_MeshNode * n3,
1917 const SMDS_MeshNode * n4,
1918 const SMDS_MeshNode * n5,
1919 const SMDS_MeshNode * n6,
1920 const SMDS_MeshNode * n7,
1921 const SMDS_MeshNode * n8,
1922 const SMDS_MeshNode * n12,
1923 const SMDS_MeshNode * n23,
1924 const SMDS_MeshNode * n34,
1925 const SMDS_MeshNode * n41,
1926 const SMDS_MeshNode * n56,
1927 const SMDS_MeshNode * n67,
1928 const SMDS_MeshNode * n78,
1929 const SMDS_MeshNode * n85,
1930 const SMDS_MeshNode * n15,
1931 const SMDS_MeshNode * n26,
1932 const SMDS_MeshNode * n37,
1933 const SMDS_MeshNode * n48)
1935 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
1940 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1941 n3->GetID(), n4->GetID(), n5->GetID(),
1942 n6->GetID(), n7->GetID(), n8->GetID(),
1943 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1944 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
1945 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID());
1949 //=======================================================================
1950 //function : AddVolumeWithID
1952 //=======================================================================
1953 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
1954 int n5, int n6, int n7, int n8,
1955 int n12,int n23,int n34,int n41,
1956 int n56,int n67,int n78,int n85,
1957 int n15,int n26,int n37,int n48, int ID)
1959 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
1962 n15,n26,n37,n48,ID);
1963 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
1964 n56,n67,n78,n85,n15,n26,n37,n48);
1968 //=======================================================================
1969 //function : AddVolumeWithID
1970 //purpose : 2d order Hexahedrons with 20 nodes
1971 //=======================================================================
1972 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1973 const SMDS_MeshNode * n2,
1974 const SMDS_MeshNode * n3,
1975 const SMDS_MeshNode * n4,
1976 const SMDS_MeshNode * n5,
1977 const SMDS_MeshNode * n6,
1978 const SMDS_MeshNode * n7,
1979 const SMDS_MeshNode * n8,
1980 const SMDS_MeshNode * n12,
1981 const SMDS_MeshNode * n23,
1982 const SMDS_MeshNode * n34,
1983 const SMDS_MeshNode * n41,
1984 const SMDS_MeshNode * n56,
1985 const SMDS_MeshNode * n67,
1986 const SMDS_MeshNode * n78,
1987 const SMDS_MeshNode * n85,
1988 const SMDS_MeshNode * n15,
1989 const SMDS_MeshNode * n26,
1990 const SMDS_MeshNode * n37,
1991 const SMDS_MeshNode * n48,
1994 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1995 n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
1996 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1997 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
1998 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2002 //=======================================================================
2003 //function : AddVolume
2004 //purpose : add tri-quadratic hexahedron of 27 nodes
2005 //=======================================================================
2007 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2008 const SMDS_MeshNode * n2,
2009 const SMDS_MeshNode * n3,
2010 const SMDS_MeshNode * n4,
2011 const SMDS_MeshNode * n5,
2012 const SMDS_MeshNode * n6,
2013 const SMDS_MeshNode * n7,
2014 const SMDS_MeshNode * n8,
2015 const SMDS_MeshNode * n12,
2016 const SMDS_MeshNode * n23,
2017 const SMDS_MeshNode * n34,
2018 const SMDS_MeshNode * n41,
2019 const SMDS_MeshNode * n56,
2020 const SMDS_MeshNode * n67,
2021 const SMDS_MeshNode * n78,
2022 const SMDS_MeshNode * n85,
2023 const SMDS_MeshNode * n15,
2024 const SMDS_MeshNode * n26,
2025 const SMDS_MeshNode * n37,
2026 const SMDS_MeshNode * n48,
2027 const SMDS_MeshNode * n1234,
2028 const SMDS_MeshNode * n1256,
2029 const SMDS_MeshNode * n2367,
2030 const SMDS_MeshNode * n3478,
2031 const SMDS_MeshNode * n1458,
2032 const SMDS_MeshNode * n5678,
2033 const SMDS_MeshNode * nCenter)
2035 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
2039 n1234,n1256,n2367,n3478,n1458,n5678,nCenter);
2041 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
2042 n3->GetID(), n4->GetID(), n5->GetID(),
2043 n6->GetID(), n7->GetID(), n8->GetID(),
2044 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2045 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2046 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2047 n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
2048 n1458->GetID(),n5678->GetID(),nCenter->GetID());
2052 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
2053 int n5, int n6, int n7, int n8,
2054 int n12,int n23,int n34,int n41,
2055 int n56,int n67,int n78,int n85,
2056 int n15,int n26,int n37,int n48,
2057 int n1234,int n1256,int n2367,int n3478,
2058 int n1458,int n5678,int nCenter,
2061 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
2065 n1234, n1256, n2367, n3478,
2066 n1458, n5678, nCenter,
2068 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
2069 n56,n67,n78,n85,n15,n26,n37,n48,
2070 n1234, n1256, n2367, n3478,
2071 n1458, n5678, nCenter);
2075 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2076 const SMDS_MeshNode * n2,
2077 const SMDS_MeshNode * n3,
2078 const SMDS_MeshNode * n4,
2079 const SMDS_MeshNode * n5,
2080 const SMDS_MeshNode * n6,
2081 const SMDS_MeshNode * n7,
2082 const SMDS_MeshNode * n8,
2083 const SMDS_MeshNode * n12,
2084 const SMDS_MeshNode * n23,
2085 const SMDS_MeshNode * n34,
2086 const SMDS_MeshNode * n41,
2087 const SMDS_MeshNode * n56,
2088 const SMDS_MeshNode * n67,
2089 const SMDS_MeshNode * n78,
2090 const SMDS_MeshNode * n85,
2091 const SMDS_MeshNode * n15,
2092 const SMDS_MeshNode * n26,
2093 const SMDS_MeshNode * n37,
2094 const SMDS_MeshNode * n48,
2095 const SMDS_MeshNode * n1234,
2096 const SMDS_MeshNode * n1256,
2097 const SMDS_MeshNode * n2367,
2098 const SMDS_MeshNode * n3478,
2099 const SMDS_MeshNode * n1458,
2100 const SMDS_MeshNode * n5678,
2101 const SMDS_MeshNode * nCenter,
2104 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
2105 n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
2106 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2107 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2108 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2109 n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
2110 n1458->GetID(),n5678->GetID(),nCenter->GetID(), ID);
2113 void SMESHDS_Mesh::compactMesh()
2115 int newNodeSize = 0;
2116 int nbNodes = myNodes.size();
2117 int nbVtkNodes = myGrid->GetNumberOfPoints();
2118 MESSAGE("nbNodes=" << nbNodes << " nbVtkNodes=" << nbVtkNodes);
2119 int nbNodeTemp = nbVtkNodes;
2120 if (nbNodes > nbVtkNodes)
2121 nbNodeTemp = nbNodes;
2122 vector<int> idNodesOldToNew;
2123 idNodesOldToNew.clear();
2124 idNodesOldToNew.resize(nbNodeTemp, -1); // all unused id will be -1
2126 for (int i = 0; i < nbNodes; i++)
2130 int vtkid = myNodes[i]->getVtkId();
2131 idNodesOldToNew[vtkid] = i; // old vtkId --> old smdsId (valid smdsId are >= 0)
2135 bool areNodesModified = (newNodeSize < nbVtkNodes);
2136 MESSAGE("------------------------- compactMesh Nodes Modified: " << areNodesModified);
2137 areNodesModified = true;
2139 int newCellSize = 0;
2140 int nbCells = myCells.size();
2141 int nbVtkCells = myGrid->GetNumberOfCells();
2142 MESSAGE("nbCells=" << nbCells << " nbVtkCells=" << nbVtkCells);
2143 int nbCellTemp = nbVtkCells;
2144 if (nbCells > nbVtkCells)
2145 nbCellTemp = nbCells;
2146 vector<int> idCellsOldToNew;
2147 idCellsOldToNew.clear();
2148 idCellsOldToNew.resize(nbCellTemp, -1); // all unused id will be -1
2150 for (int i = 0; i < nbCells; i++)
2154 // //idCellsOldToNew[i] = myCellIdVtkToSmds[i]; // valid vtk indexes are > = 0
2155 // int vtkid = myCells[i]->getVtkId();
2156 // idCellsOldToNew[vtkid] = i; // old vtkId --> old smdsId (not used in input)
2160 if (areNodesModified)
2161 myGrid->compactGrid(idNodesOldToNew, newNodeSize, idCellsOldToNew, newCellSize);
2163 myGrid->compactGrid(idNodesOldToNew, 0, idCellsOldToNew, newCellSize);
2165 int nbVtkPts = myGrid->GetNumberOfPoints();
2166 nbVtkCells = myGrid->GetNumberOfCells();
2167 if (nbVtkPts != newNodeSize)
2169 MESSAGE("===> nbVtkPts != newNodeSize " << nbVtkPts << " " << newNodeSize);
2170 if (nbVtkPts > newNodeSize) newNodeSize = nbVtkPts; // several points with same SMDS Id
2172 if (nbVtkCells != newCellSize)
2174 MESSAGE("===> nbVtkCells != newCellSize " << nbVtkCells << " " << newCellSize);
2175 if (nbVtkCells > newCellSize) newCellSize = nbVtkCells; // several cells with same SMDS Id
2178 // --- SMDS_MeshNode and myNodes (id in SMDS and in VTK are the same), myNodeIdFactory
2180 if (areNodesModified)
2182 MESSAGE("-------------- modify myNodes");
2183 SetOfNodes newNodes;
2184 newNodes.resize(newNodeSize+1,0); // 0 not used, SMDS numbers 1..n
2186 for (int i = 0; i < nbNodes; i++)
2190 newSmdsId++; // SMDS id start to 1
2191 int oldVtkId = myNodes[i]->getVtkId();
2192 int newVtkId = idNodesOldToNew[oldVtkId];
2193 //MESSAGE("myNodes["<< i << "] vtkId " << oldVtkId << " --> " << newVtkId);
2194 myNodes[i]->setVtkId(newVtkId);
2195 myNodes[i]->setId(newSmdsId);
2196 newNodes[newSmdsId] = myNodes[i];
2197 //MESSAGE("myNodes["<< i << "] --> newNodes[" << newSmdsId << "]");
2200 myNodes.swap(newNodes);
2201 this->myNodeIDFactory->emptyPool(newSmdsId); // newSmdsId = number of nodes
2202 MESSAGE("myNodes.size " << myNodes.size());
2205 // --- SMDS_MeshCell, myCellIdVtkToSmds, myCellIdSmdsToVtk, myCells
2207 int vtkIndexSize = myCellIdVtkToSmds.size();
2209 for (int oldVtkId = 0; oldVtkId < vtkIndexSize; oldVtkId++)
2211 int oldSmdsId = this->myCellIdVtkToSmds[oldVtkId];
2214 int newVtkId = idCellsOldToNew[oldVtkId];
2215 if (newVtkId > maxVtkId)
2216 maxVtkId = newVtkId;
2217 //MESSAGE("myCells["<< oldSmdsId << "] vtkId " << oldVtkId << " --> " << newVtkId);
2218 myCells[oldSmdsId]->setVtkId(newVtkId);
2221 // MESSAGE("myCells.size()=" << myCells.size()
2222 // << " myCellIdSmdsToVtk.size()=" << myCellIdSmdsToVtk.size()
2223 // << " myCellIdVtkToSmds.size()=" << myCellIdVtkToSmds.size() );
2225 SetOfCells newCells;
2226 //vector<int> newSmdsToVtk;
2227 vector<int> newVtkToSmds;
2229 assert(maxVtkId < newCellSize);
2230 newCells.resize(newCellSize+1, 0); // 0 not used, SMDS numbers 1..n
2231 //newSmdsToVtk.resize(newCellSize+1, -1);
2232 newVtkToSmds.resize(newCellSize+1, -1);
2234 int myCellsSize = myCells.size();
2236 for (int i = 0; i < myCellsSize; i++)
2240 newSmdsId++; // SMDS id start to 1
2241 assert(newSmdsId <= newCellSize);
2242 newCells[newSmdsId] = myCells[i];
2243 newCells[newSmdsId]->setId(newSmdsId);
2244 //MESSAGE("myCells["<< i << "] --> newCells[" << newSmdsId << "]");
2245 int idvtk = myCells[i]->getVtkId();
2246 //newSmdsToVtk[newSmdsId] = idvtk;
2247 assert(idvtk < newCellSize);
2248 newVtkToSmds[idvtk] = newSmdsId;
2252 myCells.swap(newCells);
2253 //myCellIdSmdsToVtk.swap(newSmdsToVtk);
2254 myCellIdVtkToSmds.swap(newVtkToSmds);
2255 MESSAGE("myCells.size()=" << myCells.size()
2256 << " myCellIdVtkToSmds.size()=" << myCellIdVtkToSmds.size() );
2257 this->myElementIDFactory->emptyPool(newSmdsId);
2259 this->myScript->SetModified(true); // notify GUI client for buildPrs when update
2261 // --- compact list myNodes and myElements in submeshes
2263 SMESHDS_SubMeshIteratorPtr smIt = SubMeshes();
2264 while ( SMESHDS_SubMesh* sm = const_cast< SMESHDS_SubMesh* >( smIt->next() ))
2268 void SMESHDS_Mesh::CleanDownWardConnectivity()
2270 myGrid->CleanDownwardConnectivity();
2273 void SMESHDS_Mesh::BuildDownWardConnectivity(bool withEdges)
2275 myGrid->BuildDownwardConnectivity(withEdges);
2278 /*! change some nodes in cell without modifying type or internal connectivity.
2279 * Nodes inverse connectivity is maintained up to date.
2280 * @param vtkVolId vtk id of the cell.
2281 * @param localClonedNodeIds map old node id to new node id.
2282 * @return ok if success.
2284 bool SMESHDS_Mesh::ModifyCellNodes(int vtkVolId, std::map<int,int> localClonedNodeIds)
2286 myGrid->ModifyCellNodes(vtkVolId, localClonedNodeIds);