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 std::cout << "Adding " << Index << ':' <<SM<<std::endl;
1332 mySubMeshHolder->Add( Index, SM );
1337 //=======================================================================
1338 //function : AddCompoundSubmesh
1340 //=======================================================================
1342 int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S,
1343 TopAbs_ShapeEnum type)
1346 if ( IsGroupOfSubShapes( S ))
1348 aMainIndex = myIndexToShape.Add( S );
1349 bool all = ( type == TopAbs_SHAPE );
1350 if ( all ) // corresponding simple submesh may exist
1351 aMainIndex = -aMainIndex;
1352 SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex );
1353 if ( !aNewSub->IsComplexSubmesh() ) // is empty
1355 int shapeType = Max( TopAbs_SOLID, all ? myShape.ShapeType() : type );
1356 int typeLimit = all ? TopAbs_VERTEX : type;
1357 for ( ; shapeType <= typeLimit; shapeType++ )
1359 TopExp_Explorer exp( S, TopAbs_ShapeEnum( shapeType ));
1360 for ( ; exp.More(); exp.Next() )
1362 int index = myIndexToShape.FindIndex( exp.Current() );
1364 aNewSub->AddSubMesh( NewSubMesh( index ));
1372 //=======================================================================
1373 //function : IndexToShape
1375 //=======================================================================
1376 const TopoDS_Shape& SMESHDS_Mesh::IndexToShape(int ShapeIndex) const
1380 if ( ShapeIndex > 0 )
1381 return myIndexToShape.FindKey(ShapeIndex);
1386 static TopoDS_Shape nullShape;
1390 //================================================================================
1392 * \brief Return max index of sub-mesh
1394 //================================================================================
1396 int SMESHDS_Mesh::MaxSubMeshIndex() const
1398 return mySubMeshHolder->GetMaxID();
1401 //=======================================================================
1402 //function : ShapeToIndex
1404 //=======================================================================
1405 int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const
1407 int index = myIndexToShape.FindIndex(S);
1411 //=======================================================================
1412 //function : SetNodeOnVolume
1414 //=======================================================================
1415 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index)
1417 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1418 ((SMDS_MeshNode*) aNode)->SetPosition( SMDS_SpacePosition::originSpacePosition(), shapeID );
1421 //=======================================================================
1422 //function : SetNodeOnFace
1424 //=======================================================================
1425 void SMESHDS_Mesh::SetNodeOnFace(const SMDS_MeshNode* aNode, int Index, double u, double v)
1427 //Set Position on Node
1428 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1429 const_cast< SMDS_MeshNode* >
1430 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition( u, v )), shapeID );
1433 //=======================================================================
1434 //function : SetNodeOnEdge
1436 //=======================================================================
1437 void SMESHDS_Mesh::SetNodeOnEdge(const SMDS_MeshNode* aNode,
1441 //Set Position on Node
1442 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1443 const_cast< SMDS_MeshNode* >
1444 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition( u )), shapeID );
1447 //=======================================================================
1448 //function : SetNodeOnVertex
1450 //=======================================================================
1451 void SMESHDS_Mesh::SetNodeOnVertex(const SMDS_MeshNode* aNode, int Index)
1453 //Set Position on Node
1454 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1455 const_cast< SMDS_MeshNode* >
1456 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition()), shapeID );
1459 //=======================================================================
1460 //function : SetMeshElementOnShape
1462 //=======================================================================
1463 void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement,
1466 add( anElement, NewSubMesh( Index ));
1469 //=======================================================================
1470 //function : ~SMESHDS_Mesh
1472 //=======================================================================
1473 SMESHDS_Mesh::~SMESHDS_Mesh()
1478 delete mySubMeshHolder;
1482 //********************************************************************
1483 //********************************************************************
1484 //******** *********
1485 //***** Methods for addition of quadratic elements ******
1486 //******** *********
1487 //********************************************************************
1488 //********************************************************************
1490 //=======================================================================
1491 //function : AddEdgeWithID
1493 //=======================================================================
1494 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(smIdType n1, smIdType n2, smIdType n12, smIdType ID)
1496 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,n12,ID);
1497 if(anElem) myScript->AddEdge(ID,n1,n2,n12);
1501 //=======================================================================
1502 //function : AddEdge
1504 //=======================================================================
1505 SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode* n1,
1506 const SMDS_MeshNode* n2,
1507 const SMDS_MeshNode* n12)
1509 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2,n12);
1510 if(anElem) myScript->AddEdge(anElem->GetID(),
1517 //=======================================================================
1518 //function : AddEdgeWithID
1520 //=======================================================================
1521 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
1522 const SMDS_MeshNode * n2,
1523 const SMDS_MeshNode * n12,
1526 return AddEdgeWithID(n1->GetID(),
1533 //=======================================================================
1534 //function : AddFace
1536 //=======================================================================
1537 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1538 const SMDS_MeshNode * n2,
1539 const SMDS_MeshNode * n3,
1540 const SMDS_MeshNode * n12,
1541 const SMDS_MeshNode * n23,
1542 const SMDS_MeshNode * n31)
1544 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31);
1545 if(anElem) myScript->AddFace(anElem->GetID(),
1546 n1->GetID(), n2->GetID(), n3->GetID(),
1547 n12->GetID(), n23->GetID(), n31->GetID());
1551 //=======================================================================
1552 //function : AddFaceWithID
1554 //=======================================================================
1555 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3,
1556 smIdType n12,smIdType n23,smIdType n31, smIdType ID)
1558 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,ID);
1559 if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31);
1563 //=======================================================================
1564 //function : AddFaceWithID
1566 //=======================================================================
1567 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1568 const SMDS_MeshNode * n2,
1569 const SMDS_MeshNode * n3,
1570 const SMDS_MeshNode * n12,
1571 const SMDS_MeshNode * n23,
1572 const SMDS_MeshNode * n31,
1575 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1576 n12->GetID(), n23->GetID(), n31->GetID(),
1580 //=======================================================================
1581 //function : AddFace
1583 //=======================================================================
1584 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1585 const SMDS_MeshNode * n2,
1586 const SMDS_MeshNode * n3,
1587 const SMDS_MeshNode * n12,
1588 const SMDS_MeshNode * n23,
1589 const SMDS_MeshNode * n31,
1590 const SMDS_MeshNode * nCenter)
1592 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31,nCenter);
1593 if(anElem) myScript->AddFace(anElem->GetID(),
1594 n1->GetID(), n2->GetID(), n3->GetID(),
1595 n12->GetID(), n23->GetID(), n31->GetID(),
1600 //=======================================================================
1601 //function : AddFaceWithID
1603 //=======================================================================
1604 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3,
1605 smIdType n12,smIdType n23,smIdType n31, smIdType nCenter, smIdType ID)
1607 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,nCenter,ID);
1608 if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31,nCenter);
1612 //=======================================================================
1613 //function : AddFaceWithID
1615 //=======================================================================
1616 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1617 const SMDS_MeshNode * n2,
1618 const SMDS_MeshNode * n3,
1619 const SMDS_MeshNode * n12,
1620 const SMDS_MeshNode * n23,
1621 const SMDS_MeshNode * n31,
1622 const SMDS_MeshNode * nCenter,
1625 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1626 n12->GetID(), n23->GetID(), n31->GetID(),
1627 nCenter->GetID(), ID);
1631 //=======================================================================
1632 //function : AddFace
1634 //=======================================================================
1635 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1636 const SMDS_MeshNode * n2,
1637 const SMDS_MeshNode * n3,
1638 const SMDS_MeshNode * n4,
1639 const SMDS_MeshNode * n12,
1640 const SMDS_MeshNode * n23,
1641 const SMDS_MeshNode * n34,
1642 const SMDS_MeshNode * n41)
1644 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41);
1645 if(anElem) myScript->AddFace(anElem->GetID(),
1646 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1647 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID());
1651 //=======================================================================
1652 //function : AddFaceWithID
1654 //=======================================================================
1655 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
1656 smIdType n12,smIdType n23,smIdType n34,smIdType n41, smIdType ID)
1658 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,ID);
1659 if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41);
1663 //=======================================================================
1664 //function : AddFaceWithID
1666 //=======================================================================
1667 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1668 const SMDS_MeshNode * n2,
1669 const SMDS_MeshNode * n3,
1670 const SMDS_MeshNode * n4,
1671 const SMDS_MeshNode * n12,
1672 const SMDS_MeshNode * n23,
1673 const SMDS_MeshNode * n34,
1674 const SMDS_MeshNode * n41,
1677 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1678 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1683 //=======================================================================
1684 //function : AddFace
1686 //=======================================================================
1687 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1688 const SMDS_MeshNode * n2,
1689 const SMDS_MeshNode * n3,
1690 const SMDS_MeshNode * n4,
1691 const SMDS_MeshNode * n12,
1692 const SMDS_MeshNode * n23,
1693 const SMDS_MeshNode * n34,
1694 const SMDS_MeshNode * n41,
1695 const SMDS_MeshNode * nCenter)
1697 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
1698 if(anElem) myScript->AddFace(anElem->GetID(),
1699 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1700 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1705 //=======================================================================
1706 //function : AddFaceWithID
1708 //=======================================================================
1709 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
1710 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
1711 smIdType nCenter, smIdType ID)
1713 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,nCenter,ID);
1714 if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
1718 //=======================================================================
1719 //function : AddFaceWithID
1721 //=======================================================================
1722 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1723 const SMDS_MeshNode * n2,
1724 const SMDS_MeshNode * n3,
1725 const SMDS_MeshNode * n4,
1726 const SMDS_MeshNode * n12,
1727 const SMDS_MeshNode * n23,
1728 const SMDS_MeshNode * n34,
1729 const SMDS_MeshNode * n41,
1730 const SMDS_MeshNode * nCenter,
1733 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1734 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1735 nCenter->GetID(), ID);
1739 //=======================================================================
1740 //function : AddVolume
1742 //=======================================================================
1743 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1744 const SMDS_MeshNode * n2,
1745 const SMDS_MeshNode * n3,
1746 const SMDS_MeshNode * n4,
1747 const SMDS_MeshNode * n12,
1748 const SMDS_MeshNode * n23,
1749 const SMDS_MeshNode * n31,
1750 const SMDS_MeshNode * n14,
1751 const SMDS_MeshNode * n24,
1752 const SMDS_MeshNode * n34)
1754 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1755 if(anElem) myScript->AddVolume(anElem->GetID(),
1756 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1757 n12->GetID(), n23->GetID(), n31->GetID(),
1758 n14->GetID(), n24->GetID(), n34->GetID());
1762 //=======================================================================
1763 //function : AddVolumeWithID
1765 //=======================================================================
1766 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
1767 smIdType n12,smIdType n23,smIdType n31,
1768 smIdType n14,smIdType n24,smIdType n34, smIdType ID)
1770 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n12,n23,
1771 n31,n14,n24,n34,ID);
1772 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1776 //=======================================================================
1777 //function : AddVolumeWithID
1778 //purpose : 2d order tetrahedron of 10 nodes
1779 //=======================================================================
1780 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1781 const SMDS_MeshNode * n2,
1782 const SMDS_MeshNode * n3,
1783 const SMDS_MeshNode * n4,
1784 const SMDS_MeshNode * n12,
1785 const SMDS_MeshNode * n23,
1786 const SMDS_MeshNode * n31,
1787 const SMDS_MeshNode * n14,
1788 const SMDS_MeshNode * n24,
1789 const SMDS_MeshNode * n34,
1792 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1793 n12->GetID(), n23->GetID(), n31->GetID(),
1794 n14->GetID(), n24->GetID(), n34->GetID(), ID);
1798 //=======================================================================
1799 //function : AddVolume
1801 //=======================================================================
1802 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1803 const SMDS_MeshNode * n2,
1804 const SMDS_MeshNode * n3,
1805 const SMDS_MeshNode * n4,
1806 const SMDS_MeshNode * n5,
1807 const SMDS_MeshNode * n12,
1808 const SMDS_MeshNode * n23,
1809 const SMDS_MeshNode * n34,
1810 const SMDS_MeshNode * n41,
1811 const SMDS_MeshNode * n15,
1812 const SMDS_MeshNode * n25,
1813 const SMDS_MeshNode * n35,
1814 const SMDS_MeshNode * n45)
1816 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n12,n23,n34,n41,
1819 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1820 n3->GetID(), n4->GetID(), n5->GetID(),
1821 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1822 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID());
1826 //=======================================================================
1827 //function : AddVolumeWithID
1829 //=======================================================================
1830 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType n5,
1831 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
1832 smIdType n15,smIdType n25,smIdType n35,smIdType n45, smIdType ID)
1834 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,
1836 n15,n25,n35,n45,ID);
1837 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n12,n23,n34,n41,
1842 //=======================================================================
1843 //function : AddVolumeWithID
1844 //purpose : 2d order pyramid of 13 nodes
1845 //=======================================================================
1846 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1847 const SMDS_MeshNode * n2,
1848 const SMDS_MeshNode * n3,
1849 const SMDS_MeshNode * n4,
1850 const SMDS_MeshNode * n5,
1851 const SMDS_MeshNode * n12,
1852 const SMDS_MeshNode * n23,
1853 const SMDS_MeshNode * n34,
1854 const SMDS_MeshNode * n41,
1855 const SMDS_MeshNode * n15,
1856 const SMDS_MeshNode * n25,
1857 const SMDS_MeshNode * n35,
1858 const SMDS_MeshNode * n45,
1861 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1862 n4->GetID(), n5->GetID(),
1863 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1864 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID(),
1869 //=======================================================================
1870 //function : AddVolume
1871 //purpose : 2nd order pentahedron (prism) with 15 nodes
1872 //=======================================================================
1873 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1874 const SMDS_MeshNode * n2,
1875 const SMDS_MeshNode * n3,
1876 const SMDS_MeshNode * n4,
1877 const SMDS_MeshNode * n5,
1878 const SMDS_MeshNode * n6,
1879 const SMDS_MeshNode * n12,
1880 const SMDS_MeshNode * n23,
1881 const SMDS_MeshNode * n31,
1882 const SMDS_MeshNode * n45,
1883 const SMDS_MeshNode * n56,
1884 const SMDS_MeshNode * n64,
1885 const SMDS_MeshNode * n14,
1886 const SMDS_MeshNode * n25,
1887 const SMDS_MeshNode * n36)
1889 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n12,n23,n31,
1890 n45,n56,n64,n14,n25,n36);
1892 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1893 n3->GetID(), n4->GetID(), n5->GetID(), n6->GetID(),
1894 n12->GetID(), n23->GetID(), n31->GetID(),
1895 n45->GetID(), n56->GetID(), n64->GetID(),
1896 n14->GetID(), n25->GetID(), n36->GetID());
1900 //=======================================================================
1901 //function : AddVolumeWithID
1902 //purpose : 2nd order pentahedron (prism) with 15 nodes
1903 //=======================================================================
1904 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3,
1905 smIdType n4, smIdType n5, smIdType n6,
1906 smIdType n12,smIdType n23,smIdType n31,
1907 smIdType n45,smIdType n56,smIdType n64,
1908 smIdType n14,smIdType n25,smIdType n36, smIdType ID)
1910 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,
1914 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n12,n23,n31,
1915 n45,n56,n64,n14,n25,n36);
1919 //=======================================================================
1920 //function : AddVolumeWithID
1921 //purpose : 2d order Pentahedron (prism) with 15 nodes
1922 //=======================================================================
1923 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1924 const SMDS_MeshNode * n2,
1925 const SMDS_MeshNode * n3,
1926 const SMDS_MeshNode * n4,
1927 const SMDS_MeshNode * n5,
1928 const SMDS_MeshNode * n6,
1929 const SMDS_MeshNode * n12,
1930 const SMDS_MeshNode * n23,
1931 const SMDS_MeshNode * n31,
1932 const SMDS_MeshNode * n45,
1933 const SMDS_MeshNode * n56,
1934 const SMDS_MeshNode * n64,
1935 const SMDS_MeshNode * n14,
1936 const SMDS_MeshNode * n25,
1937 const SMDS_MeshNode * n36,
1940 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1941 n4->GetID(), n5->GetID(), n6->GetID(),
1942 n12->GetID(), n23->GetID(), n31->GetID(),
1943 n45->GetID(), n56->GetID(), n64->GetID(),
1944 n14->GetID(), n25->GetID(), n36->GetID(),
1947 //=======================================================================
1948 //function : AddVolume
1949 //purpose : 2nd order pentahedron (prism) with 18 nodes
1950 //=======================================================================
1951 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1952 const SMDS_MeshNode * n2,
1953 const SMDS_MeshNode * n3,
1954 const SMDS_MeshNode * n4,
1955 const SMDS_MeshNode * n5,
1956 const SMDS_MeshNode * n6,
1957 const SMDS_MeshNode * n12,
1958 const SMDS_MeshNode * n23,
1959 const SMDS_MeshNode * n31,
1960 const SMDS_MeshNode * n45,
1961 const SMDS_MeshNode * n56,
1962 const SMDS_MeshNode * n64,
1963 const SMDS_MeshNode * n14,
1964 const SMDS_MeshNode * n25,
1965 const SMDS_MeshNode * n36,
1966 const SMDS_MeshNode * n1245,
1967 const SMDS_MeshNode * n2356,
1968 const SMDS_MeshNode * n1346)
1970 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n12,n23,n31,
1971 n45,n56,n64,n14,n25,n36,
1972 n1245, n2356, n1346);
1974 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1975 n3->GetID(), n4->GetID(), n5->GetID(), n6->GetID(),
1976 n12->GetID(), n23->GetID(), n31->GetID(),
1977 n45->GetID(), n56->GetID(), n64->GetID(),
1978 n14->GetID(), n25->GetID(), n36->GetID(),
1979 n1245->GetID(), n2356->GetID(), n1346->GetID());
1983 //=======================================================================
1984 //function : AddVolumeWithID
1985 //purpose : 2nd order pentahedron (prism) with 18 nodes
1986 //=======================================================================
1987 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3,
1988 smIdType n4, smIdType n5, smIdType n6,
1989 smIdType n12,smIdType n23,smIdType n31,
1990 smIdType n45,smIdType n56,smIdType n64,
1991 smIdType n14,smIdType n25,smIdType n36,
1992 smIdType n1245, smIdType n2356, smIdType n1346,
1995 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,
1999 n1245, n2356, n1346, ID);
2000 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n12,n23,n31,
2001 n45,n56,n64,n14,n25,n36, n1245, n2356, n1346);
2005 //=======================================================================
2006 //function : AddVolumeWithID
2007 //purpose : 2d order Pentahedron with 18 nodes
2008 //=======================================================================
2009 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2010 const SMDS_MeshNode * n2,
2011 const SMDS_MeshNode * n3,
2012 const SMDS_MeshNode * n4,
2013 const SMDS_MeshNode * n5,
2014 const SMDS_MeshNode * n6,
2015 const SMDS_MeshNode * n12,
2016 const SMDS_MeshNode * n23,
2017 const SMDS_MeshNode * n31,
2018 const SMDS_MeshNode * n45,
2019 const SMDS_MeshNode * n56,
2020 const SMDS_MeshNode * n64,
2021 const SMDS_MeshNode * n14,
2022 const SMDS_MeshNode * n25,
2023 const SMDS_MeshNode * n36,
2024 const SMDS_MeshNode * n1245,
2025 const SMDS_MeshNode * n2356,
2026 const SMDS_MeshNode * n1346,
2029 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
2030 n4->GetID(), n5->GetID(), n6->GetID(),
2031 n12->GetID(), n23->GetID(), n31->GetID(),
2032 n45->GetID(), n56->GetID(), n64->GetID(),
2033 n14->GetID(), n25->GetID(), n36->GetID(),
2034 n1245->GetID(), n2356->GetID(), n1346->GetID(), ID);
2038 //=======================================================================
2039 //function : AddVolume
2040 //purpose : add quadratic hexahedron
2041 //=======================================================================
2042 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2043 const SMDS_MeshNode * n2,
2044 const SMDS_MeshNode * n3,
2045 const SMDS_MeshNode * n4,
2046 const SMDS_MeshNode * n5,
2047 const SMDS_MeshNode * n6,
2048 const SMDS_MeshNode * n7,
2049 const SMDS_MeshNode * n8,
2050 const SMDS_MeshNode * n12,
2051 const SMDS_MeshNode * n23,
2052 const SMDS_MeshNode * n34,
2053 const SMDS_MeshNode * n41,
2054 const SMDS_MeshNode * n56,
2055 const SMDS_MeshNode * n67,
2056 const SMDS_MeshNode * n78,
2057 const SMDS_MeshNode * n85,
2058 const SMDS_MeshNode * n15,
2059 const SMDS_MeshNode * n26,
2060 const SMDS_MeshNode * n37,
2061 const SMDS_MeshNode * n48)
2063 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
2068 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
2069 n3->GetID(), n4->GetID(), n5->GetID(),
2070 n6->GetID(), n7->GetID(), n8->GetID(),
2071 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2072 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2073 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID());
2077 //=======================================================================
2078 //function : AddVolumeWithID
2080 //=======================================================================
2081 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
2082 smIdType n5, smIdType n6, smIdType n7, smIdType n8,
2083 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
2084 smIdType n56,smIdType n67,smIdType n78,smIdType n85,
2085 smIdType n15,smIdType n26,smIdType n37,smIdType n48, smIdType ID)
2087 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
2090 n15,n26,n37,n48,ID);
2091 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
2092 n56,n67,n78,n85,n15,n26,n37,n48);
2096 //=======================================================================
2097 //function : AddVolumeWithID
2098 //purpose : 2d order Hexahedrons with 20 nodes
2099 //=======================================================================
2100 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2101 const SMDS_MeshNode * n2,
2102 const SMDS_MeshNode * n3,
2103 const SMDS_MeshNode * n4,
2104 const SMDS_MeshNode * n5,
2105 const SMDS_MeshNode * n6,
2106 const SMDS_MeshNode * n7,
2107 const SMDS_MeshNode * n8,
2108 const SMDS_MeshNode * n12,
2109 const SMDS_MeshNode * n23,
2110 const SMDS_MeshNode * n34,
2111 const SMDS_MeshNode * n41,
2112 const SMDS_MeshNode * n56,
2113 const SMDS_MeshNode * n67,
2114 const SMDS_MeshNode * n78,
2115 const SMDS_MeshNode * n85,
2116 const SMDS_MeshNode * n15,
2117 const SMDS_MeshNode * n26,
2118 const SMDS_MeshNode * n37,
2119 const SMDS_MeshNode * n48,
2122 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
2123 n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
2124 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2125 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2126 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2130 //=======================================================================
2131 //function : AddVolume
2132 //purpose : add tri-quadratic hexahedron of 27 nodes
2133 //=======================================================================
2135 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2136 const SMDS_MeshNode * n2,
2137 const SMDS_MeshNode * n3,
2138 const SMDS_MeshNode * n4,
2139 const SMDS_MeshNode * n5,
2140 const SMDS_MeshNode * n6,
2141 const SMDS_MeshNode * n7,
2142 const SMDS_MeshNode * n8,
2143 const SMDS_MeshNode * n12,
2144 const SMDS_MeshNode * n23,
2145 const SMDS_MeshNode * n34,
2146 const SMDS_MeshNode * n41,
2147 const SMDS_MeshNode * n56,
2148 const SMDS_MeshNode * n67,
2149 const SMDS_MeshNode * n78,
2150 const SMDS_MeshNode * n85,
2151 const SMDS_MeshNode * n15,
2152 const SMDS_MeshNode * n26,
2153 const SMDS_MeshNode * n37,
2154 const SMDS_MeshNode * n48,
2155 const SMDS_MeshNode * n1234,
2156 const SMDS_MeshNode * n1256,
2157 const SMDS_MeshNode * n2367,
2158 const SMDS_MeshNode * n3478,
2159 const SMDS_MeshNode * n1458,
2160 const SMDS_MeshNode * n5678,
2161 const SMDS_MeshNode * nCenter)
2163 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
2167 n1234,n1256,n2367,n3478,n1458,n5678,nCenter);
2169 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
2170 n3->GetID(), n4->GetID(), n5->GetID(),
2171 n6->GetID(), n7->GetID(), n8->GetID(),
2172 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2173 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2174 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2175 n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
2176 n1458->GetID(),n5678->GetID(),nCenter->GetID());
2180 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
2181 smIdType n5, smIdType n6, smIdType n7, smIdType n8,
2182 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
2183 smIdType n56,smIdType n67,smIdType n78,smIdType n85,
2184 smIdType n15,smIdType n26,smIdType n37,smIdType n48,
2185 smIdType n1234,smIdType n1256,smIdType n2367,smIdType n3478,
2186 smIdType n1458,smIdType n5678,smIdType nCenter,
2189 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
2193 n1234, n1256, n2367, n3478,
2194 n1458, n5678, nCenter,
2196 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
2197 n56,n67,n78,n85,n15,n26,n37,n48,
2198 n1234, n1256, n2367, n3478,
2199 n1458, n5678, nCenter);
2203 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2204 const SMDS_MeshNode * n2,
2205 const SMDS_MeshNode * n3,
2206 const SMDS_MeshNode * n4,
2207 const SMDS_MeshNode * n5,
2208 const SMDS_MeshNode * n6,
2209 const SMDS_MeshNode * n7,
2210 const SMDS_MeshNode * n8,
2211 const SMDS_MeshNode * n12,
2212 const SMDS_MeshNode * n23,
2213 const SMDS_MeshNode * n34,
2214 const SMDS_MeshNode * n41,
2215 const SMDS_MeshNode * n56,
2216 const SMDS_MeshNode * n67,
2217 const SMDS_MeshNode * n78,
2218 const SMDS_MeshNode * n85,
2219 const SMDS_MeshNode * n15,
2220 const SMDS_MeshNode * n26,
2221 const SMDS_MeshNode * n37,
2222 const SMDS_MeshNode * n48,
2223 const SMDS_MeshNode * n1234,
2224 const SMDS_MeshNode * n1256,
2225 const SMDS_MeshNode * n2367,
2226 const SMDS_MeshNode * n3478,
2227 const SMDS_MeshNode * n1458,
2228 const SMDS_MeshNode * n5678,
2229 const SMDS_MeshNode * nCenter,
2232 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
2233 n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
2234 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2235 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2236 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2237 n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
2238 n1458->GetID(),n5678->GetID(),nCenter->GetID(), ID);
2241 void SMESHDS_Mesh::CompactMesh()
2243 if ( IsCompacted() )
2246 SMDS_Mesh::CompactMesh();
2248 this->myScript->SetModified(true); // notify GUI client for buildPrs when update
2251 void SMESHDS_Mesh::CleanDownWardConnectivity()
2253 myGrid->CleanDownwardConnectivity();
2256 void SMESHDS_Mesh::BuildDownWardConnectivity(bool withEdges)
2258 myGrid->BuildDownwardConnectivity(withEdges);
2261 /*! change some nodes in cell without modifying type or internal connectivity.
2262 * Nodes inverse connectivity is maintained up to date.
2263 * @param vtkVolId vtk id of the cell.
2264 * @param localClonedNodeIds map old node id to new node id.
2265 * @return ok if success.
2267 bool SMESHDS_Mesh::ModifyCellNodes(vtkIdType vtkVolId, std::map<int,int> localClonedNodeIds)
2269 myGrid->ModifyCellNodes(vtkVolId, localClonedNodeIds);