1 // SMESH SMESHDS : management of mesh data and SMESH document
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
24 // File : SMESH_Mesh.cxx
25 // Author : Yves FRICAUD, OCC
29 #include "SMESHDS_Mesh.hxx"
31 #include "SMESHDS_Group.hxx"
32 #include "SMDS_VertexPosition.hxx"
33 #include "SMDS_EdgePosition.hxx"
34 #include "SMDS_FacePosition.hxx"
35 #include "SMDS_SpacePosition.hxx"
36 #include "SMESHDS_GroupOnGeom.hxx"
38 #include <TopExp_Explorer.hxx>
40 #include <TopoDS_Iterator.hxx>
42 #include "utilities.h"
46 /*Standard_Boolean IsEqual( const TopoDS_Shape& S1, const TopoDS_Shape& S2 )
48 return S1.IsSame( S2 );
51 //=======================================================================
54 //=======================================================================
55 SMESHDS_Mesh::SMESHDS_Mesh(int theMeshID, bool theIsEmbeddedMode):
57 myIsEmbeddedMode(theIsEmbeddedMode),
60 myScript = new SMESHDS_Script(theIsEmbeddedMode);
64 //=======================================================================
65 bool SMESHDS_Mesh::IsEmbeddedMode()
67 return myIsEmbeddedMode;
70 //=======================================================================
71 //function : ShapeToMesh
73 //=======================================================================
74 void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S)
76 if ( !myShape.IsNull() && S.IsNull() )
78 // removal of a shape to mesh, delete ...
80 myShapeToHypothesis.Clear();
81 // - shape indices in SMDS_Position of nodes
82 map<int,SMESHDS_SubMesh*>::iterator i_sub = myShapeIndexToSubMesh.begin();
83 for ( ; i_sub != myShapeIndexToSubMesh.end(); i_sub++ ) {
84 if ( !i_sub->second->IsComplexSubmesh() ) {
85 SMDS_NodeIteratorPtr nIt = i_sub->second->GetNodes();
87 nIt->next()->GetPosition()->SetShapeId( 0 );
91 myIndexToShape.Clear();
92 myShapeIndexToSubMesh.clear();
93 // - groups on geometry
94 set<SMESHDS_GroupBase*>::iterator gr = myGroups.begin();
95 while ( gr != myGroups.end() ) {
96 if ( dynamic_cast<SMESHDS_GroupOnGeom*>( *gr ))
97 myGroups.erase( gr++ );
105 TopExp::MapShapes(myShape, myIndexToShape);
109 //=======================================================================
110 //function : AddHypothesis
112 //=======================================================================
114 bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS,
115 const SMESHDS_Hypothesis * H)
117 if (!myShapeToHypothesis.IsBound(SS.Oriented(TopAbs_FORWARD))) {
118 list<const SMESHDS_Hypothesis *> aList;
119 myShapeToHypothesis.Bind(SS.Oriented(TopAbs_FORWARD), aList);
121 list<const SMESHDS_Hypothesis *>& alist =
122 myShapeToHypothesis(SS.Oriented(TopAbs_FORWARD)); // ignore orientation of SS
124 //Check if the Hypothesis is still present
125 list<const SMESHDS_Hypothesis*>::iterator ith = find(alist.begin(),alist.end(), H );
127 if (alist.end() != ith) return false;
133 //=======================================================================
134 //function : RemoveHypothesis
136 //=======================================================================
138 bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S,
139 const SMESHDS_Hypothesis * H)
141 if( myShapeToHypothesis.IsBound( S.Oriented(TopAbs_FORWARD) ) )
143 list<const SMESHDS_Hypothesis *>& alist=myShapeToHypothesis.ChangeFind( S.Oriented(TopAbs_FORWARD) );
144 list<const SMESHDS_Hypothesis*>::iterator ith=find(alist.begin(),alist.end(), H );
145 if (ith != alist.end())
154 //=======================================================================
157 //=======================================================================
158 SMDS_MeshNode* SMESHDS_Mesh::AddNode(double x, double y, double z){
159 SMDS_MeshNode* node = SMDS_Mesh::AddNode(x, y, z);
160 if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
164 SMDS_MeshNode* SMESHDS_Mesh::AddNodeWithID(double x, double y, double z, int ID){
165 SMDS_MeshNode* node = SMDS_Mesh::AddNodeWithID(x,y,z,ID);
166 if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
170 //=======================================================================
171 //function : MoveNode
173 //=======================================================================
174 void SMESHDS_Mesh::MoveNode(const SMDS_MeshNode *n, double x, double y, double z)
176 SMDS_MeshNode * node=const_cast<SMDS_MeshNode*>(n);
178 myScript->MoveNode(n->GetID(), x, y, z);
181 //=======================================================================
182 //function : ChangeElementNodes
184 //=======================================================================
186 bool SMESHDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem,
187 const SMDS_MeshNode * nodes[],
190 if ( ! SMDS_Mesh::ChangeElementNodes( elem, nodes, nbnodes ))
193 vector<int> IDs( nbnodes );
194 for ( int i = 0; i < nbnodes; i++ )
195 IDs [ i ] = nodes[ i ]->GetID();
196 myScript->ChangeElementNodes( elem->GetID(), &IDs[0], nbnodes);
201 //=======================================================================
202 //function : ChangePolygonNodes
204 //=======================================================================
205 bool SMESHDS_Mesh::ChangePolygonNodes
206 (const SMDS_MeshElement * elem,
207 vector<const SMDS_MeshNode*> nodes)
209 ASSERT(nodes.size() > 3);
211 return ChangeElementNodes(elem, &nodes[0], nodes.size());
214 //=======================================================================
215 //function : ChangePolyhedronNodes
217 //=======================================================================
218 bool SMESHDS_Mesh::ChangePolyhedronNodes
219 (const SMDS_MeshElement * elem,
220 std::vector<const SMDS_MeshNode*> nodes,
221 std::vector<int> quantities)
223 ASSERT(nodes.size() > 3);
225 if (!SMDS_Mesh::ChangePolyhedronNodes(elem, nodes, quantities))
228 int i, len = nodes.size();
229 std::vector<int> nodes_ids (len);
230 for (i = 0; i < len; i++) {
231 nodes_ids[i] = nodes[i]->GetID();
233 myScript->ChangePolyhedronNodes(elem->GetID(), nodes_ids, quantities);
238 //=======================================================================
239 //function : Renumber
241 //=======================================================================
243 void SMESHDS_Mesh::Renumber (const bool isNodes, const int startID, const int deltaID)
245 SMDS_Mesh::Renumber( isNodes, startID, deltaID );
246 myScript->Renumber( isNodes, startID, deltaID );
249 //=======================================================================
250 //function :AddEdgeWithID
252 //=======================================================================
253 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int ID)
255 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,ID);
256 if(anElem) myScript->AddEdge(ID,n1,n2);
260 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
261 const SMDS_MeshNode * n2,
264 return AddEdgeWithID(n1->GetID(),
269 SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode * n1,
270 const SMDS_MeshNode * n2)
272 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2);
273 if(anElem) myScript->AddEdge(anElem->GetID(),
279 //=======================================================================
282 //=======================================================================
283 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int ID)
285 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, ID);
286 if(anElem) myScript->AddFace(ID,n1,n2,n3);
290 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
291 const SMDS_MeshNode * n2,
292 const SMDS_MeshNode * n3,
295 return AddFaceWithID(n1->GetID(),
301 SMDS_MeshFace* SMESHDS_Mesh::AddFace( const SMDS_MeshNode * n1,
302 const SMDS_MeshNode * n2,
303 const SMDS_MeshNode * n3)
305 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3);
306 if(anElem) myScript->AddFace(anElem->GetID(),
313 //=======================================================================
316 //=======================================================================
317 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4, int ID)
319 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, n4, ID);
320 if(anElem) myScript->AddFace(ID, n1, n2, n3, n4);
324 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
325 const SMDS_MeshNode * n2,
326 const SMDS_MeshNode * n3,
327 const SMDS_MeshNode * n4,
330 return AddFaceWithID(n1->GetID(),
337 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
338 const SMDS_MeshNode * n2,
339 const SMDS_MeshNode * n3,
340 const SMDS_MeshNode * n4)
342 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3, n4);
343 if(anElem) myScript->AddFace(anElem->GetID(),
351 //=======================================================================
352 //function :AddVolume
354 //=======================================================================
355 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int ID)
357 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID);
358 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4);
362 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
363 const SMDS_MeshNode * n2,
364 const SMDS_MeshNode * n3,
365 const SMDS_MeshNode * n4,
368 return AddVolumeWithID(n1->GetID(),
375 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
376 const SMDS_MeshNode * n2,
377 const SMDS_MeshNode * n3,
378 const SMDS_MeshNode * n4)
380 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4);
381 if(anElem) myScript->AddVolume(anElem->GetID(),
389 //=======================================================================
390 //function :AddVolume
392 //=======================================================================
393 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int ID)
395 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID);
396 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5);
400 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
401 const SMDS_MeshNode * n2,
402 const SMDS_MeshNode * n3,
403 const SMDS_MeshNode * n4,
404 const SMDS_MeshNode * n5,
407 return AddVolumeWithID(n1->GetID(),
415 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
416 const SMDS_MeshNode * n2,
417 const SMDS_MeshNode * n3,
418 const SMDS_MeshNode * n4,
419 const SMDS_MeshNode * n5)
421 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5);
422 if(anElem) myScript->AddVolume(anElem->GetID(),
431 //=======================================================================
432 //function :AddVolume
434 //=======================================================================
435 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int ID)
437 SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID);
438 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6);
442 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
443 const SMDS_MeshNode * n2,
444 const SMDS_MeshNode * n3,
445 const SMDS_MeshNode * n4,
446 const SMDS_MeshNode * n5,
447 const SMDS_MeshNode * n6,
450 return AddVolumeWithID(n1->GetID(),
459 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
460 const SMDS_MeshNode * n2,
461 const SMDS_MeshNode * n3,
462 const SMDS_MeshNode * n4,
463 const SMDS_MeshNode * n5,
464 const SMDS_MeshNode * n6)
466 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6);
467 if(anElem) myScript->AddVolume(anElem->GetID(),
477 //=======================================================================
478 //function :AddVolume
480 //=======================================================================
481 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int ID)
483 SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID);
484 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8);
488 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
489 const SMDS_MeshNode * n2,
490 const SMDS_MeshNode * n3,
491 const SMDS_MeshNode * n4,
492 const SMDS_MeshNode * n5,
493 const SMDS_MeshNode * n6,
494 const SMDS_MeshNode * n7,
495 const SMDS_MeshNode * n8,
498 return AddVolumeWithID(n1->GetID(),
509 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
510 const SMDS_MeshNode * n2,
511 const SMDS_MeshNode * n3,
512 const SMDS_MeshNode * n4,
513 const SMDS_MeshNode * n5,
514 const SMDS_MeshNode * n6,
515 const SMDS_MeshNode * n7,
516 const SMDS_MeshNode * n8)
518 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8);
519 if(anElem) myScript->AddVolume(anElem->GetID(),
531 //=======================================================================
532 //function : AddPolygonalFace
534 //=======================================================================
535 SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID (std::vector<int> nodes_ids,
538 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes_ids, ID);
540 myScript->AddPolygonalFace(ID, nodes_ids);
545 SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID
546 (std::vector<const SMDS_MeshNode*> nodes,
549 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID);
551 int i, len = nodes.size();
552 std::vector<int> nodes_ids (len);
553 for (i = 0; i < len; i++) {
554 nodes_ids[i] = nodes[i]->GetID();
556 myScript->AddPolygonalFace(ID, nodes_ids);
561 SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFace
562 (std::vector<const SMDS_MeshNode*> nodes)
564 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFace(nodes);
566 int i, len = nodes.size();
567 std::vector<int> nodes_ids (len);
568 for (i = 0; i < len; i++) {
569 nodes_ids[i] = nodes[i]->GetID();
571 myScript->AddPolygonalFace(anElem->GetID(), nodes_ids);
576 //=======================================================================
577 //function : AddPolyhedralVolume
579 //=======================================================================
580 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID (std::vector<int> nodes_ids,
581 std::vector<int> quantities,
584 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes_ids, quantities, ID);
586 myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
591 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID
592 (std::vector<const SMDS_MeshNode*> nodes,
593 std::vector<int> quantities,
596 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
598 int i, len = nodes.size();
599 std::vector<int> nodes_ids (len);
600 for (i = 0; i < len; i++) {
601 nodes_ids[i] = nodes[i]->GetID();
603 myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
608 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolume
609 (std::vector<const SMDS_MeshNode*> nodes,
610 std::vector<int> quantities)
612 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolume(nodes, quantities);
614 int i, len = nodes.size();
615 std::vector<int> nodes_ids (len);
616 for (i = 0; i < len; i++) {
617 nodes_ids[i] = nodes[i]->GetID();
619 myScript->AddPolyhedralVolume(anElem->GetID(), nodes_ids, quantities);
624 //=======================================================================
625 //function : removeFromContainers
627 //=======================================================================
629 static void removeFromContainers (map<int,SMESHDS_SubMesh*>& theSubMeshes,
630 set<SMESHDS_GroupBase*>& theGroups,
631 list<const SMDS_MeshElement*>& theElems,
634 if ( theElems.empty() )
638 // Element can belong to several groups
639 if ( !theGroups.empty() )
641 set<SMESHDS_GroupBase*>::iterator GrIt = theGroups.begin();
642 for ( ; GrIt != theGroups.end(); GrIt++ )
644 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>( *GrIt );
645 if ( !group || group->IsEmpty() ) continue;
647 list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
648 for ( ; elIt != theElems.end(); elIt++ )
650 group->SMDSGroup().Remove( *elIt );
651 if ( group->IsEmpty() ) break;
656 // Rm from sub-meshes
657 // Element should belong to only one sub-mesh
658 map<int,SMESHDS_SubMesh*>::iterator SubIt = theSubMeshes.begin();
659 for ( ; SubIt != theSubMeshes.end(); SubIt++ )
661 int size = isNode ? (*SubIt).second->NbNodes() : (*SubIt).second->NbElements();
662 if ( size == 0 ) continue;
664 list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
665 while ( elIt != theElems.end() )
667 bool removed = false;
669 removed = (*SubIt).second->RemoveNode( static_cast<const SMDS_MeshNode*> (*elIt) );
671 removed = (*SubIt).second->RemoveElement( *elIt );
675 elIt = theElems.erase( elIt );
676 if ( theElems.empty() )
677 return; // all elements are found and removed
687 //=======================================================================
688 //function : RemoveNode
690 //=======================================================================
691 void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n)
693 myScript->RemoveNode(n->GetID());
695 list<const SMDS_MeshElement *> removedElems;
696 list<const SMDS_MeshElement *> removedNodes;
698 SMDS_Mesh::RemoveElement( n, removedElems, removedNodes, true );
700 removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false );
701 removeFromContainers( myShapeIndexToSubMesh, myGroups, removedNodes, true );
704 //=======================================================================
705 //function : RemoveFreeNode
707 //=======================================================================
708 void SMESHDS_Mesh::RemoveFreeNode(const SMDS_MeshNode * n, SMESHDS_SubMesh * subMesh)
710 myScript->RemoveNode(n->GetID());
713 // Node can belong to several groups
714 if (!myGroups.empty()) {
715 set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
716 for (; GrIt != myGroups.end(); GrIt++) {
717 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
718 if (!group || group->IsEmpty()) continue;
719 group->SMDSGroup().Remove(n);
724 // Node should belong to only one sub-mesh
726 subMesh->RemoveNode(n);
728 SMDS_Mesh::RemoveFreeElement(n);
731 //=======================================================================
732 //function : RemoveElement
734 //========================================================================
735 void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt)
737 if (elt->GetType() == SMDSAbs_Node)
739 RemoveNode( static_cast<const SMDS_MeshNode*>( elt ));
743 myScript->RemoveElement(elt->GetID());
745 list<const SMDS_MeshElement *> removedElems;
746 list<const SMDS_MeshElement *> removedNodes;
748 SMDS_Mesh::RemoveElement(elt, removedElems, removedNodes, false);
750 removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false );
753 //=======================================================================
754 //function : RemoveFreeElement
756 //========================================================================
757 void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt, SMESHDS_SubMesh * subMesh)
759 if (elt->GetType() == SMDSAbs_Node) {
760 RemoveFreeNode( static_cast<const SMDS_MeshNode*>(elt), subMesh);
764 if (hasConstructionEdges() || hasConstructionFaces())
765 // this methods is only for meshes without descendants
768 myScript->RemoveElement(elt->GetID());
771 // Node can belong to several groups
772 set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
773 for (; GrIt != myGroups.end(); GrIt++) {
774 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
775 if (group && !group->IsEmpty())
776 group->SMDSGroup().Remove(elt);
780 // Element should belong to only one sub-mesh
782 subMesh->RemoveElement(elt);
784 SMDS_Mesh::RemoveFreeElement(elt);
787 //================================================================================
789 * \brief Remove all data from the mesh
791 //================================================================================
793 void SMESHDS_Mesh::ClearMesh()
795 myScript->ClearMesh();
799 map<int,SMESHDS_SubMesh*>::iterator sub, subEnd = myShapeIndexToSubMesh.end();
800 for ( sub = myShapeIndexToSubMesh.begin(); sub != subEnd; ++sub )
801 sub->second->Clear();
804 TGroups::iterator group, groupEnd = myGroups.end();
805 for ( group = myGroups.begin(); group != groupEnd; ++group ) {
806 if ( SMESHDS_Group* g = dynamic_cast<SMESHDS_Group*>(*group)) {
807 SMDSAbs_ElementType groupType = g->GetType();
809 g->SetType( groupType );
814 //================================================================================
816 * \brief return submesh by shape
817 * \param shape - the subshape
818 * \retval SMESHDS_SubMesh* - the found submesh
820 * search of submeshes is optimized
822 //================================================================================
824 SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const TopoDS_Shape & shape )
826 if ( shape.IsNull() )
829 if ( !myCurSubShape.IsNull() && shape.IsSame( myCurSubShape ))
832 getSubmesh( ShapeToIndex( shape ));
833 myCurSubShape = shape;
837 //================================================================================
839 * \brief return submesh by subshape index
840 * \param Index - the subshape index
841 * \retval SMESHDS_SubMesh* - the found submesh
842 * search of submeshes is optimized
844 //================================================================================
846 SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const int Index )
848 //Update or build submesh
849 if ( Index != myCurSubID ) {
850 map<int,SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.find( Index );
851 if ( it == myShapeIndexToSubMesh.end() )
852 it = myShapeIndexToSubMesh.insert( make_pair(Index, new SMESHDS_SubMesh() )).first;
853 myCurSubMesh = it->second;
855 myCurSubShape.Nullify(); // myCurSubShape no more corresponds to submesh
860 //================================================================================
862 * \brief Add element or node to submesh
863 * \param elem - element to add
864 * \param subMesh - submesh to be filled in
866 //================================================================================
868 bool SMESHDS_Mesh::add(const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh )
870 if ( elem && subMesh ) {
871 if ( elem->GetType() == SMDSAbs_Node )
872 subMesh->AddNode( static_cast<const SMDS_MeshNode* >( elem ));
874 subMesh->AddElement( elem );
882 //================================================================================
884 * \brief Creates a node position in volume
886 //================================================================================
888 inline SMDS_PositionPtr volumePosition(int volId)
890 SMDS_SpacePosition* pos = new SMDS_SpacePosition();
891 pos->SetShapeId( volId );
892 return SMDS_PositionPtr(pos);
896 //=======================================================================
897 //function : SetNodeOnVolume
899 //=======================================================================
900 void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode,
901 const TopoDS_Shell & S)
903 if ( add( aNode, getSubmesh(S) ))
904 aNode->SetPosition ( volumePosition( myCurSubID ));
906 //=======================================================================
907 //function : SetNodeOnVolume
909 //=======================================================================
910 void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode,
911 const TopoDS_Solid & S)
913 if ( add( aNode, getSubmesh(S) ))
914 aNode->SetPosition ( volumePosition( myCurSubID ));
917 //=======================================================================
918 //function : SetNodeOnFace
920 //=======================================================================
921 void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode * aNode,
922 const TopoDS_Face & S,
926 if ( add( aNode, getSubmesh(S) ))
927 aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(myCurSubID, u, v)));
930 //=======================================================================
931 //function : SetNodeOnEdge
933 //=======================================================================
934 void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode * aNode,
935 const TopoDS_Edge & S,
938 if ( add( aNode, getSubmesh(S) ))
939 aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(myCurSubID, u)));
942 //=======================================================================
943 //function : SetNodeOnVertex
945 //=======================================================================
946 void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode * aNode,
947 const TopoDS_Vertex & S)
949 if ( add( aNode, getSubmesh(S) ))
950 aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(myCurSubID)));
953 //=======================================================================
954 //function : UnSetNodeOnShape
956 //=======================================================================
957 void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode)
959 if ( aNode && aNode->GetPosition() ) {
960 map<int,SMESHDS_SubMesh*>::iterator it =
961 myShapeIndexToSubMesh.find( aNode->GetPosition()->GetShapeId() );
962 if ( it != myShapeIndexToSubMesh.end() )
963 it->second->RemoveNode( aNode );
967 //=======================================================================
968 //function : SetMeshElementOnShape
970 //=======================================================================
971 void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement * anElement,
972 const TopoDS_Shape & S)
974 add( anElement, getSubmesh(S) );
977 //=======================================================================
978 //function : UnSetMeshElementOnShape
980 //=======================================================================
981 void SMESHDS_Mesh::UnSetMeshElementOnShape(const SMDS_MeshElement * elem,
982 const TopoDS_Shape & S)
984 int Index = myIndexToShape.FindIndex(S);
986 map<int,SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.find( Index );
987 if ( it != myShapeIndexToSubMesh.end() )
988 if ( elem->GetType() == SMDSAbs_Node )
989 it->second->RemoveNode( static_cast<const SMDS_MeshNode* >( elem ));
991 it->second->RemoveElement( elem );
994 //=======================================================================
995 //function : ShapeToMesh
997 //=======================================================================
998 TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() const
1003 //=======================================================================
1004 //function : IsGroupOfSubShapes
1005 //purpose : return true if at least one subshape of theShape is a subshape
1006 // of myShape or theShape == myShape
1007 //=======================================================================
1009 bool SMESHDS_Mesh::IsGroupOfSubShapes (const TopoDS_Shape& theShape) const
1011 if ( myShape.IsSame( theShape ))
1014 for ( TopoDS_Iterator it( theShape ); it.More(); it.Next() ) {
1015 if (myIndexToShape.Contains( it.Value() ) ||
1016 IsGroupOfSubShapes( it.Value() ))
1023 ///////////////////////////////////////////////////////////////////////////////
1024 /// Return the sub mesh linked to the a given TopoDS_Shape or NULL if the given
1025 /// TopoDS_Shape is unknown
1026 ///////////////////////////////////////////////////////////////////////////////
1027 SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const
1029 int Index = ShapeToIndex(S);
1030 TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index);
1031 if (anIter != myShapeIndexToSubMesh.end())
1032 return anIter->second;
1037 ///////////////////////////////////////////////////////////////////////////////
1038 /// Return the sub mesh by Id of shape it is linked to
1039 ///////////////////////////////////////////////////////////////////////////////
1040 SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index)
1042 TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index);
1043 if (anIter != myShapeIndexToSubMesh.end())
1044 return anIter->second;
1049 //=======================================================================
1050 //function : SubMeshIndices
1052 //=======================================================================
1053 list<int> SMESHDS_Mesh::SubMeshIndices()
1055 list<int> anIndices;
1056 std::map<int,SMESHDS_SubMesh*>::iterator anIter = myShapeIndexToSubMesh.begin();
1057 for (; anIter != myShapeIndexToSubMesh.end(); anIter++) {
1058 anIndices.push_back((*anIter).first);
1063 //=======================================================================
1064 //function : GetHypothesis
1066 //=======================================================================
1068 const list<const SMESHDS_Hypothesis*>&
1069 SMESHDS_Mesh::GetHypothesis(const TopoDS_Shape & S) const
1071 if ( myShapeToHypothesis.IsBound( S.Oriented(TopAbs_FORWARD) ) ) // ignore orientation of S
1072 return myShapeToHypothesis.Find( S.Oriented(TopAbs_FORWARD) );
1074 static list<const SMESHDS_Hypothesis*> empty;
1078 //=======================================================================
1079 //function : GetScript
1081 //=======================================================================
1082 SMESHDS_Script* SMESHDS_Mesh::GetScript()
1087 //=======================================================================
1088 //function : ClearScript
1090 //=======================================================================
1091 void SMESHDS_Mesh::ClearScript()
1096 //=======================================================================
1097 //function : HasMeshElements
1099 //=======================================================================
1100 bool SMESHDS_Mesh::HasMeshElements(const TopoDS_Shape & S)
1102 if (myShape.IsNull()) MESSAGE("myShape is NULL");
1103 int Index = myIndexToShape.FindIndex(S);
1104 return myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end();
1107 //=======================================================================
1108 //function : HasHypothesis
1110 //=======================================================================
1111 bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S)
1113 return myShapeToHypothesis.IsBound(S.Oriented(TopAbs_FORWARD));
1116 //=======================================================================
1117 //function : NewSubMesh
1119 //=======================================================================
1120 SMESHDS_SubMesh * SMESHDS_Mesh::NewSubMesh(int Index)
1122 SMESHDS_SubMesh* SM = 0;
1123 TShapeIndexToSubMesh::iterator anIter = myShapeIndexToSubMesh.find(Index);
1124 if (anIter == myShapeIndexToSubMesh.end())
1126 SM = new SMESHDS_SubMesh();
1127 myShapeIndexToSubMesh[Index]=SM;
1130 SM = anIter->second;
1134 //=======================================================================
1135 //function : AddCompoundSubmesh
1137 //=======================================================================
1139 int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S,
1140 TopAbs_ShapeEnum type)
1143 if ( IsGroupOfSubShapes( S ) || (S.ShapeType() == TopAbs_VERTEX && myIndexToShape.Contains(S)) )
1145 aMainIndex = myIndexToShape.Add( S );
1146 bool all = ( type == TopAbs_SHAPE );
1147 if ( all ) // corresponding simple submesh may exist
1148 aMainIndex = -aMainIndex;
1149 //MESSAGE("AddCompoundSubmesh index = " << aMainIndex );
1150 SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex );
1151 if ( !aNewSub->IsComplexSubmesh() ) // is empty
1153 int shapeType = all ? myShape.ShapeType() : type;
1154 int typeLimit = all ? TopAbs_VERTEX : type;
1155 for ( ; shapeType <= typeLimit; shapeType++ )
1157 TopExp_Explorer exp( S, TopAbs_ShapeEnum( shapeType ));
1158 for ( ; exp.More(); exp.Next() )
1160 int index = myIndexToShape.FindIndex( exp.Current() );
1162 aNewSub->AddSubMesh( NewSubMesh( index ));
1170 //=======================================================================
1171 //function : IndexToShape
1173 //=======================================================================
1174 const TopoDS_Shape& SMESHDS_Mesh::IndexToShape(int ShapeIndex) const
1176 return myIndexToShape.FindKey(ShapeIndex);
1179 //=======================================================================
1180 //function : ShapeToIndex
1182 //=======================================================================
1183 int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const
1185 if (myShape.IsNull())
1186 MESSAGE("myShape is NULL");
1188 int index = myIndexToShape.FindIndex(S);
1193 //=======================================================================
1194 //function : SetNodeOnVolume
1196 //=======================================================================
1197 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index)
1199 if ( add( aNode, getSubmesh( Index )))
1200 ((SMDS_MeshNode*) aNode)->SetPosition( volumePosition( Index ));
1203 //=======================================================================
1204 //function : SetNodeOnFace
1206 //=======================================================================
1207 void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode* aNode, int Index, double u, double v)
1209 //Set Position on Node
1210 if ( add( aNode, getSubmesh( Index )))
1211 aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(Index, u, v)));
1214 //=======================================================================
1215 //function : SetNodeOnEdge
1217 //=======================================================================
1218 void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode* aNode,
1222 //Set Position on Node
1223 if ( add( aNode, getSubmesh( Index )))
1224 aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(Index, u)));
1227 //=======================================================================
1228 //function : SetNodeOnVertex
1230 //=======================================================================
1231 void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode* aNode, int Index)
1233 //Set Position on Node
1234 if ( add( aNode, getSubmesh( Index )))
1235 aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(Index)));
1238 //=======================================================================
1239 //function : SetMeshElementOnShape
1241 //=======================================================================
1242 void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement,
1245 add( anElement, getSubmesh( Index ));
1248 //=======================================================================
1249 //function : ~SMESHDS_Mesh
1251 //=======================================================================
1252 SMESHDS_Mesh::~SMESHDS_Mesh()
1257 TShapeIndexToSubMesh::iterator i_sm = myShapeIndexToSubMesh.begin();
1258 for ( ; i_sm != myShapeIndexToSubMesh.end(); ++i_sm )
1259 delete i_sm->second;
1263 //********************************************************************
1264 //********************************************************************
1265 //******** *********
1266 //***** Methods for addition of quadratic elements ******
1267 //******** *********
1268 //********************************************************************
1269 //********************************************************************
1271 //=======================================================================
1272 //function : AddEdgeWithID
1274 //=======================================================================
1275 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int n12, int ID)
1277 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,n12,ID);
1278 if(anElem) myScript->AddEdge(ID,n1,n2,n12);
1282 //=======================================================================
1283 //function : AddEdge
1285 //=======================================================================
1286 SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode* n1,
1287 const SMDS_MeshNode* n2,
1288 const SMDS_MeshNode* n12)
1290 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2,n12);
1291 if(anElem) myScript->AddEdge(anElem->GetID(),
1298 //=======================================================================
1299 //function : AddEdgeWithID
1301 //=======================================================================
1302 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
1303 const SMDS_MeshNode * n2,
1304 const SMDS_MeshNode * n12,
1307 return AddEdgeWithID(n1->GetID(),
1314 //=======================================================================
1315 //function : AddFace
1317 //=======================================================================
1318 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1319 const SMDS_MeshNode * n2,
1320 const SMDS_MeshNode * n3,
1321 const SMDS_MeshNode * n12,
1322 const SMDS_MeshNode * n23,
1323 const SMDS_MeshNode * n31)
1325 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31);
1326 if(anElem) myScript->AddFace(anElem->GetID(),
1327 n1->GetID(), n2->GetID(), n3->GetID(),
1328 n12->GetID(), n23->GetID(), n31->GetID());
1332 //=======================================================================
1333 //function : AddFaceWithID
1335 //=======================================================================
1336 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3,
1337 int n12,int n23,int n31, int ID)
1339 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,ID);
1340 if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31);
1344 //=======================================================================
1345 //function : AddFaceWithID
1347 //=======================================================================
1348 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1349 const SMDS_MeshNode * n2,
1350 const SMDS_MeshNode * n3,
1351 const SMDS_MeshNode * n12,
1352 const SMDS_MeshNode * n23,
1353 const SMDS_MeshNode * n31,
1356 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1357 n12->GetID(), n23->GetID(), n31->GetID(),
1362 //=======================================================================
1363 //function : AddFace
1365 //=======================================================================
1366 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1367 const SMDS_MeshNode * n2,
1368 const SMDS_MeshNode * n3,
1369 const SMDS_MeshNode * n4,
1370 const SMDS_MeshNode * n12,
1371 const SMDS_MeshNode * n23,
1372 const SMDS_MeshNode * n34,
1373 const SMDS_MeshNode * n41)
1375 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41);
1376 if(anElem) myScript->AddFace(anElem->GetID(),
1377 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1378 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID());
1382 //=======================================================================
1383 //function : AddFaceWithID
1385 //=======================================================================
1386 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4,
1387 int n12,int n23,int n34,int n41, int ID)
1389 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,ID);
1390 if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41);
1394 //=======================================================================
1395 //function : AddFaceWithID
1397 //=======================================================================
1398 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1399 const SMDS_MeshNode * n2,
1400 const SMDS_MeshNode * n3,
1401 const SMDS_MeshNode * n4,
1402 const SMDS_MeshNode * n12,
1403 const SMDS_MeshNode * n23,
1404 const SMDS_MeshNode * n34,
1405 const SMDS_MeshNode * n41,
1408 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1409 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1414 //=======================================================================
1415 //function : AddVolume
1417 //=======================================================================
1418 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1419 const SMDS_MeshNode * n2,
1420 const SMDS_MeshNode * n3,
1421 const SMDS_MeshNode * n4,
1422 const SMDS_MeshNode * n12,
1423 const SMDS_MeshNode * n23,
1424 const SMDS_MeshNode * n31,
1425 const SMDS_MeshNode * n14,
1426 const SMDS_MeshNode * n24,
1427 const SMDS_MeshNode * n34)
1429 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1430 if(anElem) myScript->AddVolume(anElem->GetID(),
1431 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1432 n12->GetID(), n23->GetID(), n31->GetID(),
1433 n14->GetID(), n24->GetID(), n34->GetID());
1437 //=======================================================================
1438 //function : AddVolumeWithID
1440 //=======================================================================
1441 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
1442 int n12,int n23,int n31,
1443 int n14,int n24,int n34, int ID)
1445 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n12,n23,
1446 n31,n14,n24,n34,ID);
1447 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1451 //=======================================================================
1452 //function : AddVolumeWithID
1453 //purpose : 2d order tetrahedron of 10 nodes
1454 //=======================================================================
1455 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1456 const SMDS_MeshNode * n2,
1457 const SMDS_MeshNode * n3,
1458 const SMDS_MeshNode * n4,
1459 const SMDS_MeshNode * n12,
1460 const SMDS_MeshNode * n23,
1461 const SMDS_MeshNode * n31,
1462 const SMDS_MeshNode * n14,
1463 const SMDS_MeshNode * n24,
1464 const SMDS_MeshNode * n34,
1467 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1468 n12->GetID(), n23->GetID(), n31->GetID(),
1469 n14->GetID(), n24->GetID(), n34->GetID(), ID);
1473 //=======================================================================
1474 //function : AddVolume
1476 //=======================================================================
1477 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1478 const SMDS_MeshNode * n2,
1479 const SMDS_MeshNode * n3,
1480 const SMDS_MeshNode * n4,
1481 const SMDS_MeshNode * n5,
1482 const SMDS_MeshNode * n12,
1483 const SMDS_MeshNode * n23,
1484 const SMDS_MeshNode * n34,
1485 const SMDS_MeshNode * n41,
1486 const SMDS_MeshNode * n15,
1487 const SMDS_MeshNode * n25,
1488 const SMDS_MeshNode * n35,
1489 const SMDS_MeshNode * n45)
1491 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n12,n23,n34,n41,
1494 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1495 n3->GetID(), n4->GetID(), n5->GetID(),
1496 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1497 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID());
1501 //=======================================================================
1502 //function : AddVolumeWithID
1504 //=======================================================================
1505 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5,
1506 int n12,int n23,int n34,int n41,
1507 int n15,int n25,int n35,int n45, int ID)
1509 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,
1511 n15,n25,n35,n45,ID);
1512 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n12,n23,n34,n41,
1517 //=======================================================================
1518 //function : AddVolumeWithID
1519 //purpose : 2d order pyramid of 13 nodes
1520 //=======================================================================
1521 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1522 const SMDS_MeshNode * n2,
1523 const SMDS_MeshNode * n3,
1524 const SMDS_MeshNode * n4,
1525 const SMDS_MeshNode * n5,
1526 const SMDS_MeshNode * n12,
1527 const SMDS_MeshNode * n23,
1528 const SMDS_MeshNode * n34,
1529 const SMDS_MeshNode * n41,
1530 const SMDS_MeshNode * n15,
1531 const SMDS_MeshNode * n25,
1532 const SMDS_MeshNode * n35,
1533 const SMDS_MeshNode * n45,
1536 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1537 n4->GetID(), n5->GetID(),
1538 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1539 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID(),
1544 //=======================================================================
1545 //function : AddVolume
1547 //=======================================================================
1548 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1549 const SMDS_MeshNode * n2,
1550 const SMDS_MeshNode * n3,
1551 const SMDS_MeshNode * n4,
1552 const SMDS_MeshNode * n5,
1553 const SMDS_MeshNode * n6,
1554 const SMDS_MeshNode * n12,
1555 const SMDS_MeshNode * n23,
1556 const SMDS_MeshNode * n31,
1557 const SMDS_MeshNode * n45,
1558 const SMDS_MeshNode * n56,
1559 const SMDS_MeshNode * n64,
1560 const SMDS_MeshNode * n14,
1561 const SMDS_MeshNode * n25,
1562 const SMDS_MeshNode * n36)
1564 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n12,n23,n31,
1565 n45,n56,n64,n14,n25,n36);
1567 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1568 n3->GetID(), n4->GetID(), n5->GetID(), n6->GetID(),
1569 n12->GetID(), n23->GetID(), n31->GetID(),
1570 n45->GetID(), n56->GetID(), n64->GetID(),
1571 n14->GetID(), n25->GetID(), n36->GetID());
1575 //=======================================================================
1576 //function : AddVolumeWithID
1578 //=======================================================================
1579 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3,
1580 int n4, int n5, int n6,
1581 int n12,int n23,int n31,
1582 int n45,int n56,int n64,
1583 int n14,int n25,int n36, int ID)
1585 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,
1589 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n12,n23,n31,
1590 n45,n56,n64,n14,n25,n36);
1594 //=======================================================================
1595 //function : AddVolumeWithID
1596 //purpose : 2d order Pentahedron with 15 nodes
1597 //=======================================================================
1598 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1599 const SMDS_MeshNode * n2,
1600 const SMDS_MeshNode * n3,
1601 const SMDS_MeshNode * n4,
1602 const SMDS_MeshNode * n5,
1603 const SMDS_MeshNode * n6,
1604 const SMDS_MeshNode * n12,
1605 const SMDS_MeshNode * n23,
1606 const SMDS_MeshNode * n31,
1607 const SMDS_MeshNode * n45,
1608 const SMDS_MeshNode * n56,
1609 const SMDS_MeshNode * n64,
1610 const SMDS_MeshNode * n14,
1611 const SMDS_MeshNode * n25,
1612 const SMDS_MeshNode * n36,
1615 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1616 n4->GetID(), n5->GetID(), n6->GetID(),
1617 n12->GetID(), n23->GetID(), n31->GetID(),
1618 n45->GetID(), n56->GetID(), n64->GetID(),
1619 n14->GetID(), n25->GetID(), n36->GetID(),
1624 //=======================================================================
1625 //function : AddVolume
1627 //=======================================================================
1628 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1629 const SMDS_MeshNode * n2,
1630 const SMDS_MeshNode * n3,
1631 const SMDS_MeshNode * n4,
1632 const SMDS_MeshNode * n5,
1633 const SMDS_MeshNode * n6,
1634 const SMDS_MeshNode * n7,
1635 const SMDS_MeshNode * n8,
1636 const SMDS_MeshNode * n12,
1637 const SMDS_MeshNode * n23,
1638 const SMDS_MeshNode * n34,
1639 const SMDS_MeshNode * n41,
1640 const SMDS_MeshNode * n56,
1641 const SMDS_MeshNode * n67,
1642 const SMDS_MeshNode * n78,
1643 const SMDS_MeshNode * n85,
1644 const SMDS_MeshNode * n15,
1645 const SMDS_MeshNode * n26,
1646 const SMDS_MeshNode * n37,
1647 const SMDS_MeshNode * n48)
1649 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
1654 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1655 n3->GetID(), n4->GetID(), n5->GetID(),
1656 n6->GetID(), n7->GetID(), n8->GetID(),
1657 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1658 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
1659 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID());
1663 //=======================================================================
1664 //function : AddVolumeWithID
1666 //=======================================================================
1667 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
1668 int n5, int n6, int n7, int n8,
1669 int n12,int n23,int n34,int n41,
1670 int n56,int n67,int n78,int n85,
1671 int n15,int n26,int n37,int n48, int ID)
1673 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
1676 n15,n26,n37,n48,ID);
1677 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
1678 n56,n67,n78,n85,n15,n26,n37,n48);
1682 //=======================================================================
1683 //function : AddVolumeWithID
1684 //purpose : 2d order Hexahedrons with 20 nodes
1685 //=======================================================================
1686 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1687 const SMDS_MeshNode * n2,
1688 const SMDS_MeshNode * n3,
1689 const SMDS_MeshNode * n4,
1690 const SMDS_MeshNode * n5,
1691 const SMDS_MeshNode * n6,
1692 const SMDS_MeshNode * n7,
1693 const SMDS_MeshNode * n8,
1694 const SMDS_MeshNode * n12,
1695 const SMDS_MeshNode * n23,
1696 const SMDS_MeshNode * n34,
1697 const SMDS_MeshNode * n41,
1698 const SMDS_MeshNode * n56,
1699 const SMDS_MeshNode * n67,
1700 const SMDS_MeshNode * n78,
1701 const SMDS_MeshNode * n85,
1702 const SMDS_MeshNode * n15,
1703 const SMDS_MeshNode * n26,
1704 const SMDS_MeshNode * n37,
1705 const SMDS_MeshNode * n48,
1708 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1709 n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
1710 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1711 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
1712 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),