1 // Copyright (C) 2007-2022 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"
53 class SMESHDS_Mesh::SubMeshHolder : public SMESHDS_TSubMeshHolder< const SMESHDS_SubMesh >
57 //=======================================================================
60 //=======================================================================
61 SMESHDS_Mesh::SMESHDS_Mesh(int theMeshID, bool theIsEmbeddedMode):
62 mySubMeshHolder( new SubMeshHolder ),
63 myIsEmbeddedMode(theIsEmbeddedMode)
65 myScript = new SMESHDS_Script(theIsEmbeddedMode);
67 SetPersistentId(theMeshID);
70 //=======================================================================
71 bool SMESHDS_Mesh::IsEmbeddedMode()
73 return myIsEmbeddedMode;
76 //================================================================================
78 * \brief Store ID persistent during lifecycle
80 * Initially it was used to have a persistent reference to the mesh from the hypothesis
82 //================================================================================
84 void SMESHDS_Mesh::SetPersistentId(int id)
89 //================================================================================
91 * \brief Return ID persistent during lifecycle
93 //================================================================================
95 int SMESHDS_Mesh::GetPersistentId() const
97 return myPersistentID;
100 //=======================================================================
101 //function : ShapeToMesh
103 //=======================================================================
104 void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S)
106 if ( !myShape.IsNull() && S.IsNull() ) // case: "save study" after geometry removal
108 // removal of a shape to mesh, delete ...
110 myShapeToHypothesis.Clear();
111 // - shape indices in SMDS_Position of nodes
112 SMESHDS_SubMeshIteratorPtr smIt = SubMeshes();
113 while ( SMESHDS_SubMesh* sm = const_cast< SMESHDS_SubMesh* >( smIt->next() )) {
114 if ( !sm->IsComplexSubmesh() ) {
115 SMDS_NodeIteratorPtr nIt = sm->GetNodes();
116 while ( nIt->more() )
117 sm->RemoveNode(nIt->next());
121 mySubMeshHolder->DeleteAll();
123 myIndexToShape.Clear();
124 // - groups on geometry
125 std::set<SMESHDS_GroupBase*>::iterator gr = myGroups.begin();
126 while ( gr != myGroups.end() ) {
127 if ( dynamic_cast<SMESHDS_GroupOnGeom*>( *gr ))
128 myGroups.erase( gr++ );
136 TopExp::MapShapes(myShape, myIndexToShape);
139 SMDS_Mesh::setNbShapes( MaxShapeIndex() );
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 std::list<const SMESHDS_Hypothesis *> aList;
152 myShapeToHypothesis.Bind(SS/*.Oriented(TopAbs_FORWARD)*/, aList);
154 std::list<const SMESHDS_Hypothesis *>& alist =
155 myShapeToHypothesis(SS/*.Oriented(TopAbs_FORWARD)*/); // ignore orientation of SS
157 //Check if the Hypothesis is still present
158 std::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 std::list<const SMESHDS_Hypothesis *>& alist=myShapeToHypothesis.ChangeFind( S/*.Oriented(TopAbs_FORWARD)*/ );
177 std::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)
193 SMDS_MeshNode* node = SMDS_Mesh::AddNode(x, y, z);
194 if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
198 SMDS_MeshNode* SMESHDS_Mesh::AddNodeWithID(double x, double y, double z, smIdType ID)
200 SMDS_MeshNode* node = SMDS_Mesh::AddNodeWithID(x,y,z,ID);
201 if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
205 //=======================================================================
206 //function : MoveNode
208 //=======================================================================
210 void SMESHDS_Mesh::MoveNode(const SMDS_MeshNode *n, double x, double y, double z)
212 SMDS_Mesh::MoveNode( n, x, y, z );
213 myScript->MoveNode(n->GetID(), x, y, z);
216 //=======================================================================
217 //function : ChangeElementNodes
218 //purpose : Changed nodes of an element provided that nb of nodes does not change
219 //=======================================================================
221 bool SMESHDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem,
222 const SMDS_MeshNode * nodes[],
225 if ( ! SMDS_Mesh::ChangeElementNodes( elem, nodes, nbnodes ))
228 std::vector<smIdType> IDs( nbnodes );
229 for ( smIdType i = 0; i < nbnodes; i++ )
230 IDs [ i ] = nodes[ i ]->GetID();
231 myScript->ChangeElementNodes( elem->GetID(), &IDs[0], nbnodes);
236 //=======================================================================
237 //function : ChangePolygonNodes
239 //=======================================================================
240 bool SMESHDS_Mesh::ChangePolygonNodes (const SMDS_MeshElement * elem,
241 std::vector<const SMDS_MeshNode*>& nodes)
243 ASSERT(nodes.size() > 3);
245 return ChangeElementNodes(elem, &nodes[0], nodes.size());
248 //=======================================================================
249 //function : ChangePolyhedronNodes
251 //=======================================================================
253 ::ChangePolyhedronNodes (const SMDS_MeshElement * elem,
254 const std::vector<const SMDS_MeshNode*>& nodes,
255 const std::vector<int> & quantities)
257 ASSERT(nodes.size() > 3);
259 size_t i, len = nodes.size();
260 std::vector<smIdType> nodes_ids( len );
261 for ( i = 0; i < len; i++ )
262 nodes_ids[i] = nodes[i]->GetID();
264 if ( !SMDS_Mesh::ChangePolyhedronNodes( elem, nodes, quantities ))
267 myScript->ChangePolyhedronNodes(elem->GetID(), nodes_ids, quantities);
272 //=======================================================================
273 //function : Renumber
275 //=======================================================================
277 void SMESHDS_Mesh::Renumber (const bool /*isNodes*/, const smIdType /*startID*/, const smIdType /*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(smIdType nodeID, smIdType 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, smIdType 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(smIdType node, double diameter, smIdType 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(smIdType n1, smIdType n2, smIdType 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(smIdType n1, smIdType n2, smIdType n3, smIdType 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(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType 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(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType 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(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType n5, smIdType 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(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType n5, smIdType n6, smIdType 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(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType n5, smIdType n6, smIdType n7, smIdType n8, smIdType 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(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
628 smIdType n5, smIdType n6, smIdType n7, smIdType n8,
629 smIdType n9, smIdType n10, smIdType n11, smIdType 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<smIdType>& nodes_ids,
704 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes_ids, ID);
706 myScript->AddPolygonalFace(ID, nodes_ids);
712 SMESHDS_Mesh::AddPolygonalFaceWithID (const std::vector<const SMDS_MeshNode*>& nodes,
715 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID);
717 smIdType i, len = nodes.size();
718 std::vector<smIdType> nodes_ids (len);
719 for (i = 0; i < len; i++) {
720 nodes_ids[i] = nodes[i]->GetID();
722 myScript->AddPolygonalFace(ID, nodes_ids);
728 SMESHDS_Mesh::AddPolygonalFace (const std::vector<const SMDS_MeshNode*>& nodes)
730 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFace(nodes);
732 smIdType i, len = nodes.size();
733 std::vector<smIdType> nodes_ids (len);
734 for (i = 0; i < len; i++) {
735 nodes_ids[i] = nodes[i]->GetID();
737 myScript->AddPolygonalFace(anElem->GetID(), nodes_ids);
743 //=======================================================================
744 //function : AddQuadPolygonalFace
746 //=======================================================================
747 SMDS_MeshFace* SMESHDS_Mesh::AddQuadPolygonalFaceWithID (const std::vector<smIdType>& nodes_ids,
750 SMDS_MeshFace *anElem = SMDS_Mesh::AddQuadPolygonalFaceWithID(nodes_ids, ID);
752 myScript->AddQuadPolygonalFace(ID, nodes_ids);
758 SMESHDS_Mesh::AddQuadPolygonalFaceWithID (const std::vector<const SMDS_MeshNode*>& nodes,
761 SMDS_MeshFace *anElem = SMDS_Mesh::AddQuadPolygonalFaceWithID(nodes, ID);
763 smIdType i, len = nodes.size();
764 std::vector<smIdType> nodes_ids (len);
765 for (i = 0; i < len; i++) {
766 nodes_ids[i] = nodes[i]->GetID();
768 myScript->AddQuadPolygonalFace(ID, nodes_ids);
774 SMESHDS_Mesh::AddQuadPolygonalFace (const std::vector<const SMDS_MeshNode*>& nodes)
776 SMDS_MeshFace *anElem = SMDS_Mesh::AddQuadPolygonalFace(nodes);
778 smIdType i, len = nodes.size();
779 std::vector<smIdType> nodes_ids (len);
780 for (i = 0; i < len; i++) {
781 nodes_ids[i] = nodes[i]->GetID();
783 myScript->AddQuadPolygonalFace(anElem->GetID(), nodes_ids);
789 //=======================================================================
790 //function : AddPolyhedralVolume
792 //=======================================================================
793 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID (const std::vector<smIdType>& nodes_ids,
794 const std::vector<int>& quantities,
797 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes_ids, quantities, ID);
799 myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
804 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID
805 (const std::vector<const SMDS_MeshNode*>& nodes,
806 const std::vector<int>& quantities,
809 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
811 smIdType i, len = nodes.size();
812 std::vector<smIdType> nodes_ids (len);
813 for (i = 0; i < len; i++) {
814 nodes_ids[i] = nodes[i]->GetID();
816 myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
821 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolume
822 (const std::vector<const SMDS_MeshNode*>& nodes,
823 const std::vector<int>& quantities)
825 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolume(nodes, quantities);
827 smIdType i, len = nodes.size();
828 std::vector<smIdType> nodes_ids (len);
829 for (i = 0; i < len; i++) {
830 nodes_ids[i] = nodes[i]->GetID();
832 myScript->AddPolyhedralVolume(anElem->GetID(), nodes_ids, quantities);
837 //=======================================================================
838 //function : removeFromContainers
840 //=======================================================================
842 static void removeFromContainers (SMESHDS_Mesh* /*theMesh*/,
843 std::set<SMESHDS_GroupBase*>& theGroups,
844 std::vector<const SMDS_MeshElement*>& theElems)
846 if ( theElems.empty() )
850 // Element can belong to several groups
851 if ( !theGroups.empty() )
853 std::set<SMESHDS_GroupBase*>::iterator GrIt = theGroups.begin();
854 for ( ; GrIt != theGroups.end(); GrIt++ )
856 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>( *GrIt );
857 if ( !group || group->IsEmpty() ) continue;
859 std::vector<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
860 for ( ; elIt != theElems.end(); elIt++ )
862 group->SMDSGroup().Remove( *elIt );
863 if ( group->IsEmpty() ) break;
868 //const bool deleted=true;
870 // Rm from sub-meshes
871 // Element should belong to only one sub-mesh
872 // if ( theMesh->SubMeshes()->more() )
874 // std::list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
876 // for ( ; elIt != theElems.end(); ++elIt )
877 // if ( SMESHDS_SubMesh* sm = theMesh->MeshElements( (*elIt)->getshapeId() ))
878 // sm->RemoveNode( static_cast<const SMDS_MeshNode*> (*elIt), deleted );
881 // for ( ; elIt != theElems.end(); ++elIt )
882 // if ( SMESHDS_SubMesh* sm = theMesh->MeshElements( (*elIt)->getshapeId() ))
883 // sm->RemoveElement( *elIt, deleted );
888 //=======================================================================
889 //function : RemoveNode
891 //=======================================================================
892 void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n)
894 if ( RemoveFreeNode( n, 0, true ))
897 myScript->RemoveNode(n->GetID());
899 // remove inverse elements from the sub-meshes
900 for ( SMDS_ElemIteratorPtr eIt = n->GetInverseElementIterator(); eIt->more() ; )
902 const SMDS_MeshElement* e = eIt->next();
903 if ( SMESHDS_SubMesh * sm = MeshElements( e->getshapeId() ))
904 sm->RemoveElement( e );
906 if ( SMESHDS_SubMesh * sm = MeshElements( n->getshapeId() ))
910 std::vector<const SMDS_MeshElement *> removedElems;
911 std::vector<const SMDS_MeshElement *> removedNodes;
913 SMDS_Mesh::RemoveElement( n, removedElems, removedNodes, true );
915 removeFromContainers( this, myGroups, removedElems );
916 removeFromContainers( this, myGroups, removedNodes );
919 //=======================================================================
920 //function : RemoveFreeNode
922 //=======================================================================
923 bool SMESHDS_Mesh::RemoveFreeNode(const SMDS_MeshNode * n,
924 SMESHDS_SubMesh * subMesh,
927 if ( n->NbInverseElements() > 0 )
930 myScript->RemoveNode(n->GetID());
933 // Node can belong to several groups
934 if ( fromGroups && !myGroups.empty() ) {
935 std::set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
936 for (; GrIt != myGroups.end(); GrIt++) {
937 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
938 if (group && group->GetType() == SMDSAbs_Node )
939 group->SMDSGroup().Remove(n);
944 // Node should belong to only one sub-mesh
945 if ( !subMesh || !subMesh->RemoveNode( n ))
946 if (( subMesh = MeshElements( n->getshapeId() )))
947 subMesh->RemoveNode(n);
949 SMDS_Mesh::RemoveFreeElement(n);
954 //=======================================================================
955 //function : RemoveElement
957 //========================================================================
958 void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt)
960 if (elt->GetType() == SMDSAbs_Node)
962 RemoveNode( static_cast<const SMDS_MeshNode*>( elt ));
965 //if (!hasConstructionEdges() && !hasConstructionFaces())
967 SMESHDS_SubMesh* subMesh=0;
968 if ( elt->getshapeId() > 0 )
969 subMesh = MeshElements( elt->getshapeId() );
971 RemoveFreeElement( elt, subMesh, true );
975 myScript->RemoveElement(elt->GetID());
977 std::vector<const SMDS_MeshElement *> removedElems;
978 std::vector<const SMDS_MeshElement *> removedNodes;
980 SMDS_Mesh::RemoveElement(elt, removedElems, removedNodes );
982 removeFromContainers( this, myGroups, removedElems );
985 //=======================================================================
986 //function : RemoveFreeElement
988 //========================================================================
989 void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt,
990 SMESHDS_SubMesh * subMesh,
993 if (elt->GetType() == SMDSAbs_Node) {
994 RemoveFreeNode( static_cast<const SMDS_MeshNode*>(elt), subMesh, fromGroups);
998 // if (hasConstructionEdges() || hasConstructionFaces())
999 // // this methods is only for meshes without descendants
1002 myScript->RemoveElement(elt->GetID());
1005 // Element can belong to several groups
1006 if ( fromGroups && !myGroups.empty() ) {
1007 std::set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
1008 for (; GrIt != myGroups.end(); GrIt++) {
1009 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
1010 if (group && !group->IsEmpty())
1011 group->SMDSGroup().Remove(elt);
1016 // Element should belong to only one sub-mesh
1017 if ( !subMesh && elt->getshapeId() > 0 )
1018 subMesh = MeshElements( elt->getshapeId() );
1020 subMesh->RemoveElement( elt );
1022 SMDS_Mesh::RemoveFreeElement( elt );
1025 //================================================================================
1027 * \brief Remove all data from the mesh
1029 //================================================================================
1031 void SMESHDS_Mesh::ClearMesh()
1033 myScript->ClearMesh();
1037 SMESHDS_SubMeshIteratorPtr smIt = SubMeshes();
1038 while ( SMESHDS_SubMesh* sm = const_cast< SMESHDS_SubMesh* >( smIt->next() ))
1042 TGroups::iterator group, groupEnd = myGroups.end();
1043 for ( group = myGroups.begin(); group != groupEnd; ++group ) {
1044 if ( SMESHDS_Group* g = dynamic_cast<SMESHDS_Group*>(*group)) {
1045 SMDSAbs_ElementType groupType = g->GetType();
1047 g->SetType( groupType );
1051 (*group)->Extent(); // to free cached elements in GroupOnFilter's
1056 //================================================================================
1058 * \brief return submesh by shape
1059 * \param shape - the sub-shape
1060 * \retval SMESHDS_SubMesh* - the found submesh
1062 //================================================================================
1064 SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const TopoDS_Shape & shape )
1066 if ( shape.IsNull() )
1069 return NewSubMesh( ShapeToIndex( shape ));
1072 //================================================================================
1074 * \brief Add element or node to submesh
1075 * \param elem - element to add
1076 * \param subMesh - submesh to be filled in
1078 //================================================================================
1080 int SMESHDS_Mesh::add(const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh )
1082 if ( elem && subMesh ) {
1083 subMesh->AddElement( elem );
1084 return subMesh->GetID();
1089 //=======================================================================
1090 //function : SetNodeOnVolume
1092 //=======================================================================
1093 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode,
1094 const TopoDS_Shell & S)
1096 if ( int shapeID = add( aNode, getSubmesh( S )))
1097 const_cast< SMDS_MeshNode* >
1098 ( aNode )->SetPosition( SMDS_SpacePosition::originSpacePosition(), shapeID );
1101 //=======================================================================
1102 //function : SetNodeOnVolume
1104 //=======================================================================
1105 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode * aNode,
1106 const TopoDS_Solid & S)
1108 if ( int shapeID = add( aNode, getSubmesh( S )))
1109 const_cast< SMDS_MeshNode* >
1110 ( aNode )->SetPosition( SMDS_SpacePosition::originSpacePosition(), shapeID );
1113 //=======================================================================
1114 //function : SetNodeOnFace
1116 //=======================================================================
1117 void SMESHDS_Mesh::SetNodeOnFace(const SMDS_MeshNode * aNode,
1118 const TopoDS_Face & S,
1122 if ( int shapeID = add( aNode, getSubmesh( S )))
1123 const_cast< SMDS_MeshNode* >
1124 ( aNode )->SetPosition(SMDS_PositionPtr( new SMDS_FacePosition( u, v )), shapeID );
1127 //=======================================================================
1128 //function : SetNodeOnEdge
1130 //=======================================================================
1131 void SMESHDS_Mesh::SetNodeOnEdge(const SMDS_MeshNode * aNode,
1132 const TopoDS_Edge & S,
1135 if ( int shapeID = add( aNode, getSubmesh( S )))
1136 const_cast< SMDS_MeshNode* >
1137 ( aNode )->SetPosition(SMDS_PositionPtr( new SMDS_EdgePosition( u )), shapeID );
1140 //=======================================================================
1141 //function : SetNodeOnVertex
1143 //=======================================================================
1144 void SMESHDS_Mesh::SetNodeOnVertex(const SMDS_MeshNode * aNode,
1145 const TopoDS_Vertex & S)
1147 if ( int shapeID = add( aNode, getSubmesh( S )))
1148 const_cast< SMDS_MeshNode* >
1149 ( aNode )->SetPosition(SMDS_PositionPtr( new SMDS_VertexPosition()), shapeID );
1152 //=======================================================================
1153 //function : UnSetNodeOnShape
1155 //=======================================================================
1156 void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode)
1158 int shapeId = aNode->getshapeId();
1160 if ( SMESHDS_SubMesh* sm = MeshElements( shapeId ))
1161 sm->RemoveNode(aNode);
1164 //=======================================================================
1165 //function : SetMeshElementOnShape
1167 //=======================================================================
1168 void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement * anElement,
1169 const TopoDS_Shape & S)
1171 add( anElement, getSubmesh(S) );
1174 //=======================================================================
1175 //function : UnSetMeshElementOnShape
1177 //=======================================================================
1178 void SMESHDS_Mesh::UnSetMeshElementOnShape(const SMDS_MeshElement * elem,
1179 const TopoDS_Shape & S)
1181 if ( SMESHDS_SubMesh* sm = MeshElements( S ))
1182 sm->RemoveElement(elem);
1185 //=======================================================================
1186 //function : ShapeToMesh
1188 //=======================================================================
1189 TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() const
1194 //=======================================================================
1195 //function : IsGroupOfSubShapes
1196 //purpose : return true if at least one sub-shape of theShape is a sub-shape
1197 // of myShape or theShape == myShape
1198 //=======================================================================
1200 bool SMESHDS_Mesh::IsGroupOfSubShapes (const TopoDS_Shape& theShape) const
1202 if ( myIndexToShape.Contains(theShape) )
1205 for ( TopoDS_Iterator it( theShape ); it.More(); it.Next() )
1206 if ( IsGroupOfSubShapes( it.Value() ))
1212 ///////////////////////////////////////////////////////////////////////////////
1213 /// Return the sub mesh linked to the a given TopoDS_Shape or NULL if the given
1214 /// TopoDS_Shape is unknown
1215 ///////////////////////////////////////////////////////////////////////////////
1216 SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const
1218 int Index = ShapeToIndex(S);
1219 return (SMESHDS_SubMesh *) ( Index ? mySubMeshHolder->Get( Index ) : 0 );
1222 ///////////////////////////////////////////////////////////////////////////////
1223 /// Return the sub mesh by Id of shape it is linked to
1224 ///////////////////////////////////////////////////////////////////////////////
1225 SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index) const
1227 return const_cast< SMESHDS_SubMesh* >( mySubMeshHolder->Get( Index ));
1230 //=======================================================================
1231 //function : SubMeshIndices
1233 //=======================================================================
1234 std::list<int> SMESHDS_Mesh::SubMeshIndices() const
1236 std::list<int> anIndices;
1237 SMESHDS_SubMeshIteratorPtr smIt = SubMeshes();
1238 while ( const SMESHDS_SubMesh* sm = smIt->next() )
1239 anIndices.push_back( sm->GetID() );
1244 //=======================================================================
1245 //function : SubMeshes
1247 //=======================================================================
1249 SMESHDS_SubMeshIteratorPtr SMESHDS_Mesh::SubMeshes() const
1251 return SMESHDS_SubMeshIteratorPtr( mySubMeshHolder->GetIterator() );
1254 //=======================================================================
1255 //function : GetHypothesis
1257 //=======================================================================
1259 const std::list<const SMESHDS_Hypothesis*>&
1260 SMESHDS_Mesh::GetHypothesis(const TopoDS_Shape & S) const
1262 if ( myShapeToHypothesis.IsBound( S/*.Oriented(TopAbs_FORWARD)*/ ) ) // ignore orientation of S
1263 return myShapeToHypothesis.Find( S/*.Oriented(TopAbs_FORWARD)*/ );
1265 static std::list<const SMESHDS_Hypothesis*> empty;
1269 //================================================================================
1271 * \brief returns true if the hypothesis is assigned to any sub-shape
1273 //================================================================================
1275 bool SMESHDS_Mesh::IsUsedHypothesis(const SMESHDS_Hypothesis * H) const
1277 ShapeToHypothesis::Iterator s2h( myShapeToHypothesis );
1278 for ( ; s2h.More(); s2h.Next() )
1279 if ( std::find( s2h.Value().begin(), s2h.Value().end(), H ) != s2h.Value().end() )
1284 //=======================================================================
1285 //function : GetScript
1287 //=======================================================================
1288 SMESHDS_Script* SMESHDS_Mesh::GetScript()
1293 //=======================================================================
1294 //function : ClearScript
1296 //=======================================================================
1297 void SMESHDS_Mesh::ClearScript()
1302 //=======================================================================
1303 //function : HasMeshElements
1305 //=======================================================================
1306 bool SMESHDS_Mesh::HasMeshElements(const TopoDS_Shape & S) const
1308 int Index = myIndexToShape.FindIndex(S);
1309 return mySubMeshHolder->Get( Index );
1312 //=======================================================================
1313 //function : HasHypothesis
1315 //=======================================================================
1316 bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S)
1318 return myShapeToHypothesis.IsBound(S/*.Oriented(TopAbs_FORWARD)*/);
1321 //=======================================================================
1322 //function : NewSubMesh
1324 //=======================================================================
1325 SMESHDS_SubMesh * SMESHDS_Mesh::NewSubMesh(int Index)
1327 SMESHDS_SubMesh* SM = MeshElements( Index );
1330 SM = new SMESHDS_SubMesh(this, Index);
1331 mySubMeshHolder->Add( Index, SM );
1336 //=======================================================================
1337 //function : AddCompoundSubmesh
1339 //=======================================================================
1341 int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S,
1342 TopAbs_ShapeEnum type)
1345 if ( IsGroupOfSubShapes( S ))
1347 aMainIndex = myIndexToShape.Add( S );
1348 bool all = ( type == TopAbs_SHAPE );
1349 if ( all ) // corresponding simple submesh may exist
1350 aMainIndex = -aMainIndex;
1351 SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex );
1352 if ( !aNewSub->IsComplexSubmesh() ) // is empty
1354 int shapeType = Max( TopAbs_SOLID, all ? myShape.ShapeType() : type );
1355 int typeLimit = all ? TopAbs_VERTEX : type;
1356 for ( ; shapeType <= typeLimit; shapeType++ )
1358 TopExp_Explorer exp( S, TopAbs_ShapeEnum( shapeType ));
1359 for ( ; exp.More(); exp.Next() )
1361 int index = myIndexToShape.FindIndex( exp.Current() );
1363 aNewSub->AddSubMesh( NewSubMesh( index ));
1371 //=======================================================================
1372 //function : IndexToShape
1374 //=======================================================================
1375 const TopoDS_Shape& SMESHDS_Mesh::IndexToShape(int ShapeIndex) const
1379 if ( ShapeIndex > 0 )
1380 return myIndexToShape.FindKey(ShapeIndex);
1385 static TopoDS_Shape nullShape;
1389 //================================================================================
1391 * \brief Return max index of sub-mesh
1393 //================================================================================
1395 int SMESHDS_Mesh::MaxSubMeshIndex() const
1397 return mySubMeshHolder->GetMaxID();
1400 //=======================================================================
1401 //function : ShapeToIndex
1403 //=======================================================================
1404 int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const
1406 int index = myIndexToShape.FindIndex(S);
1410 //=======================================================================
1411 //function : SetNodeOnVolume
1413 //=======================================================================
1414 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index)
1416 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1417 ((SMDS_MeshNode*) aNode)->SetPosition( SMDS_SpacePosition::originSpacePosition(), shapeID );
1420 //=======================================================================
1421 //function : SetNodeOnFace
1423 //=======================================================================
1424 void SMESHDS_Mesh::SetNodeOnFace(const SMDS_MeshNode* aNode, int Index, double u, double v)
1426 //Set Position on Node
1427 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1428 const_cast< SMDS_MeshNode* >
1429 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition( u, v )), shapeID );
1432 //=======================================================================
1433 //function : SetNodeOnEdge
1435 //=======================================================================
1436 void SMESHDS_Mesh::SetNodeOnEdge(const SMDS_MeshNode* aNode,
1440 //Set Position on Node
1441 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1442 const_cast< SMDS_MeshNode* >
1443 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition( u )), shapeID );
1446 //=======================================================================
1447 //function : SetNodeOnVertex
1449 //=======================================================================
1450 void SMESHDS_Mesh::SetNodeOnVertex(const SMDS_MeshNode* aNode, int Index)
1452 //Set Position on Node
1453 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1454 const_cast< SMDS_MeshNode* >
1455 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition()), shapeID );
1458 //=======================================================================
1459 //function : SetMeshElementOnShape
1461 //=======================================================================
1462 void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement,
1465 add( anElement, NewSubMesh( Index ));
1468 //=======================================================================
1469 //function : ~SMESHDS_Mesh
1471 //=======================================================================
1472 SMESHDS_Mesh::~SMESHDS_Mesh()
1477 delete mySubMeshHolder;
1481 //********************************************************************
1482 //********************************************************************
1483 //******** *********
1484 //***** Methods for addition of quadratic elements ******
1485 //******** *********
1486 //********************************************************************
1487 //********************************************************************
1489 //=======================================================================
1490 //function : AddEdgeWithID
1492 //=======================================================================
1493 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(smIdType n1, smIdType n2, smIdType n12, smIdType ID)
1495 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,n12,ID);
1496 if(anElem) myScript->AddEdge(ID,n1,n2,n12);
1500 //=======================================================================
1501 //function : AddEdge
1503 //=======================================================================
1504 SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode* n1,
1505 const SMDS_MeshNode* n2,
1506 const SMDS_MeshNode* n12)
1508 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2,n12);
1509 if(anElem) myScript->AddEdge(anElem->GetID(),
1516 //=======================================================================
1517 //function : AddEdgeWithID
1519 //=======================================================================
1520 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
1521 const SMDS_MeshNode * n2,
1522 const SMDS_MeshNode * n12,
1525 return AddEdgeWithID(n1->GetID(),
1532 //=======================================================================
1533 //function : AddFace
1535 //=======================================================================
1536 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1537 const SMDS_MeshNode * n2,
1538 const SMDS_MeshNode * n3,
1539 const SMDS_MeshNode * n12,
1540 const SMDS_MeshNode * n23,
1541 const SMDS_MeshNode * n31)
1543 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31);
1544 if(anElem) myScript->AddFace(anElem->GetID(),
1545 n1->GetID(), n2->GetID(), n3->GetID(),
1546 n12->GetID(), n23->GetID(), n31->GetID());
1550 //=======================================================================
1551 //function : AddFaceWithID
1553 //=======================================================================
1554 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3,
1555 smIdType n12,smIdType n23,smIdType n31, smIdType ID)
1557 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,ID);
1558 if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31);
1562 //=======================================================================
1563 //function : AddFaceWithID
1565 //=======================================================================
1566 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1567 const SMDS_MeshNode * n2,
1568 const SMDS_MeshNode * n3,
1569 const SMDS_MeshNode * n12,
1570 const SMDS_MeshNode * n23,
1571 const SMDS_MeshNode * n31,
1574 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1575 n12->GetID(), n23->GetID(), n31->GetID(),
1579 //=======================================================================
1580 //function : AddFace
1582 //=======================================================================
1583 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1584 const SMDS_MeshNode * n2,
1585 const SMDS_MeshNode * n3,
1586 const SMDS_MeshNode * n12,
1587 const SMDS_MeshNode * n23,
1588 const SMDS_MeshNode * n31,
1589 const SMDS_MeshNode * nCenter)
1591 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31,nCenter);
1592 if(anElem) myScript->AddFace(anElem->GetID(),
1593 n1->GetID(), n2->GetID(), n3->GetID(),
1594 n12->GetID(), n23->GetID(), n31->GetID(),
1599 //=======================================================================
1600 //function : AddFaceWithID
1602 //=======================================================================
1603 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3,
1604 smIdType n12,smIdType n23,smIdType n31, smIdType nCenter, smIdType ID)
1606 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,nCenter,ID);
1607 if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31,nCenter);
1611 //=======================================================================
1612 //function : AddFaceWithID
1614 //=======================================================================
1615 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1616 const SMDS_MeshNode * n2,
1617 const SMDS_MeshNode * n3,
1618 const SMDS_MeshNode * n12,
1619 const SMDS_MeshNode * n23,
1620 const SMDS_MeshNode * n31,
1621 const SMDS_MeshNode * nCenter,
1624 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1625 n12->GetID(), n23->GetID(), n31->GetID(),
1626 nCenter->GetID(), ID);
1630 //=======================================================================
1631 //function : AddFace
1633 //=======================================================================
1634 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1635 const SMDS_MeshNode * n2,
1636 const SMDS_MeshNode * n3,
1637 const SMDS_MeshNode * n4,
1638 const SMDS_MeshNode * n12,
1639 const SMDS_MeshNode * n23,
1640 const SMDS_MeshNode * n34,
1641 const SMDS_MeshNode * n41)
1643 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41);
1644 if(anElem) myScript->AddFace(anElem->GetID(),
1645 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1646 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID());
1650 //=======================================================================
1651 //function : AddFaceWithID
1653 //=======================================================================
1654 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
1655 smIdType n12,smIdType n23,smIdType n34,smIdType n41, smIdType ID)
1657 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,ID);
1658 if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41);
1662 //=======================================================================
1663 //function : AddFaceWithID
1665 //=======================================================================
1666 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1667 const SMDS_MeshNode * n2,
1668 const SMDS_MeshNode * n3,
1669 const SMDS_MeshNode * n4,
1670 const SMDS_MeshNode * n12,
1671 const SMDS_MeshNode * n23,
1672 const SMDS_MeshNode * n34,
1673 const SMDS_MeshNode * n41,
1676 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1677 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1682 //=======================================================================
1683 //function : AddFace
1685 //=======================================================================
1686 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1687 const SMDS_MeshNode * n2,
1688 const SMDS_MeshNode * n3,
1689 const SMDS_MeshNode * n4,
1690 const SMDS_MeshNode * n12,
1691 const SMDS_MeshNode * n23,
1692 const SMDS_MeshNode * n34,
1693 const SMDS_MeshNode * n41,
1694 const SMDS_MeshNode * nCenter)
1696 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
1697 if(anElem) myScript->AddFace(anElem->GetID(),
1698 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1699 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1704 //=======================================================================
1705 //function : AddFaceWithID
1707 //=======================================================================
1708 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
1709 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
1710 smIdType nCenter, smIdType ID)
1712 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,nCenter,ID);
1713 if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
1717 //=======================================================================
1718 //function : AddFaceWithID
1720 //=======================================================================
1721 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1722 const SMDS_MeshNode * n2,
1723 const SMDS_MeshNode * n3,
1724 const SMDS_MeshNode * n4,
1725 const SMDS_MeshNode * n12,
1726 const SMDS_MeshNode * n23,
1727 const SMDS_MeshNode * n34,
1728 const SMDS_MeshNode * n41,
1729 const SMDS_MeshNode * nCenter,
1732 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1733 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1734 nCenter->GetID(), ID);
1738 //=======================================================================
1739 //function : AddVolume
1741 //=======================================================================
1742 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1743 const SMDS_MeshNode * n2,
1744 const SMDS_MeshNode * n3,
1745 const SMDS_MeshNode * n4,
1746 const SMDS_MeshNode * n12,
1747 const SMDS_MeshNode * n23,
1748 const SMDS_MeshNode * n31,
1749 const SMDS_MeshNode * n14,
1750 const SMDS_MeshNode * n24,
1751 const SMDS_MeshNode * n34)
1753 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1754 if(anElem) myScript->AddVolume(anElem->GetID(),
1755 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1756 n12->GetID(), n23->GetID(), n31->GetID(),
1757 n14->GetID(), n24->GetID(), n34->GetID());
1761 //=======================================================================
1762 //function : AddVolumeWithID
1764 //=======================================================================
1765 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
1766 smIdType n12,smIdType n23,smIdType n31,
1767 smIdType n14,smIdType n24,smIdType n34, smIdType ID)
1769 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n12,n23,
1770 n31,n14,n24,n34,ID);
1771 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1775 //=======================================================================
1776 //function : AddVolumeWithID
1777 //purpose : 2d order tetrahedron of 10 nodes
1778 //=======================================================================
1779 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1780 const SMDS_MeshNode * n2,
1781 const SMDS_MeshNode * n3,
1782 const SMDS_MeshNode * n4,
1783 const SMDS_MeshNode * n12,
1784 const SMDS_MeshNode * n23,
1785 const SMDS_MeshNode * n31,
1786 const SMDS_MeshNode * n14,
1787 const SMDS_MeshNode * n24,
1788 const SMDS_MeshNode * n34,
1791 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1792 n12->GetID(), n23->GetID(), n31->GetID(),
1793 n14->GetID(), n24->GetID(), n34->GetID(), ID);
1797 //=======================================================================
1798 //function : AddVolume
1800 //=======================================================================
1801 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1802 const SMDS_MeshNode * n2,
1803 const SMDS_MeshNode * n3,
1804 const SMDS_MeshNode * n4,
1805 const SMDS_MeshNode * n5,
1806 const SMDS_MeshNode * n12,
1807 const SMDS_MeshNode * n23,
1808 const SMDS_MeshNode * n34,
1809 const SMDS_MeshNode * n41,
1810 const SMDS_MeshNode * n15,
1811 const SMDS_MeshNode * n25,
1812 const SMDS_MeshNode * n35,
1813 const SMDS_MeshNode * n45)
1815 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n12,n23,n34,n41,
1818 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1819 n3->GetID(), n4->GetID(), n5->GetID(),
1820 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1821 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID());
1825 //=======================================================================
1826 //function : AddVolumeWithID
1828 //=======================================================================
1829 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType n5,
1830 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
1831 smIdType n15,smIdType n25,smIdType n35,smIdType n45, smIdType ID)
1833 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,
1835 n15,n25,n35,n45,ID);
1836 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n12,n23,n34,n41,
1841 //=======================================================================
1842 //function : AddVolumeWithID
1843 //purpose : 2d order pyramid of 13 nodes
1844 //=======================================================================
1845 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1846 const SMDS_MeshNode * n2,
1847 const SMDS_MeshNode * n3,
1848 const SMDS_MeshNode * n4,
1849 const SMDS_MeshNode * n5,
1850 const SMDS_MeshNode * n12,
1851 const SMDS_MeshNode * n23,
1852 const SMDS_MeshNode * n34,
1853 const SMDS_MeshNode * n41,
1854 const SMDS_MeshNode * n15,
1855 const SMDS_MeshNode * n25,
1856 const SMDS_MeshNode * n35,
1857 const SMDS_MeshNode * n45,
1860 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1861 n4->GetID(), n5->GetID(),
1862 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1863 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID(),
1868 //=======================================================================
1869 //function : AddVolume
1870 //purpose : 2nd order pentahedron (prism) with 15 nodes
1871 //=======================================================================
1872 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1873 const SMDS_MeshNode * n2,
1874 const SMDS_MeshNode * n3,
1875 const SMDS_MeshNode * n4,
1876 const SMDS_MeshNode * n5,
1877 const SMDS_MeshNode * n6,
1878 const SMDS_MeshNode * n12,
1879 const SMDS_MeshNode * n23,
1880 const SMDS_MeshNode * n31,
1881 const SMDS_MeshNode * n45,
1882 const SMDS_MeshNode * n56,
1883 const SMDS_MeshNode * n64,
1884 const SMDS_MeshNode * n14,
1885 const SMDS_MeshNode * n25,
1886 const SMDS_MeshNode * n36)
1888 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n12,n23,n31,
1889 n45,n56,n64,n14,n25,n36);
1891 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1892 n3->GetID(), n4->GetID(), n5->GetID(), n6->GetID(),
1893 n12->GetID(), n23->GetID(), n31->GetID(),
1894 n45->GetID(), n56->GetID(), n64->GetID(),
1895 n14->GetID(), n25->GetID(), n36->GetID());
1899 //=======================================================================
1900 //function : AddVolumeWithID
1901 //purpose : 2nd order pentahedron (prism) with 15 nodes
1902 //=======================================================================
1903 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3,
1904 smIdType n4, smIdType n5, smIdType n6,
1905 smIdType n12,smIdType n23,smIdType n31,
1906 smIdType n45,smIdType n56,smIdType n64,
1907 smIdType n14,smIdType n25,smIdType n36, smIdType ID)
1909 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,
1913 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n12,n23,n31,
1914 n45,n56,n64,n14,n25,n36);
1918 //=======================================================================
1919 //function : AddVolumeWithID
1920 //purpose : 2d order Pentahedron (prism) with 15 nodes
1921 //=======================================================================
1922 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1923 const SMDS_MeshNode * n2,
1924 const SMDS_MeshNode * n3,
1925 const SMDS_MeshNode * n4,
1926 const SMDS_MeshNode * n5,
1927 const SMDS_MeshNode * n6,
1928 const SMDS_MeshNode * n12,
1929 const SMDS_MeshNode * n23,
1930 const SMDS_MeshNode * n31,
1931 const SMDS_MeshNode * n45,
1932 const SMDS_MeshNode * n56,
1933 const SMDS_MeshNode * n64,
1934 const SMDS_MeshNode * n14,
1935 const SMDS_MeshNode * n25,
1936 const SMDS_MeshNode * n36,
1939 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1940 n4->GetID(), n5->GetID(), n6->GetID(),
1941 n12->GetID(), n23->GetID(), n31->GetID(),
1942 n45->GetID(), n56->GetID(), n64->GetID(),
1943 n14->GetID(), n25->GetID(), n36->GetID(),
1946 //=======================================================================
1947 //function : AddVolume
1948 //purpose : 2nd order pentahedron (prism) with 18 nodes
1949 //=======================================================================
1950 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1951 const SMDS_MeshNode * n2,
1952 const SMDS_MeshNode * n3,
1953 const SMDS_MeshNode * n4,
1954 const SMDS_MeshNode * n5,
1955 const SMDS_MeshNode * n6,
1956 const SMDS_MeshNode * n12,
1957 const SMDS_MeshNode * n23,
1958 const SMDS_MeshNode * n31,
1959 const SMDS_MeshNode * n45,
1960 const SMDS_MeshNode * n56,
1961 const SMDS_MeshNode * n64,
1962 const SMDS_MeshNode * n14,
1963 const SMDS_MeshNode * n25,
1964 const SMDS_MeshNode * n36,
1965 const SMDS_MeshNode * n1245,
1966 const SMDS_MeshNode * n2356,
1967 const SMDS_MeshNode * n1346)
1969 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n12,n23,n31,
1970 n45,n56,n64,n14,n25,n36,
1971 n1245, n2356, n1346);
1973 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1974 n3->GetID(), n4->GetID(), n5->GetID(), n6->GetID(),
1975 n12->GetID(), n23->GetID(), n31->GetID(),
1976 n45->GetID(), n56->GetID(), n64->GetID(),
1977 n14->GetID(), n25->GetID(), n36->GetID(),
1978 n1245->GetID(), n2356->GetID(), n1346->GetID());
1982 //=======================================================================
1983 //function : AddVolumeWithID
1984 //purpose : 2nd order pentahedron (prism) with 18 nodes
1985 //=======================================================================
1986 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3,
1987 smIdType n4, smIdType n5, smIdType n6,
1988 smIdType n12,smIdType n23,smIdType n31,
1989 smIdType n45,smIdType n56,smIdType n64,
1990 smIdType n14,smIdType n25,smIdType n36,
1991 smIdType n1245, smIdType n2356, smIdType n1346,
1994 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,
1998 n1245, n2356, n1346, ID);
1999 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n12,n23,n31,
2000 n45,n56,n64,n14,n25,n36, n1245, n2356, n1346);
2004 //=======================================================================
2005 //function : AddVolumeWithID
2006 //purpose : 2d order Pentahedron with 18 nodes
2007 //=======================================================================
2008 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2009 const SMDS_MeshNode * n2,
2010 const SMDS_MeshNode * n3,
2011 const SMDS_MeshNode * n4,
2012 const SMDS_MeshNode * n5,
2013 const SMDS_MeshNode * n6,
2014 const SMDS_MeshNode * n12,
2015 const SMDS_MeshNode * n23,
2016 const SMDS_MeshNode * n31,
2017 const SMDS_MeshNode * n45,
2018 const SMDS_MeshNode * n56,
2019 const SMDS_MeshNode * n64,
2020 const SMDS_MeshNode * n14,
2021 const SMDS_MeshNode * n25,
2022 const SMDS_MeshNode * n36,
2023 const SMDS_MeshNode * n1245,
2024 const SMDS_MeshNode * n2356,
2025 const SMDS_MeshNode * n1346,
2028 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
2029 n4->GetID(), n5->GetID(), n6->GetID(),
2030 n12->GetID(), n23->GetID(), n31->GetID(),
2031 n45->GetID(), n56->GetID(), n64->GetID(),
2032 n14->GetID(), n25->GetID(), n36->GetID(),
2033 n1245->GetID(), n2356->GetID(), n1346->GetID(), ID);
2037 //=======================================================================
2038 //function : AddVolume
2039 //purpose : add quadratic hexahedron
2040 //=======================================================================
2041 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2042 const SMDS_MeshNode * n2,
2043 const SMDS_MeshNode * n3,
2044 const SMDS_MeshNode * n4,
2045 const SMDS_MeshNode * n5,
2046 const SMDS_MeshNode * n6,
2047 const SMDS_MeshNode * n7,
2048 const SMDS_MeshNode * n8,
2049 const SMDS_MeshNode * n12,
2050 const SMDS_MeshNode * n23,
2051 const SMDS_MeshNode * n34,
2052 const SMDS_MeshNode * n41,
2053 const SMDS_MeshNode * n56,
2054 const SMDS_MeshNode * n67,
2055 const SMDS_MeshNode * n78,
2056 const SMDS_MeshNode * n85,
2057 const SMDS_MeshNode * n15,
2058 const SMDS_MeshNode * n26,
2059 const SMDS_MeshNode * n37,
2060 const SMDS_MeshNode * n48)
2062 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
2067 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
2068 n3->GetID(), n4->GetID(), n5->GetID(),
2069 n6->GetID(), n7->GetID(), n8->GetID(),
2070 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2071 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2072 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID());
2076 //=======================================================================
2077 //function : AddVolumeWithID
2079 //=======================================================================
2080 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
2081 smIdType n5, smIdType n6, smIdType n7, smIdType n8,
2082 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
2083 smIdType n56,smIdType n67,smIdType n78,smIdType n85,
2084 smIdType n15,smIdType n26,smIdType n37,smIdType n48, smIdType ID)
2086 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
2089 n15,n26,n37,n48,ID);
2090 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
2091 n56,n67,n78,n85,n15,n26,n37,n48);
2095 //=======================================================================
2096 //function : AddVolumeWithID
2097 //purpose : 2d order Hexahedrons with 20 nodes
2098 //=======================================================================
2099 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2100 const SMDS_MeshNode * n2,
2101 const SMDS_MeshNode * n3,
2102 const SMDS_MeshNode * n4,
2103 const SMDS_MeshNode * n5,
2104 const SMDS_MeshNode * n6,
2105 const SMDS_MeshNode * n7,
2106 const SMDS_MeshNode * n8,
2107 const SMDS_MeshNode * n12,
2108 const SMDS_MeshNode * n23,
2109 const SMDS_MeshNode * n34,
2110 const SMDS_MeshNode * n41,
2111 const SMDS_MeshNode * n56,
2112 const SMDS_MeshNode * n67,
2113 const SMDS_MeshNode * n78,
2114 const SMDS_MeshNode * n85,
2115 const SMDS_MeshNode * n15,
2116 const SMDS_MeshNode * n26,
2117 const SMDS_MeshNode * n37,
2118 const SMDS_MeshNode * n48,
2121 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
2122 n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
2123 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2124 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2125 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2129 //=======================================================================
2130 //function : AddVolume
2131 //purpose : add tri-quadratic hexahedron of 27 nodes
2132 //=======================================================================
2134 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2135 const SMDS_MeshNode * n2,
2136 const SMDS_MeshNode * n3,
2137 const SMDS_MeshNode * n4,
2138 const SMDS_MeshNode * n5,
2139 const SMDS_MeshNode * n6,
2140 const SMDS_MeshNode * n7,
2141 const SMDS_MeshNode * n8,
2142 const SMDS_MeshNode * n12,
2143 const SMDS_MeshNode * n23,
2144 const SMDS_MeshNode * n34,
2145 const SMDS_MeshNode * n41,
2146 const SMDS_MeshNode * n56,
2147 const SMDS_MeshNode * n67,
2148 const SMDS_MeshNode * n78,
2149 const SMDS_MeshNode * n85,
2150 const SMDS_MeshNode * n15,
2151 const SMDS_MeshNode * n26,
2152 const SMDS_MeshNode * n37,
2153 const SMDS_MeshNode * n48,
2154 const SMDS_MeshNode * n1234,
2155 const SMDS_MeshNode * n1256,
2156 const SMDS_MeshNode * n2367,
2157 const SMDS_MeshNode * n3478,
2158 const SMDS_MeshNode * n1458,
2159 const SMDS_MeshNode * n5678,
2160 const SMDS_MeshNode * nCenter)
2162 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
2166 n1234,n1256,n2367,n3478,n1458,n5678,nCenter);
2168 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
2169 n3->GetID(), n4->GetID(), n5->GetID(),
2170 n6->GetID(), n7->GetID(), n8->GetID(),
2171 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2172 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2173 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2174 n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
2175 n1458->GetID(),n5678->GetID(),nCenter->GetID());
2179 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
2180 smIdType n5, smIdType n6, smIdType n7, smIdType n8,
2181 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
2182 smIdType n56,smIdType n67,smIdType n78,smIdType n85,
2183 smIdType n15,smIdType n26,smIdType n37,smIdType n48,
2184 smIdType n1234,smIdType n1256,smIdType n2367,smIdType n3478,
2185 smIdType n1458,smIdType n5678,smIdType nCenter,
2188 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
2192 n1234, n1256, n2367, n3478,
2193 n1458, n5678, nCenter,
2195 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
2196 n56,n67,n78,n85,n15,n26,n37,n48,
2197 n1234, n1256, n2367, n3478,
2198 n1458, n5678, nCenter);
2202 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2203 const SMDS_MeshNode * n2,
2204 const SMDS_MeshNode * n3,
2205 const SMDS_MeshNode * n4,
2206 const SMDS_MeshNode * n5,
2207 const SMDS_MeshNode * n6,
2208 const SMDS_MeshNode * n7,
2209 const SMDS_MeshNode * n8,
2210 const SMDS_MeshNode * n12,
2211 const SMDS_MeshNode * n23,
2212 const SMDS_MeshNode * n34,
2213 const SMDS_MeshNode * n41,
2214 const SMDS_MeshNode * n56,
2215 const SMDS_MeshNode * n67,
2216 const SMDS_MeshNode * n78,
2217 const SMDS_MeshNode * n85,
2218 const SMDS_MeshNode * n15,
2219 const SMDS_MeshNode * n26,
2220 const SMDS_MeshNode * n37,
2221 const SMDS_MeshNode * n48,
2222 const SMDS_MeshNode * n1234,
2223 const SMDS_MeshNode * n1256,
2224 const SMDS_MeshNode * n2367,
2225 const SMDS_MeshNode * n3478,
2226 const SMDS_MeshNode * n1458,
2227 const SMDS_MeshNode * n5678,
2228 const SMDS_MeshNode * nCenter,
2231 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
2232 n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
2233 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2234 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2235 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2236 n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
2237 n1458->GetID(),n5678->GetID(),nCenter->GetID(), ID);
2240 void SMESHDS_Mesh::CompactMesh()
2242 if ( IsCompacted() )
2245 SMDS_Mesh::CompactMesh();
2247 this->myScript->SetModified(true); // notify GUI client for buildPrs when update
2250 void SMESHDS_Mesh::CleanDownWardConnectivity()
2252 myGrid->CleanDownwardConnectivity();
2255 void SMESHDS_Mesh::BuildDownWardConnectivity(bool withEdges)
2257 myGrid->BuildDownwardConnectivity(withEdges);
2260 /*! change some nodes in cell without modifying type or internal connectivity.
2261 * Nodes inverse connectivity is maintained up to date.
2262 * @param vtkVolId vtk id of the cell.
2263 * @param localClonedNodeIds map old node id to new node id.
2264 * @return ok if success.
2266 bool SMESHDS_Mesh::ModifyCellNodes(vtkIdType vtkVolId, std::map<int,int> localClonedNodeIds)
2268 myGrid->ModifyCellNodes(vtkVolId, localClonedNodeIds);