1 // Copyright (C) 2007-2024 CEA, EDF, 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 <BRep_Tool.hxx>
42 #include <TopExp_Explorer.hxx>
43 #include <TopoDS_Edge.hxx>
44 #include <TopoDS_Face.hxx>
45 #include <TopoDS_Iterator.hxx>
46 #include <TopoDS_Shell.hxx>
47 #include <TopoDS_Solid.hxx>
48 #include <TopoDS_Vertex.hxx>
50 #include <Standard_ErrorHandler.hxx>
51 #include <Standard_OutOfRange.hxx>
53 #include "utilities.h"
55 class SMESHDS_Mesh::SubMeshHolder : public SMESHDS_TSubMeshHolder< const SMESHDS_SubMesh >
59 //=======================================================================
62 //=======================================================================
63 SMESHDS_Mesh::SMESHDS_Mesh(int theMeshID, bool theIsEmbeddedMode):
64 mySubMeshHolder( new SubMeshHolder ),
65 myIsEmbeddedMode(theIsEmbeddedMode)
67 myScript = new SMESHDS_Script(theIsEmbeddedMode);
69 SetPersistentId(theMeshID);
72 //=======================================================================
73 bool SMESHDS_Mesh::IsEmbeddedMode()
75 return myIsEmbeddedMode;
78 //================================================================================
80 * \brief Store ID persistent during lifecycle
82 * Initially it was used to have a persistent reference to the mesh from the hypothesis
84 //================================================================================
86 void SMESHDS_Mesh::SetPersistentId(int id)
91 //================================================================================
93 * \brief Return ID persistent during lifecycle
95 //================================================================================
97 int SMESHDS_Mesh::GetPersistentId() const
99 return myPersistentID;
102 //=======================================================================
103 //function : ShapeToMesh
105 //=======================================================================
106 void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S)
108 if ( !myShape.IsNull() && S.IsNull() ) // case: "save study" after geometry removal
110 // removal of a shape to mesh, delete ...
112 myShapeToHypothesis.Clear();
113 // - shape indices in SMDS_Position of nodes
114 SMESHDS_SubMeshIteratorPtr smIt = SubMeshes();
115 while ( SMESHDS_SubMesh* sm = const_cast< SMESHDS_SubMesh* >( smIt->next() )) {
116 if ( !sm->IsComplexSubmesh() ) {
117 SMDS_NodeIteratorPtr nIt = sm->GetNodes();
118 while ( nIt->more() )
119 sm->RemoveNode(nIt->next());
123 mySubMeshHolder->DeleteAll();
125 myIndexToShape.Clear();
126 // - groups on geometry
127 std::set<SMESHDS_GroupBase*>::iterator gr = myGroups.begin();
128 while ( gr != myGroups.end() ) {
129 if ( dynamic_cast<SMESHDS_GroupOnGeom*>( *gr ))
130 myGroups.erase( gr++ );
138 TopExp::MapShapes(myShape, myIndexToShape);
141 SMDS_Mesh::setNbShapes( MaxShapeIndex() );
144 //=======================================================================
145 //function : AddHypothesis
147 //=======================================================================
149 bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS,
150 const SMESHDS_Hypothesis * H)
152 if (!myShapeToHypothesis.IsBound(SS/*.Oriented(TopAbs_FORWARD)*/)) {
153 std::list<const SMESHDS_Hypothesis *> aList;
154 myShapeToHypothesis.Bind(SS/*.Oriented(TopAbs_FORWARD)*/, aList);
156 std::list<const SMESHDS_Hypothesis *>& alist =
157 myShapeToHypothesis(SS/*.Oriented(TopAbs_FORWARD)*/); // ignore orientation of SS
159 //Check if the Hypothesis is still present
160 std::list<const SMESHDS_Hypothesis*>::iterator ith = find(alist.begin(),alist.end(), H );
162 if (alist.end() != ith) return false;
168 //=======================================================================
169 //function : RemoveHypothesis
171 //=======================================================================
173 bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S,
174 const SMESHDS_Hypothesis * H)
176 if( myShapeToHypothesis.IsBound( S/*.Oriented(TopAbs_FORWARD)*/ ) )
178 std::list<const SMESHDS_Hypothesis *>& alist=myShapeToHypothesis.ChangeFind( S/*.Oriented(TopAbs_FORWARD)*/ );
179 std::list<const SMESHDS_Hypothesis*>::iterator ith=find(alist.begin(),alist.end(), H );
180 if (ith != alist.end())
189 //=======================================================================
192 //=======================================================================
193 SMDS_MeshNode* SMESHDS_Mesh::AddNode(double x, double y, double z)
195 SMDS_MeshNode* node = SMDS_Mesh::AddNode(x, y, z);
196 if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
200 SMDS_MeshNode* SMESHDS_Mesh::AddNodeWithID(double x, double y, double z, smIdType ID)
202 SMDS_MeshNode* node = SMDS_Mesh::AddNodeWithID(x,y,z,ID);
203 if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
207 //=======================================================================
208 //function : MoveNode
210 //=======================================================================
212 void SMESHDS_Mesh::MoveNode(const SMDS_MeshNode *n, double x, double y, double z)
214 SMDS_Mesh::MoveNode( n, x, y, z );
215 myScript->MoveNode(n->GetID(), x, y, z);
218 //=======================================================================
219 //function : ChangeElementNodes
220 //purpose : Changed nodes of an element provided that nb of nodes does not change
221 //=======================================================================
223 bool SMESHDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem,
224 const SMDS_MeshNode * nodes[],
227 if ( ! SMDS_Mesh::ChangeElementNodes( elem, nodes, nbnodes ))
230 std::vector<smIdType> IDs( nbnodes );
231 for ( smIdType i = 0; i < nbnodes; i++ )
232 IDs [ i ] = nodes[ i ]->GetID();
233 myScript->ChangeElementNodes( elem->GetID(), &IDs[0], nbnodes);
238 //=======================================================================
239 //function : ChangePolygonNodes
241 //=======================================================================
242 bool SMESHDS_Mesh::ChangePolygonNodes (const SMDS_MeshElement * elem,
243 std::vector<const SMDS_MeshNode*>& nodes)
245 ASSERT(nodes.size() > 3);
247 return ChangeElementNodes(elem, &nodes[0], nodes.size());
250 //=======================================================================
251 //function : ChangePolyhedronNodes
253 //=======================================================================
255 ::ChangePolyhedronNodes (const SMDS_MeshElement * elem,
256 const std::vector<const SMDS_MeshNode*>& nodes,
257 const std::vector<int> & quantities)
259 ASSERT(nodes.size() > 3);
261 size_t i, len = nodes.size();
262 std::vector<smIdType> nodes_ids( len );
263 for ( i = 0; i < len; i++ )
264 nodes_ids[i] = nodes[i]->GetID();
266 if ( !SMDS_Mesh::ChangePolyhedronNodes( elem, nodes, quantities ))
269 myScript->ChangePolyhedronNodes(elem->GetID(), nodes_ids, quantities);
274 //=======================================================================
275 //function : Renumber
277 //=======================================================================
279 void SMESHDS_Mesh::Renumber (const bool /*isNodes*/, const smIdType /*startID*/, const smIdType /*deltaID*/)
281 // TODO not possible yet to have node numbers not starting to O and continuous.
282 if ( !this->IsCompacted() )
284 // SMDS_Mesh::Renumber( isNodes, startID, deltaID );
285 // myScript->Renumber( isNodes, startID, deltaID );
288 //=======================================================================
289 //function : Add0DElement
291 //=======================================================================
292 SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElementWithID(smIdType nodeID, smIdType ID)
294 SMDS_Mesh0DElement* anElem = SMDS_Mesh::Add0DElementWithID(nodeID, ID);
295 if (anElem) myScript->Add0DElement(ID, nodeID);
299 SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElementWithID
300 (const SMDS_MeshNode * node, smIdType ID)
302 return Add0DElementWithID(node->GetID(), ID);
305 SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElement(const SMDS_MeshNode * node)
307 SMDS_Mesh0DElement* anElem = SMDS_Mesh::Add0DElement(node);
308 if (anElem) myScript->Add0DElement(anElem->GetID(), node->GetID());
312 //=======================================================================
313 //function :AddBallWithID
315 //=======================================================================
317 SMDS_BallElement* SMESHDS_Mesh::AddBallWithID(smIdType node, double diameter, smIdType ID)
319 SMDS_BallElement* anElem = SMDS_Mesh::AddBallWithID(node,diameter,ID);
320 if (anElem) myScript->AddBall(anElem->GetID(), node, diameter);
324 SMDS_BallElement* SMESHDS_Mesh::AddBallWithID(const SMDS_MeshNode * node,
328 SMDS_BallElement* anElem = SMDS_Mesh::AddBallWithID(node,diameter,ID);
329 if (anElem) myScript->AddBall(anElem->GetID(), node->GetID(), diameter);
333 SMDS_BallElement* SMESHDS_Mesh::AddBall (const SMDS_MeshNode * node,
336 SMDS_BallElement* anElem = SMDS_Mesh::AddBall(node,diameter);
337 if (anElem) myScript->AddBall(anElem->GetID(), node->GetID(), diameter);
341 //=======================================================================
342 //function :AddEdgeWithID
344 //=======================================================================
346 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(smIdType n1, smIdType n2, smIdType ID)
348 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,ID);
349 if(anElem) myScript->AddEdge(ID,n1,n2);
353 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
354 const SMDS_MeshNode * n2,
357 return AddEdgeWithID(n1->GetID(),
362 SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode * n1,
363 const SMDS_MeshNode * n2)
365 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2);
366 if(anElem) myScript->AddEdge(anElem->GetID(),
372 //=======================================================================
375 //=======================================================================
376 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType ID)
378 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, ID);
379 if(anElem) myScript->AddFace(ID,n1,n2,n3);
383 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
384 const SMDS_MeshNode * n2,
385 const SMDS_MeshNode * n3,
388 return AddFaceWithID(n1->GetID(),
394 SMDS_MeshFace* SMESHDS_Mesh::AddFace( const SMDS_MeshNode * n1,
395 const SMDS_MeshNode * n2,
396 const SMDS_MeshNode * n3)
398 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3);
399 if(anElem) myScript->AddFace(anElem->GetID(),
406 //=======================================================================
409 //=======================================================================
410 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType ID)
412 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, n4, ID);
413 if(anElem) myScript->AddFace(ID, n1, n2, n3, n4);
417 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
418 const SMDS_MeshNode * n2,
419 const SMDS_MeshNode * n3,
420 const SMDS_MeshNode * n4,
423 return AddFaceWithID(n1->GetID(),
430 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
431 const SMDS_MeshNode * n2,
432 const SMDS_MeshNode * n3,
433 const SMDS_MeshNode * n4)
435 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3, n4);
436 if(anElem) myScript->AddFace(anElem->GetID(),
444 //=======================================================================
445 //function :AddVolume
447 //=======================================================================
448 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType ID)
450 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID);
451 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4);
455 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
456 const SMDS_MeshNode * n2,
457 const SMDS_MeshNode * n3,
458 const SMDS_MeshNode * n4,
461 return AddVolumeWithID(n1->GetID(),
468 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
469 const SMDS_MeshNode * n2,
470 const SMDS_MeshNode * n3,
471 const SMDS_MeshNode * n4)
473 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4);
474 if(anElem) myScript->AddVolume(anElem->GetID(),
482 //=======================================================================
483 //function :AddVolume
485 //=======================================================================
486 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType n5, smIdType ID)
488 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID);
489 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5);
493 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
494 const SMDS_MeshNode * n2,
495 const SMDS_MeshNode * n3,
496 const SMDS_MeshNode * n4,
497 const SMDS_MeshNode * n5,
500 return AddVolumeWithID(n1->GetID(),
508 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
509 const SMDS_MeshNode * n2,
510 const SMDS_MeshNode * n3,
511 const SMDS_MeshNode * n4,
512 const SMDS_MeshNode * n5)
514 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5);
515 if(anElem) myScript->AddVolume(anElem->GetID(),
524 //=======================================================================
525 //function :AddVolume
527 //=======================================================================
528 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType n5, smIdType n6, smIdType ID)
530 SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID);
531 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6);
535 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
536 const SMDS_MeshNode * n2,
537 const SMDS_MeshNode * n3,
538 const SMDS_MeshNode * n4,
539 const SMDS_MeshNode * n5,
540 const SMDS_MeshNode * n6,
543 return AddVolumeWithID(n1->GetID(),
552 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
553 const SMDS_MeshNode * n2,
554 const SMDS_MeshNode * n3,
555 const SMDS_MeshNode * n4,
556 const SMDS_MeshNode * n5,
557 const SMDS_MeshNode * n6)
559 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6);
560 if(anElem) myScript->AddVolume(anElem->GetID(),
570 //=======================================================================
571 //function :AddVolume
573 //=======================================================================
574 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType n5, smIdType n6, smIdType n7, smIdType n8, smIdType ID)
576 SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID);
577 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8);
581 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
582 const SMDS_MeshNode * n2,
583 const SMDS_MeshNode * n3,
584 const SMDS_MeshNode * n4,
585 const SMDS_MeshNode * n5,
586 const SMDS_MeshNode * n6,
587 const SMDS_MeshNode * n7,
588 const SMDS_MeshNode * n8,
591 return AddVolumeWithID(n1->GetID(),
602 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
603 const SMDS_MeshNode * n2,
604 const SMDS_MeshNode * n3,
605 const SMDS_MeshNode * n4,
606 const SMDS_MeshNode * n5,
607 const SMDS_MeshNode * n6,
608 const SMDS_MeshNode * n7,
609 const SMDS_MeshNode * n8)
611 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8);
612 if(anElem) myScript->AddVolume(anElem->GetID(),
625 //=======================================================================
626 //function :AddVolume
627 //purpose : add hexagonal prism
628 //=======================================================================
629 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
630 smIdType n5, smIdType n6, smIdType n7, smIdType n8,
631 smIdType n9, smIdType n10, smIdType n11, smIdType n12,
634 SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, ID);
635 if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
639 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
640 const SMDS_MeshNode * n2,
641 const SMDS_MeshNode * n3,
642 const SMDS_MeshNode * n4,
643 const SMDS_MeshNode * n5,
644 const SMDS_MeshNode * n6,
645 const SMDS_MeshNode * n7,
646 const SMDS_MeshNode * n8,
647 const SMDS_MeshNode * n9,
648 const SMDS_MeshNode * n10,
649 const SMDS_MeshNode * n11,
650 const SMDS_MeshNode * n12,
653 return AddVolumeWithID(n1->GetID(),
668 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
669 const SMDS_MeshNode * n2,
670 const SMDS_MeshNode * n3,
671 const SMDS_MeshNode * n4,
672 const SMDS_MeshNode * n5,
673 const SMDS_MeshNode * n6,
674 const SMDS_MeshNode * n7,
675 const SMDS_MeshNode * n8,
676 const SMDS_MeshNode * n9,
677 const SMDS_MeshNode * n10,
678 const SMDS_MeshNode * n11,
679 const SMDS_MeshNode * n12)
681 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
682 if(anElem) myScript->AddVolume(anElem->GetID(),
699 //=======================================================================
700 //function : AddPolygonalFace
702 //=======================================================================
703 SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID (const std::vector<smIdType>& nodes_ids,
706 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes_ids, ID);
708 myScript->AddPolygonalFace(ID, nodes_ids);
714 SMESHDS_Mesh::AddPolygonalFaceWithID (const std::vector<const SMDS_MeshNode*>& nodes,
717 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID);
719 smIdType i, len = nodes.size();
720 std::vector<smIdType> nodes_ids (len);
721 for (i = 0; i < len; i++) {
722 nodes_ids[i] = nodes[i]->GetID();
724 myScript->AddPolygonalFace(ID, nodes_ids);
730 SMESHDS_Mesh::AddPolygonalFace (const std::vector<const SMDS_MeshNode*>& nodes)
732 SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFace(nodes);
734 smIdType i, len = nodes.size();
735 std::vector<smIdType> nodes_ids (len);
736 for (i = 0; i < len; i++) {
737 nodes_ids[i] = nodes[i]->GetID();
739 myScript->AddPolygonalFace(anElem->GetID(), nodes_ids);
745 //=======================================================================
746 //function : AddQuadPolygonalFace
748 //=======================================================================
749 SMDS_MeshFace* SMESHDS_Mesh::AddQuadPolygonalFaceWithID (const std::vector<smIdType>& nodes_ids,
752 SMDS_MeshFace *anElem = SMDS_Mesh::AddQuadPolygonalFaceWithID(nodes_ids, ID);
754 myScript->AddQuadPolygonalFace(ID, nodes_ids);
760 SMESHDS_Mesh::AddQuadPolygonalFaceWithID (const std::vector<const SMDS_MeshNode*>& nodes,
763 SMDS_MeshFace *anElem = SMDS_Mesh::AddQuadPolygonalFaceWithID(nodes, ID);
765 smIdType i, len = nodes.size();
766 std::vector<smIdType> nodes_ids (len);
767 for (i = 0; i < len; i++) {
768 nodes_ids[i] = nodes[i]->GetID();
770 myScript->AddQuadPolygonalFace(ID, nodes_ids);
776 SMESHDS_Mesh::AddQuadPolygonalFace (const std::vector<const SMDS_MeshNode*>& nodes)
778 SMDS_MeshFace *anElem = SMDS_Mesh::AddQuadPolygonalFace(nodes);
780 smIdType i, len = nodes.size();
781 std::vector<smIdType> nodes_ids (len);
782 for (i = 0; i < len; i++) {
783 nodes_ids[i] = nodes[i]->GetID();
785 myScript->AddQuadPolygonalFace(anElem->GetID(), nodes_ids);
791 //=======================================================================
792 //function : AddPolyhedralVolume
794 //=======================================================================
795 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID (const std::vector<smIdType>& nodes_ids,
796 const std::vector<int>& quantities,
799 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes_ids, quantities, ID);
801 myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
806 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID
807 (const std::vector<const SMDS_MeshNode*>& nodes,
808 const std::vector<int>& quantities,
811 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
813 smIdType i, len = nodes.size();
814 std::vector<smIdType> nodes_ids (len);
815 for (i = 0; i < len; i++) {
816 nodes_ids[i] = nodes[i]->GetID();
818 myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
823 SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolume
824 (const std::vector<const SMDS_MeshNode*>& nodes,
825 const std::vector<int>& quantities)
827 SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolume(nodes, quantities);
829 smIdType i, len = nodes.size();
830 std::vector<smIdType> nodes_ids (len);
831 for (i = 0; i < len; i++) {
832 nodes_ids[i] = nodes[i]->GetID();
834 myScript->AddPolyhedralVolume(anElem->GetID(), nodes_ids, quantities);
839 //=======================================================================
840 //function : removeFromContainers
842 //=======================================================================
844 static void removeFromContainers (SMESHDS_Mesh* /*theMesh*/,
845 std::set<SMESHDS_GroupBase*>& theGroups,
846 std::vector<const SMDS_MeshElement*>& theElems)
848 if ( theElems.empty() )
852 // Element can belong to several groups
853 if ( !theGroups.empty() )
855 std::set<SMESHDS_GroupBase*>::iterator GrIt = theGroups.begin();
856 for ( ; GrIt != theGroups.end(); GrIt++ )
858 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>( *GrIt );
859 if ( !group || group->IsEmpty() ) continue;
861 std::vector<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
862 for ( ; elIt != theElems.end(); elIt++ )
864 group->SMDSGroup().Remove( *elIt );
865 if ( group->IsEmpty() ) break;
870 //const bool deleted=true;
872 // Rm from sub-meshes
873 // Element should belong to only one sub-mesh
874 // if ( theMesh->SubMeshes()->more() )
876 // std::list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
878 // for ( ; elIt != theElems.end(); ++elIt )
879 // if ( SMESHDS_SubMesh* sm = theMesh->MeshElements( (*elIt)->getshapeId() ))
880 // sm->RemoveNode( static_cast<const SMDS_MeshNode*> (*elIt), deleted );
883 // for ( ; elIt != theElems.end(); ++elIt )
884 // if ( SMESHDS_SubMesh* sm = theMesh->MeshElements( (*elIt)->getshapeId() ))
885 // sm->RemoveElement( *elIt, deleted );
890 //=======================================================================
891 //function : RemoveNode
893 //=======================================================================
894 void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n)
896 if ( RemoveFreeNode( n, 0, true ))
899 myScript->RemoveNode(n->GetID());
901 // remove inverse elements from the sub-meshes
902 for ( SMDS_ElemIteratorPtr eIt = n->GetInverseElementIterator(); eIt->more() ; )
904 const SMDS_MeshElement* e = eIt->next();
905 if ( SMESHDS_SubMesh * sm = MeshElements( e->getshapeId() ))
906 sm->RemoveElement( e );
908 if ( SMESHDS_SubMesh * sm = MeshElements( n->getshapeId() ))
912 std::vector<const SMDS_MeshElement *> removedElems;
913 std::vector<const SMDS_MeshElement *> removedNodes;
915 SMDS_Mesh::RemoveElement( n, removedElems, removedNodes, true );
917 removeFromContainers( this, myGroups, removedElems );
918 removeFromContainers( this, myGroups, removedNodes );
921 //=======================================================================
922 //function : RemoveFreeNode
924 //=======================================================================
925 bool SMESHDS_Mesh::RemoveFreeNode(const SMDS_MeshNode * n,
926 SMESHDS_SubMesh * subMesh,
929 if ( n->NbInverseElements() > 0 )
932 myScript->RemoveNode(n->GetID());
935 // Node can belong to several groups
936 if ( fromGroups && !myGroups.empty() ) {
937 std::set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
938 for (; GrIt != myGroups.end(); GrIt++) {
939 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
940 if (group && group->GetType() == SMDSAbs_Node )
941 group->SMDSGroup().Remove(n);
946 // Node should belong to only one sub-mesh
947 if ( !subMesh || !subMesh->RemoveNode( n ))
948 if (( subMesh = MeshElements( n->getshapeId() )))
949 subMesh->RemoveNode(n);
951 SMDS_Mesh::RemoveFreeElement(n);
956 //=======================================================================
957 //function : RemoveElement
959 //========================================================================
960 void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt)
962 if (elt->GetType() == SMDSAbs_Node)
964 RemoveNode( static_cast<const SMDS_MeshNode*>( elt ));
967 //if (!hasConstructionEdges() && !hasConstructionFaces())
969 SMESHDS_SubMesh* subMesh=0;
970 if ( elt->getshapeId() > 0 )
971 subMesh = MeshElements( elt->getshapeId() );
973 RemoveFreeElement( elt, subMesh, true );
977 myScript->RemoveElement(elt->GetID());
979 std::vector<const SMDS_MeshElement *> removedElems;
980 std::vector<const SMDS_MeshElement *> removedNodes;
982 SMDS_Mesh::RemoveElement(elt, removedElems, removedNodes );
984 removeFromContainers( this, myGroups, removedElems );
987 //=======================================================================
988 //function : RemoveFreeElement
990 //========================================================================
991 void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt,
992 SMESHDS_SubMesh * subMesh,
995 if (elt->GetType() == SMDSAbs_Node) {
996 RemoveFreeNode( static_cast<const SMDS_MeshNode*>(elt), subMesh, fromGroups);
1000 // if (hasConstructionEdges() || hasConstructionFaces())
1001 // // this methods is only for meshes without descendants
1004 myScript->RemoveElement(elt->GetID());
1007 // Element can belong to several groups
1008 if ( fromGroups && !myGroups.empty() ) {
1009 std::set<SMESHDS_GroupBase*>::iterator GrIt = myGroups.begin();
1010 for (; GrIt != myGroups.end(); GrIt++) {
1011 SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>(*GrIt);
1012 if (group && !group->IsEmpty())
1013 group->SMDSGroup().Remove(elt);
1018 // Element should belong to only one sub-mesh
1019 if ( !subMesh && elt->getshapeId() > 0 )
1020 subMesh = MeshElements( elt->getshapeId() );
1022 subMesh->RemoveElement( elt );
1024 SMDS_Mesh::RemoveFreeElement( elt );
1027 //================================================================================
1029 * \brief Remove all data from the mesh
1031 //================================================================================
1033 void SMESHDS_Mesh::ClearMesh()
1035 myRegularGrid.Clear();
1037 myScript->ClearMesh();
1041 SMESHDS_SubMeshIteratorPtr smIt = SubMeshes();
1042 while ( SMESHDS_SubMesh* sm = const_cast< SMESHDS_SubMesh* >( smIt->next() ))
1046 TGroups::iterator group, groupEnd = myGroups.end();
1047 for ( group = myGroups.begin(); group != groupEnd; ++group ) {
1048 if ( SMESHDS_Group* g = dynamic_cast<SMESHDS_Group*>(*group)) {
1049 SMDSAbs_ElementType groupType = g->GetType();
1051 g->SetType( groupType );
1055 (*group)->Extent(); // to free cached elements in GroupOnFilter's
1060 //================================================================================
1062 * \brief return submesh by shape
1063 * \param shape - the sub-shape
1064 * \retval SMESHDS_SubMesh* - the found submesh
1066 //================================================================================
1068 SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const TopoDS_Shape & shape )
1070 if ( shape.IsNull() )
1073 return NewSubMesh( ShapeToIndex( shape ));
1076 //================================================================================
1078 * \brief Add element or node to submesh
1079 * \param elem - element to add
1080 * \param subMesh - submesh to be filled in
1082 //================================================================================
1084 int SMESHDS_Mesh::add(const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh )
1086 if ( elem && subMesh ) {
1087 subMesh->AddElement( elem );
1088 return subMesh->GetID();
1093 //=======================================================================
1094 //function : SetNodeOnVolume
1096 //=======================================================================
1097 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode,
1098 const TopoDS_Shell & S)
1100 if ( int shapeID = add( aNode, getSubmesh( S )))
1101 const_cast< SMDS_MeshNode* >
1102 ( aNode )->SetPosition( SMDS_SpacePosition::originSpacePosition(), shapeID );
1105 //=======================================================================
1106 //function : SetNodeOnVolume
1108 //=======================================================================
1109 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode * aNode,
1110 const TopoDS_Solid & S)
1112 if ( int shapeID = add( aNode, getSubmesh( S )))
1113 const_cast< SMDS_MeshNode* >
1114 ( aNode )->SetPosition( SMDS_SpacePosition::originSpacePosition(), shapeID );
1117 //=======================================================================
1118 //function : SetNodeOnFace
1120 //=======================================================================
1121 void SMESHDS_Mesh::SetNodeOnFace(const SMDS_MeshNode * aNode,
1122 const TopoDS_Face & S,
1126 if ( int shapeID = add( aNode, getSubmesh( S )))
1127 const_cast< SMDS_MeshNode* >
1128 ( aNode )->SetPosition(SMDS_PositionPtr( new SMDS_FacePosition( u, v )), shapeID );
1131 //=======================================================================
1132 //function : SetNodeOnEdge
1134 //=======================================================================
1135 void SMESHDS_Mesh::SetNodeOnEdge(const SMDS_MeshNode * aNode,
1136 const TopoDS_Edge & S,
1139 if ( int shapeID = add( aNode, getSubmesh( S )))
1140 const_cast< SMDS_MeshNode* >
1141 ( aNode )->SetPosition(SMDS_PositionPtr( new SMDS_EdgePosition( u )), shapeID );
1144 //=======================================================================
1145 //function : SetNodeOnVertex
1147 //=======================================================================
1148 void SMESHDS_Mesh::SetNodeOnVertex(const SMDS_MeshNode * aNode,
1149 const TopoDS_Vertex & S)
1151 if ( int shapeID = add( aNode, getSubmesh( S )))
1152 const_cast< SMDS_MeshNode* >
1153 ( aNode )->SetPosition(SMDS_PositionPtr( new SMDS_VertexPosition()), shapeID );
1156 //=======================================================================
1157 //function : UnSetNodeOnShape
1159 //=======================================================================
1160 void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode)
1162 int shapeId = aNode->getshapeId();
1164 if ( SMESHDS_SubMesh* sm = MeshElements( shapeId ))
1165 sm->RemoveNode(aNode);
1168 //=======================================================================
1169 //function : UnSetElementOnShape
1171 //=======================================================================
1172 void SMESHDS_Mesh::UnSetElementOnShape(const SMDS_MeshElement * anElement)
1174 int shapeId = anElement->getshapeId();
1176 if ( SMESHDS_SubMesh* sm = MeshElements( shapeId ))
1177 sm->RemoveElement(anElement);
1180 //=======================================================================
1181 //function : SetMeshElementOnShape
1183 //=======================================================================
1184 void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement * anElement,
1185 const TopoDS_Shape & S)
1187 add( anElement, getSubmesh(S) );
1190 //=======================================================================
1191 //function : UnSetMeshElementOnShape
1193 //=======================================================================
1194 void SMESHDS_Mesh::UnSetMeshElementOnShape(const SMDS_MeshElement * elem,
1195 const TopoDS_Shape & S)
1197 if ( SMESHDS_SubMesh* sm = MeshElements( S ))
1198 sm->RemoveElement(elem);
1201 //=======================================================================
1202 //function : ShapeToMesh
1204 //=======================================================================
1205 TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() const
1210 //=======================================================================
1211 //function : IsGroupOfSubShapes
1212 //purpose : return true if at least one sub-shape of theShape is a sub-shape
1213 // of myShape or theShape == myShape
1214 //=======================================================================
1216 bool SMESHDS_Mesh::IsGroupOfSubShapes (const TopoDS_Shape& theShape) const
1218 if ( myIndexToShape.Contains(theShape) )
1221 for ( TopoDS_Iterator it( theShape ); it.More(); it.Next() )
1222 if ( IsGroupOfSubShapes( it.Value() ))
1228 ///////////////////////////////////////////////////////////////////////////////
1229 /// Return the sub mesh linked to the a given TopoDS_Shape or NULL if the given
1230 /// TopoDS_Shape is unknown
1231 ///////////////////////////////////////////////////////////////////////////////
1232 SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const
1234 int Index = ShapeToIndex(S);
1235 return (SMESHDS_SubMesh *) ( Index ? mySubMeshHolder->Get( Index ) : 0 );
1238 ///////////////////////////////////////////////////////////////////////////////
1239 /// Return the sub mesh by Id of shape it is linked to
1240 ///////////////////////////////////////////////////////////////////////////////
1241 SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index) const
1243 return const_cast< SMESHDS_SubMesh* >( mySubMeshHolder->Get( Index ));
1246 //=======================================================================
1247 //function : SubMeshIndices
1249 //=======================================================================
1250 std::list<int> SMESHDS_Mesh::SubMeshIndices() const
1252 std::list<int> anIndices;
1253 SMESHDS_SubMeshIteratorPtr smIt = SubMeshes();
1254 while ( const SMESHDS_SubMesh* sm = smIt->next() )
1255 anIndices.push_back( sm->GetID() );
1260 //=======================================================================
1261 //function : SubMeshes
1263 //=======================================================================
1265 SMESHDS_SubMeshIteratorPtr SMESHDS_Mesh::SubMeshes() const
1267 return SMESHDS_SubMeshIteratorPtr( mySubMeshHolder->GetIterator() );
1270 //=======================================================================
1271 //function : GetHypothesis
1273 //=======================================================================
1275 const std::list<const SMESHDS_Hypothesis*>&
1276 SMESHDS_Mesh::GetHypothesis(const TopoDS_Shape & S) const
1278 if ( myShapeToHypothesis.IsBound( S/*.Oriented(TopAbs_FORWARD)*/ ) ) // ignore orientation of S
1279 return myShapeToHypothesis.Find( S/*.Oriented(TopAbs_FORWARD)*/ );
1281 static std::list<const SMESHDS_Hypothesis*> empty;
1285 //================================================================================
1287 * \brief returns true if the hypothesis is assigned to any sub-shape
1289 //================================================================================
1291 bool SMESHDS_Mesh::IsUsedHypothesis(const SMESHDS_Hypothesis * H) const
1293 ShapeToHypothesis::Iterator s2h( myShapeToHypothesis );
1294 for ( ; s2h.More(); s2h.Next() )
1295 if ( std::find( s2h.Value().begin(), s2h.Value().end(), H ) != s2h.Value().end() )
1300 //=======================================================================
1301 //function : GetScript
1303 //=======================================================================
1304 SMESHDS_Script* SMESHDS_Mesh::GetScript()
1309 //=======================================================================
1310 //function : ClearScript
1312 //=======================================================================
1313 void SMESHDS_Mesh::ClearScript()
1318 //=======================================================================
1319 //function : HasMeshElements
1321 //=======================================================================
1322 bool SMESHDS_Mesh::HasMeshElements(const TopoDS_Shape & S) const
1324 int Index = myIndexToShape.FindIndex(S);
1325 return mySubMeshHolder->Get( Index );
1328 //=======================================================================
1329 //function : HasHypothesis
1331 //=======================================================================
1332 bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S)
1334 return myShapeToHypothesis.IsBound(S/*.Oriented(TopAbs_FORWARD)*/);
1337 //=======================================================================
1338 //function : NewSubMesh
1340 //=======================================================================
1341 SMESHDS_SubMesh * SMESHDS_Mesh::NewSubMesh(int Index)
1343 SMESHDS_SubMesh* SM = MeshElements( Index );
1346 SM = new SMESHDS_SubMesh(this, Index);
1347 mySubMeshHolder->Add( Index, SM );
1352 //=======================================================================
1353 //function : AddCompoundSubmesh
1355 //=======================================================================
1357 int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S,
1358 TopAbs_ShapeEnum type)
1361 if ( IsGroupOfSubShapes( S ))
1363 aMainIndex = myIndexToShape.Add( S );
1364 bool all = ( type == TopAbs_SHAPE );
1365 if ( all ) // corresponding simple submesh may exist
1366 aMainIndex = -aMainIndex;
1367 SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex );
1368 if ( !aNewSub->IsComplexSubmesh() ) // is empty
1370 int shapeType = Max( TopAbs_SOLID, all ? myShape.ShapeType() : type );
1371 int typeLimit = all ? TopAbs_VERTEX : type;
1372 for ( ; shapeType <= typeLimit; shapeType++ )
1374 TopExp_Explorer exp( S, TopAbs_ShapeEnum( shapeType ));
1375 for ( ; exp.More(); exp.Next() )
1377 int index = myIndexToShape.FindIndex( exp.Current() );
1379 aNewSub->AddSubMesh( NewSubMesh( index ));
1387 //=======================================================================
1388 //function : IndexToShape
1390 //=======================================================================
1391 const TopoDS_Shape& SMESHDS_Mesh::IndexToShape(int ShapeIndex) const
1395 if ( ShapeIndex > 0 )
1396 return myIndexToShape.FindKey(ShapeIndex);
1401 static TopoDS_Shape nullShape;
1405 //================================================================================
1407 * \brief Return max index of sub-mesh
1409 //================================================================================
1411 int SMESHDS_Mesh::MaxSubMeshIndex() const
1413 return mySubMeshHolder->GetMaxID();
1416 //=======================================================================
1417 //function : ShapeToIndex
1419 //=======================================================================
1420 int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const
1422 int index = myIndexToShape.FindIndex(S);
1426 //=======================================================================
1427 //function : SetNodeOnVolume
1429 //=======================================================================
1430 void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index)
1432 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1433 ((SMDS_MeshNode*) aNode)->SetPosition( SMDS_SpacePosition::originSpacePosition(), shapeID );
1436 //=======================================================================
1437 //function : SetNodeOnFace
1439 //=======================================================================
1440 void SMESHDS_Mesh::SetNodeOnFace(const SMDS_MeshNode* aNode, int Index, double u, double v)
1442 //Set Position on Node
1443 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1444 const_cast< SMDS_MeshNode* >
1445 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition( u, v )), shapeID );
1448 //=======================================================================
1449 //function : SetNodeOnEdge
1451 //=======================================================================
1452 void SMESHDS_Mesh::SetNodeOnEdge(const SMDS_MeshNode* aNode,
1456 //Set Position on Node
1457 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1458 const_cast< SMDS_MeshNode* >
1459 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition( u )), shapeID );
1462 //=======================================================================
1463 //function : SetNodeOnVertex
1465 //=======================================================================
1466 void SMESHDS_Mesh::SetNodeOnVertex(const SMDS_MeshNode* aNode, int Index)
1468 //Set Position on Node
1469 if ( int shapeID = add( aNode, NewSubMesh( Index )))
1470 const_cast< SMDS_MeshNode* >
1471 ( aNode )->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition()), shapeID );
1474 //=======================================================================
1475 //function : SetMeshElementOnShape
1477 //=======================================================================
1478 void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement,
1481 add( anElement, NewSubMesh( Index ));
1484 //=======================================================================
1485 //function : ~SMESHDS_Mesh
1487 //=======================================================================
1488 SMESHDS_Mesh::~SMESHDS_Mesh()
1490 myRegularGrid.Clear();
1494 delete mySubMeshHolder;
1498 //********************************************************************
1499 //********************************************************************
1500 //******** *********
1501 //***** Methods for addition of quadratic elements ******
1502 //******** *********
1503 //********************************************************************
1504 //********************************************************************
1506 //=======================================================================
1507 //function : AddEdgeWithID
1509 //=======================================================================
1510 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(smIdType n1, smIdType n2, smIdType n12, smIdType ID)
1512 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,n12,ID);
1513 if(anElem) myScript->AddEdge(ID,n1,n2,n12);
1517 //=======================================================================
1518 //function : AddEdge
1520 //=======================================================================
1521 SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode* n1,
1522 const SMDS_MeshNode* n2,
1523 const SMDS_MeshNode* n12)
1525 SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2,n12);
1526 if(anElem) myScript->AddEdge(anElem->GetID(),
1533 //=======================================================================
1534 //function : AddEdgeWithID
1536 //=======================================================================
1537 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
1538 const SMDS_MeshNode * n2,
1539 const SMDS_MeshNode * n12,
1542 return AddEdgeWithID(n1->GetID(),
1549 //=======================================================================
1550 //function : AddFace
1552 //=======================================================================
1553 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1554 const SMDS_MeshNode * n2,
1555 const SMDS_MeshNode * n3,
1556 const SMDS_MeshNode * n12,
1557 const SMDS_MeshNode * n23,
1558 const SMDS_MeshNode * n31)
1560 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31);
1561 if(anElem) myScript->AddFace(anElem->GetID(),
1562 n1->GetID(), n2->GetID(), n3->GetID(),
1563 n12->GetID(), n23->GetID(), n31->GetID());
1567 //=======================================================================
1568 //function : AddFaceWithID
1570 //=======================================================================
1571 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3,
1572 smIdType n12,smIdType n23,smIdType n31, smIdType ID)
1574 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,ID);
1575 if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31);
1579 //=======================================================================
1580 //function : AddFaceWithID
1582 //=======================================================================
1583 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(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,
1591 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1592 n12->GetID(), n23->GetID(), n31->GetID(),
1596 //=======================================================================
1597 //function : AddFace
1599 //=======================================================================
1600 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1601 const SMDS_MeshNode * n2,
1602 const SMDS_MeshNode * n3,
1603 const SMDS_MeshNode * n12,
1604 const SMDS_MeshNode * n23,
1605 const SMDS_MeshNode * n31,
1606 const SMDS_MeshNode * nCenter)
1608 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31,nCenter);
1609 if(anElem) myScript->AddFace(anElem->GetID(),
1610 n1->GetID(), n2->GetID(), n3->GetID(),
1611 n12->GetID(), n23->GetID(), n31->GetID(),
1616 //=======================================================================
1617 //function : AddFaceWithID
1619 //=======================================================================
1620 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3,
1621 smIdType n12,smIdType n23,smIdType n31, smIdType nCenter, smIdType ID)
1623 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,nCenter,ID);
1624 if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31,nCenter);
1628 //=======================================================================
1629 //function : AddFaceWithID
1631 //=======================================================================
1632 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1633 const SMDS_MeshNode * n2,
1634 const SMDS_MeshNode * n3,
1635 const SMDS_MeshNode * n12,
1636 const SMDS_MeshNode * n23,
1637 const SMDS_MeshNode * n31,
1638 const SMDS_MeshNode * nCenter,
1641 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1642 n12->GetID(), n23->GetID(), n31->GetID(),
1643 nCenter->GetID(), ID);
1647 //=======================================================================
1648 //function : AddFace
1650 //=======================================================================
1651 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1652 const SMDS_MeshNode * n2,
1653 const SMDS_MeshNode * n3,
1654 const SMDS_MeshNode * n4,
1655 const SMDS_MeshNode * n12,
1656 const SMDS_MeshNode * n23,
1657 const SMDS_MeshNode * n34,
1658 const SMDS_MeshNode * n41)
1660 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41);
1661 if(anElem) myScript->AddFace(anElem->GetID(),
1662 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1663 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID());
1667 //=======================================================================
1668 //function : AddFaceWithID
1670 //=======================================================================
1671 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
1672 smIdType n12,smIdType n23,smIdType n34,smIdType n41, smIdType ID)
1674 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,ID);
1675 if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41);
1679 //=======================================================================
1680 //function : AddFaceWithID
1682 //=======================================================================
1683 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1684 const SMDS_MeshNode * n2,
1685 const SMDS_MeshNode * n3,
1686 const SMDS_MeshNode * n4,
1687 const SMDS_MeshNode * n12,
1688 const SMDS_MeshNode * n23,
1689 const SMDS_MeshNode * n34,
1690 const SMDS_MeshNode * n41,
1693 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1694 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1699 //=======================================================================
1700 //function : AddFace
1702 //=======================================================================
1703 SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
1704 const SMDS_MeshNode * n2,
1705 const SMDS_MeshNode * n3,
1706 const SMDS_MeshNode * n4,
1707 const SMDS_MeshNode * n12,
1708 const SMDS_MeshNode * n23,
1709 const SMDS_MeshNode * n34,
1710 const SMDS_MeshNode * n41,
1711 const SMDS_MeshNode * nCenter)
1713 SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
1714 if(anElem) myScript->AddFace(anElem->GetID(),
1715 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1716 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1721 //=======================================================================
1722 //function : AddFaceWithID
1724 //=======================================================================
1725 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
1726 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
1727 smIdType nCenter, smIdType ID)
1729 SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,nCenter,ID);
1730 if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
1734 //=======================================================================
1735 //function : AddFaceWithID
1737 //=======================================================================
1738 SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
1739 const SMDS_MeshNode * n2,
1740 const SMDS_MeshNode * n3,
1741 const SMDS_MeshNode * n4,
1742 const SMDS_MeshNode * n12,
1743 const SMDS_MeshNode * n23,
1744 const SMDS_MeshNode * n34,
1745 const SMDS_MeshNode * n41,
1746 const SMDS_MeshNode * nCenter,
1749 return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1750 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1751 nCenter->GetID(), ID);
1755 //=======================================================================
1756 //function : AddVolume
1758 //=======================================================================
1759 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1760 const SMDS_MeshNode * n2,
1761 const SMDS_MeshNode * n3,
1762 const SMDS_MeshNode * n4,
1763 const SMDS_MeshNode * n12,
1764 const SMDS_MeshNode * n23,
1765 const SMDS_MeshNode * n31,
1766 const SMDS_MeshNode * n14,
1767 const SMDS_MeshNode * n24,
1768 const SMDS_MeshNode * n34)
1770 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1771 if(anElem) myScript->AddVolume(anElem->GetID(),
1772 n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1773 n12->GetID(), n23->GetID(), n31->GetID(),
1774 n14->GetID(), n24->GetID(), n34->GetID());
1778 //=======================================================================
1779 //function : AddVolumeWithID
1781 //=======================================================================
1782 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
1783 smIdType n12,smIdType n23,smIdType n31,
1784 smIdType n14,smIdType n24,smIdType n34, smIdType ID)
1786 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n12,n23,
1787 n31,n14,n24,n34,ID);
1788 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
1792 //=======================================================================
1793 //function : AddVolumeWithID
1794 //purpose : 2d order tetrahedron of 10 nodes
1795 //=======================================================================
1796 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1797 const SMDS_MeshNode * n2,
1798 const SMDS_MeshNode * n3,
1799 const SMDS_MeshNode * n4,
1800 const SMDS_MeshNode * n12,
1801 const SMDS_MeshNode * n23,
1802 const SMDS_MeshNode * n31,
1803 const SMDS_MeshNode * n14,
1804 const SMDS_MeshNode * n24,
1805 const SMDS_MeshNode * n34,
1808 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
1809 n12->GetID(), n23->GetID(), n31->GetID(),
1810 n14->GetID(), n24->GetID(), n34->GetID(), ID);
1814 //=======================================================================
1815 //function : AddVolume
1817 //=======================================================================
1818 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1819 const SMDS_MeshNode * n2,
1820 const SMDS_MeshNode * n3,
1821 const SMDS_MeshNode * n4,
1822 const SMDS_MeshNode * n5,
1823 const SMDS_MeshNode * n12,
1824 const SMDS_MeshNode * n23,
1825 const SMDS_MeshNode * n34,
1826 const SMDS_MeshNode * n41,
1827 const SMDS_MeshNode * n15,
1828 const SMDS_MeshNode * n25,
1829 const SMDS_MeshNode * n35,
1830 const SMDS_MeshNode * n45)
1832 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n12,n23,n34,n41,
1835 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1836 n3->GetID(), n4->GetID(), n5->GetID(),
1837 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1838 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID());
1842 //=======================================================================
1843 //function : AddVolumeWithID
1845 //=======================================================================
1846 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4, smIdType n5,
1847 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
1848 smIdType n15,smIdType n25,smIdType n35,smIdType n45, smIdType ID)
1850 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,
1852 n15,n25,n35,n45,ID);
1853 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n12,n23,n34,n41,
1858 //=======================================================================
1859 //function : AddVolumeWithID
1860 //purpose : 2d order pyramid of 13 nodes
1861 //=======================================================================
1862 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1863 const SMDS_MeshNode * n2,
1864 const SMDS_MeshNode * n3,
1865 const SMDS_MeshNode * n4,
1866 const SMDS_MeshNode * n5,
1867 const SMDS_MeshNode * n12,
1868 const SMDS_MeshNode * n23,
1869 const SMDS_MeshNode * n34,
1870 const SMDS_MeshNode * n41,
1871 const SMDS_MeshNode * n15,
1872 const SMDS_MeshNode * n25,
1873 const SMDS_MeshNode * n35,
1874 const SMDS_MeshNode * n45,
1877 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1878 n4->GetID(), n5->GetID(),
1879 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
1880 n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID(),
1885 //=======================================================================
1886 //function : AddVolume
1887 //purpose : 2nd order pentahedron (prism) with 15 nodes
1888 //=======================================================================
1889 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1890 const SMDS_MeshNode * n2,
1891 const SMDS_MeshNode * n3,
1892 const SMDS_MeshNode * n4,
1893 const SMDS_MeshNode * n5,
1894 const SMDS_MeshNode * n6,
1895 const SMDS_MeshNode * n12,
1896 const SMDS_MeshNode * n23,
1897 const SMDS_MeshNode * n31,
1898 const SMDS_MeshNode * n45,
1899 const SMDS_MeshNode * n56,
1900 const SMDS_MeshNode * n64,
1901 const SMDS_MeshNode * n14,
1902 const SMDS_MeshNode * n25,
1903 const SMDS_MeshNode * n36)
1905 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n12,n23,n31,
1906 n45,n56,n64,n14,n25,n36);
1908 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1909 n3->GetID(), n4->GetID(), n5->GetID(), n6->GetID(),
1910 n12->GetID(), n23->GetID(), n31->GetID(),
1911 n45->GetID(), n56->GetID(), n64->GetID(),
1912 n14->GetID(), n25->GetID(), n36->GetID());
1916 //=======================================================================
1917 //function : AddVolumeWithID
1918 //purpose : 2nd order pentahedron (prism) with 15 nodes
1919 //=======================================================================
1920 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3,
1921 smIdType n4, smIdType n5, smIdType n6,
1922 smIdType n12,smIdType n23,smIdType n31,
1923 smIdType n45,smIdType n56,smIdType n64,
1924 smIdType n14,smIdType n25,smIdType n36, smIdType ID)
1926 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,
1930 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n12,n23,n31,
1931 n45,n56,n64,n14,n25,n36);
1935 //=======================================================================
1936 //function : AddVolumeWithID
1937 //purpose : 2d order Pentahedron (prism) with 15 nodes
1938 //=======================================================================
1939 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
1940 const SMDS_MeshNode * n2,
1941 const SMDS_MeshNode * n3,
1942 const SMDS_MeshNode * n4,
1943 const SMDS_MeshNode * n5,
1944 const SMDS_MeshNode * n6,
1945 const SMDS_MeshNode * n12,
1946 const SMDS_MeshNode * n23,
1947 const SMDS_MeshNode * n31,
1948 const SMDS_MeshNode * n45,
1949 const SMDS_MeshNode * n56,
1950 const SMDS_MeshNode * n64,
1951 const SMDS_MeshNode * n14,
1952 const SMDS_MeshNode * n25,
1953 const SMDS_MeshNode * n36,
1956 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
1957 n4->GetID(), n5->GetID(), n6->GetID(),
1958 n12->GetID(), n23->GetID(), n31->GetID(),
1959 n45->GetID(), n56->GetID(), n64->GetID(),
1960 n14->GetID(), n25->GetID(), n36->GetID(),
1963 //=======================================================================
1964 //function : AddVolume
1965 //purpose : 2nd order pentahedron (prism) with 18 nodes
1966 //=======================================================================
1967 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
1968 const SMDS_MeshNode * n2,
1969 const SMDS_MeshNode * n3,
1970 const SMDS_MeshNode * n4,
1971 const SMDS_MeshNode * n5,
1972 const SMDS_MeshNode * n6,
1973 const SMDS_MeshNode * n12,
1974 const SMDS_MeshNode * n23,
1975 const SMDS_MeshNode * n31,
1976 const SMDS_MeshNode * n45,
1977 const SMDS_MeshNode * n56,
1978 const SMDS_MeshNode * n64,
1979 const SMDS_MeshNode * n14,
1980 const SMDS_MeshNode * n25,
1981 const SMDS_MeshNode * n36,
1982 const SMDS_MeshNode * n1245,
1983 const SMDS_MeshNode * n2356,
1984 const SMDS_MeshNode * n1346)
1986 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n12,n23,n31,
1987 n45,n56,n64,n14,n25,n36,
1988 n1245, n2356, n1346);
1990 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
1991 n3->GetID(), n4->GetID(), n5->GetID(), n6->GetID(),
1992 n12->GetID(), n23->GetID(), n31->GetID(),
1993 n45->GetID(), n56->GetID(), n64->GetID(),
1994 n14->GetID(), n25->GetID(), n36->GetID(),
1995 n1245->GetID(), n2356->GetID(), n1346->GetID());
1999 //=======================================================================
2000 //function : AddVolumeWithID
2001 //purpose : 2nd order pentahedron (prism) with 18 nodes
2002 //=======================================================================
2003 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3,
2004 smIdType n4, smIdType n5, smIdType n6,
2005 smIdType n12,smIdType n23,smIdType n31,
2006 smIdType n45,smIdType n56,smIdType n64,
2007 smIdType n14,smIdType n25,smIdType n36,
2008 smIdType n1245, smIdType n2356, smIdType n1346,
2011 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,
2015 n1245, n2356, n1346, ID);
2016 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n12,n23,n31,
2017 n45,n56,n64,n14,n25,n36, n1245, n2356, n1346);
2021 //=======================================================================
2022 //function : AddVolumeWithID
2023 //purpose : 2d order Pentahedron with 18 nodes
2024 //=======================================================================
2025 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2026 const SMDS_MeshNode * n2,
2027 const SMDS_MeshNode * n3,
2028 const SMDS_MeshNode * n4,
2029 const SMDS_MeshNode * n5,
2030 const SMDS_MeshNode * n6,
2031 const SMDS_MeshNode * n12,
2032 const SMDS_MeshNode * n23,
2033 const SMDS_MeshNode * n31,
2034 const SMDS_MeshNode * n45,
2035 const SMDS_MeshNode * n56,
2036 const SMDS_MeshNode * n64,
2037 const SMDS_MeshNode * n14,
2038 const SMDS_MeshNode * n25,
2039 const SMDS_MeshNode * n36,
2040 const SMDS_MeshNode * n1245,
2041 const SMDS_MeshNode * n2356,
2042 const SMDS_MeshNode * n1346,
2045 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(),
2046 n4->GetID(), n5->GetID(), n6->GetID(),
2047 n12->GetID(), n23->GetID(), n31->GetID(),
2048 n45->GetID(), n56->GetID(), n64->GetID(),
2049 n14->GetID(), n25->GetID(), n36->GetID(),
2050 n1245->GetID(), n2356->GetID(), n1346->GetID(), ID);
2054 //=======================================================================
2055 //function : AddVolume
2056 //purpose : add quadratic hexahedron
2057 //=======================================================================
2058 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2059 const SMDS_MeshNode * n2,
2060 const SMDS_MeshNode * n3,
2061 const SMDS_MeshNode * n4,
2062 const SMDS_MeshNode * n5,
2063 const SMDS_MeshNode * n6,
2064 const SMDS_MeshNode * n7,
2065 const SMDS_MeshNode * n8,
2066 const SMDS_MeshNode * n12,
2067 const SMDS_MeshNode * n23,
2068 const SMDS_MeshNode * n34,
2069 const SMDS_MeshNode * n41,
2070 const SMDS_MeshNode * n56,
2071 const SMDS_MeshNode * n67,
2072 const SMDS_MeshNode * n78,
2073 const SMDS_MeshNode * n85,
2074 const SMDS_MeshNode * n15,
2075 const SMDS_MeshNode * n26,
2076 const SMDS_MeshNode * n37,
2077 const SMDS_MeshNode * n48)
2079 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
2084 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
2085 n3->GetID(), n4->GetID(), n5->GetID(),
2086 n6->GetID(), n7->GetID(), n8->GetID(),
2087 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2088 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2089 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID());
2093 //=======================================================================
2094 //function : AddVolumeWithID
2096 //=======================================================================
2097 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
2098 smIdType n5, smIdType n6, smIdType n7, smIdType n8,
2099 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
2100 smIdType n56,smIdType n67,smIdType n78,smIdType n85,
2101 smIdType n15,smIdType n26,smIdType n37,smIdType n48, smIdType ID)
2103 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
2106 n15,n26,n37,n48,ID);
2107 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
2108 n56,n67,n78,n85,n15,n26,n37,n48);
2112 //=======================================================================
2113 //function : AddVolumeWithID
2114 //purpose : 2d order Hexahedrons with 20 nodes
2115 //=======================================================================
2116 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2117 const SMDS_MeshNode * n2,
2118 const SMDS_MeshNode * n3,
2119 const SMDS_MeshNode * n4,
2120 const SMDS_MeshNode * n5,
2121 const SMDS_MeshNode * n6,
2122 const SMDS_MeshNode * n7,
2123 const SMDS_MeshNode * n8,
2124 const SMDS_MeshNode * n12,
2125 const SMDS_MeshNode * n23,
2126 const SMDS_MeshNode * n34,
2127 const SMDS_MeshNode * n41,
2128 const SMDS_MeshNode * n56,
2129 const SMDS_MeshNode * n67,
2130 const SMDS_MeshNode * n78,
2131 const SMDS_MeshNode * n85,
2132 const SMDS_MeshNode * n15,
2133 const SMDS_MeshNode * n26,
2134 const SMDS_MeshNode * n37,
2135 const SMDS_MeshNode * n48,
2138 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
2139 n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
2140 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2141 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2142 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2146 //=======================================================================
2147 //function : AddVolume
2148 //purpose : add tri-quadratic hexahedron of 27 nodes
2149 //=======================================================================
2151 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
2152 const SMDS_MeshNode * n2,
2153 const SMDS_MeshNode * n3,
2154 const SMDS_MeshNode * n4,
2155 const SMDS_MeshNode * n5,
2156 const SMDS_MeshNode * n6,
2157 const SMDS_MeshNode * n7,
2158 const SMDS_MeshNode * n8,
2159 const SMDS_MeshNode * n12,
2160 const SMDS_MeshNode * n23,
2161 const SMDS_MeshNode * n34,
2162 const SMDS_MeshNode * n41,
2163 const SMDS_MeshNode * n56,
2164 const SMDS_MeshNode * n67,
2165 const SMDS_MeshNode * n78,
2166 const SMDS_MeshNode * n85,
2167 const SMDS_MeshNode * n15,
2168 const SMDS_MeshNode * n26,
2169 const SMDS_MeshNode * n37,
2170 const SMDS_MeshNode * n48,
2171 const SMDS_MeshNode * n1234,
2172 const SMDS_MeshNode * n1256,
2173 const SMDS_MeshNode * n2367,
2174 const SMDS_MeshNode * n3478,
2175 const SMDS_MeshNode * n1458,
2176 const SMDS_MeshNode * n5678,
2177 const SMDS_MeshNode * nCenter)
2179 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
2183 n1234,n1256,n2367,n3478,n1458,n5678,nCenter);
2185 myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
2186 n3->GetID(), n4->GetID(), n5->GetID(),
2187 n6->GetID(), n7->GetID(), n8->GetID(),
2188 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2189 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2190 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2191 n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
2192 n1458->GetID(),n5678->GetID(),nCenter->GetID());
2196 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(smIdType n1, smIdType n2, smIdType n3, smIdType n4,
2197 smIdType n5, smIdType n6, smIdType n7, smIdType n8,
2198 smIdType n12,smIdType n23,smIdType n34,smIdType n41,
2199 smIdType n56,smIdType n67,smIdType n78,smIdType n85,
2200 smIdType n15,smIdType n26,smIdType n37,smIdType n48,
2201 smIdType n1234,smIdType n1256,smIdType n2367,smIdType n3478,
2202 smIdType n1458,smIdType n5678,smIdType nCenter,
2205 SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
2209 n1234, n1256, n2367, n3478,
2210 n1458, n5678, nCenter,
2212 if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
2213 n56,n67,n78,n85,n15,n26,n37,n48,
2214 n1234, n1256, n2367, n3478,
2215 n1458, n5678, nCenter);
2219 SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
2220 const SMDS_MeshNode * n2,
2221 const SMDS_MeshNode * n3,
2222 const SMDS_MeshNode * n4,
2223 const SMDS_MeshNode * n5,
2224 const SMDS_MeshNode * n6,
2225 const SMDS_MeshNode * n7,
2226 const SMDS_MeshNode * n8,
2227 const SMDS_MeshNode * n12,
2228 const SMDS_MeshNode * n23,
2229 const SMDS_MeshNode * n34,
2230 const SMDS_MeshNode * n41,
2231 const SMDS_MeshNode * n56,
2232 const SMDS_MeshNode * n67,
2233 const SMDS_MeshNode * n78,
2234 const SMDS_MeshNode * n85,
2235 const SMDS_MeshNode * n15,
2236 const SMDS_MeshNode * n26,
2237 const SMDS_MeshNode * n37,
2238 const SMDS_MeshNode * n48,
2239 const SMDS_MeshNode * n1234,
2240 const SMDS_MeshNode * n1256,
2241 const SMDS_MeshNode * n2367,
2242 const SMDS_MeshNode * n3478,
2243 const SMDS_MeshNode * n1458,
2244 const SMDS_MeshNode * n5678,
2245 const SMDS_MeshNode * nCenter,
2248 return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
2249 n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
2250 n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
2251 n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
2252 n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
2253 n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
2254 n1458->GetID(),n5678->GetID(),nCenter->GetID(), ID);
2257 void SMESHDS_Mesh::CompactMesh()
2259 if ( IsCompacted() )
2262 SMDS_Mesh::CompactMesh();
2264 this->myScript->SetModified(true); // notify GUI client for buildPrs when update
2267 void SMESHDS_Mesh::CleanDownWardConnectivity()
2269 myGrid->CleanDownwardConnectivity();
2272 void SMESHDS_Mesh::BuildDownWardConnectivity(bool withEdges)
2274 myGrid->BuildDownwardConnectivity(withEdges);
2277 /*! change some nodes in cell without modifying type or internal connectivity.
2278 * Nodes inverse connectivity is maintained up to date.
2279 * @param vtkVolId vtk id of the cell.
2280 * @param localClonedNodeIds map old node id to new node id.
2281 * @return ok if success.
2283 bool SMESHDS_Mesh::ModifyCellNodes(vtkIdType vtkVolId, std::map<int,int> localClonedNodeIds)
2285 myGrid->ModifyCellNodes(vtkVolId, localClonedNodeIds);
2289 /* Create a structured grid associated to the shapeId meshed
2290 * @remark the grid dimension (nx, ny, nz) is not associated to a space direction, those dimensions denotes which index
2291 * run faster in the nested loop defining the nodes of a structured grid.
2292 * for( k in range(0,nz) )
2293 * for( j in range(0,ny) )
2294 * for( i in range(0,nx) )
2295 * @param shape been meshed, pass the shape that would be passed to SetNodeOnFace or SetNodeInVolume method.
2296 * @param nx, faster dimension
2297 * @param ny, medium dimension
2298 * @param nz, slower dimension
2299 * @return define a new * SMESH_StructuredGrid to the shapeId.
2301 void SMESHDS_Mesh::SetStructuredGrid( const TopoDS_Shape & shape, const int nx, const int ny, const int nz )
2303 int index = myIndexToShape.FindIndex(shape);
2306 if ( myRegularGrid.IsBound(index) )
2307 myRegularGrid.UnBind(index);
2309 myRegularGrid.Bind(index, std::make_shared<SMESHUtils::SMESH_RegularGrid>(index,nx,ny,nz));
2314 void SMESHDS_Mesh::SetNodeOnStructuredGrid( const TopoDS_Shape & shape, const std::shared_ptr<gp_Pnt>& P, const int iIndex, const int jIndex, const int kIndex )
2316 int index = myIndexToShape.FindIndex(shape);
2317 if ( index != 0 && myRegularGrid.IsBound(index) )
2318 myRegularGrid.Seek(index)->get()->SetNode( P, iIndex, jIndex, kIndex );
2321 void SMESHDS_Mesh::SetNodeOnStructuredGrid( const TopoDS_Shape & shape, const SMDS_MeshNode* P, const int iIndex, const int jIndex, const int kIndex )
2323 int index = myIndexToShape.FindIndex(shape);
2324 if ( index != 0 && myRegularGrid.IsBound(index) )
2325 myRegularGrid.Seek(index)->get()->SetNode( P, iIndex, jIndex, kIndex );
2328 void SMESHDS_Mesh::SetNodeOnStructuredGrid( const TopoDS_Shape & shape, const SMDS_MeshNode* P, const int index )
2330 int shapeIndex = myIndexToShape.FindIndex(shape);
2331 if ( shapeIndex != 0 && myRegularGrid.IsBound(shapeIndex) )
2332 myRegularGrid.Seek(shapeIndex)->get()->SetNode( P, index );
2335 bool SMESHDS_Mesh::HasStructuredGridFilled( const TopoDS_Shape & shape ) const
2337 int index = myIndexToShape.FindIndex(shape);
2338 if ( index != 0 && myRegularGrid.IsBound(index) )
2344 bool SMESHDS_Mesh::HasSomeStructuredGridFilled() const
2346 bool hasSomeStructuredGrid = false;
2347 for ( TopExp_Explorer fEx( myShape, TopAbs_SOLID ); fEx.More(); fEx.Next() )
2349 TopoDS_Solid solid = TopoDS::Solid(fEx.Current());
2350 if ( HasStructuredGridFilled( solid ) ) hasSomeStructuredGrid = true;
2352 for ( TopExp_Explorer fEx( myShape, TopAbs_FACE ); fEx.More(); fEx.Next() )
2354 TopoDS_Face face = TopoDS::Face(fEx.Current());
2355 if ( HasStructuredGridFilled( face ) ) hasSomeStructuredGrid = true;
2357 return hasSomeStructuredGrid;
2360 const std::shared_ptr<SMESHUtils::SMESH_RegularGrid>& SMESHDS_Mesh::GetTheGrid( const TopoDS_Shape & shape )
2362 int index = myIndexToShape.FindIndex(shape);
2363 if ( index != 0 && myRegularGrid.IsBound(index) )
2364 return *myRegularGrid.Seek(index);