X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHDS%2FSMESHDS_Mesh.cxx;h=25c772b2141a6c04f4ae37e223979383b0a9e377;hb=efc89ab066e3ddf525d14eaa05267d4d0e1070dc;hp=416da54aa4193cc5765a4b2688f82cda9d5713e0;hpb=6d13ce68630daaa8550bdb324a5da08529a82450;p=modules%2Fsmesh.git diff --git a/src/SMESHDS/SMESHDS_Mesh.cxx b/src/SMESHDS/SMESHDS_Mesh.cxx index 416da54aa..25c772b21 100644 --- a/src/SMESHDS/SMESHDS_Mesh.cxx +++ b/src/SMESHDS/SMESHDS_Mesh.cxx @@ -1,38 +1,39 @@ -// SMESH SMESHDS : management of mesh data and SMESH document +// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// SMESH SMESHDS : management of mesh data and SMESH document // File : SMESH_Mesh.cxx // Author : Yves FRICAUD, OCC // Module : SMESH // $Header: - +// #include "SMESHDS_Mesh.hxx" #include "SMESHDS_Group.hxx" #include "SMDS_VertexPosition.hxx" #include "SMDS_EdgePosition.hxx" #include "SMDS_FacePosition.hxx" +#include "SMDS_SpacePosition.hxx" #include "SMESHDS_GroupOnGeom.hxx" + #include #include #include @@ -41,13 +42,28 @@ using namespace std; +/*Standard_Boolean IsEqual( const TopoDS_Shape& S1, const TopoDS_Shape& S2 ) + { + return S1.IsSame( S2 ); + }*/ + //======================================================================= //function : Create //purpose : //======================================================================= -SMESHDS_Mesh::SMESHDS_Mesh(int MeshID):myMeshID(MeshID) +SMESHDS_Mesh::SMESHDS_Mesh(int theMeshID, bool theIsEmbeddedMode): + myMeshID(theMeshID), + myIsEmbeddedMode(theIsEmbeddedMode), + myCurSubID(-1) { - myScript = new SMESHDS_Script(); + myScript = new SMESHDS_Script(theIsEmbeddedMode); + myCurSubMesh = 0; +} + +//======================================================================= +bool SMESHDS_Mesh::IsEmbeddedMode() +{ + return myIsEmbeddedMode; } //======================================================================= @@ -60,7 +76,7 @@ void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S) { // removal of a shape to mesh, delete ... // - hypotheses - myShapeToHypothesis.clear(); + myShapeToHypothesis.Clear(); // - shape indices in SMDS_Position of nodes map::iterator i_sub = myShapeIndexToSubMesh.begin(); for ( ; i_sub != myShapeIndexToSubMesh.end(); i_sub++ ) { @@ -95,18 +111,22 @@ void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S) //======================================================================= bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS, - const SMESHDS_Hypothesis * H) + const SMESHDS_Hypothesis * H) { - list& alist=myShapeToHypothesis[SS]; + if (!myShapeToHypothesis.IsBound(SS.Oriented(TopAbs_FORWARD))) { + list aList; + myShapeToHypothesis.Bind(SS.Oriented(TopAbs_FORWARD), aList); + } + list& alist = + myShapeToHypothesis(SS.Oriented(TopAbs_FORWARD)); // ignore orientation of SS - //Check if the Hypothesis is still present - list::iterator ith=alist.begin(); + //Check if the Hypothesis is still present + list::iterator ith = find(alist.begin(),alist.end(), H ); - for (; ith!=alist.end(); ith++) - if (H == *ith) return false; + if (alist.end() != ith) return false; - alist.push_back(H); - return true; + alist.push_back(H); + return true; } //======================================================================= @@ -114,22 +134,20 @@ bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS, //purpose : //======================================================================= -bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S, - const SMESHDS_Hypothesis * H) +bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S, + const SMESHDS_Hypothesis * H) { - ShapeToHypothesis::iterator its=myShapeToHypothesis.find(S); - if(its!=myShapeToHypothesis.end()) - { - list::iterator ith=(*its).second.begin(); - - for (; ith!=(*its).second.end(); ith++) - if (H == *ith) - { - (*its).second.erase(ith); - return true; - } - } - return false; + if( myShapeToHypothesis.IsBound( S.Oriented(TopAbs_FORWARD) ) ) + { + list& alist=myShapeToHypothesis.ChangeFind( S.Oriented(TopAbs_FORWARD) ); + list::iterator ith=find(alist.begin(),alist.end(), H ); + if (ith != alist.end()) + { + alist.erase(ith); + return true; + } + } + return false; } //======================================================================= @@ -171,11 +189,47 @@ bool SMESHDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem, if ( ! SMDS_Mesh::ChangeElementNodes( elem, nodes, nbnodes )) return false; - ASSERT( nbnodes < 9 ); - int i, IDs[ 8 ]; - for ( i = 0; i < nbnodes; i++ ) + vector IDs( nbnodes ); + for ( int i = 0; i < nbnodes; i++ ) IDs [ i ] = nodes[ i ]->GetID(); - myScript->ChangeElementNodes( elem->GetID(), IDs, nbnodes); + myScript->ChangeElementNodes( elem->GetID(), &IDs[0], nbnodes); + + return true; +} + +//======================================================================= +//function : ChangePolygonNodes +//purpose : +//======================================================================= +bool SMESHDS_Mesh::ChangePolygonNodes + (const SMDS_MeshElement * elem, + vector nodes) +{ + ASSERT(nodes.size() > 3); + + return ChangeElementNodes(elem, &nodes[0], nodes.size()); +} + +//======================================================================= +//function : ChangePolyhedronNodes +//purpose : +//======================================================================= +bool SMESHDS_Mesh::ChangePolyhedronNodes + (const SMDS_MeshElement * elem, + std::vector nodes, + std::vector quantities) +{ + ASSERT(nodes.size() > 3); + + if (!SMDS_Mesh::ChangePolyhedronNodes(elem, nodes, quantities)) + return false; + + int i, len = nodes.size(); + std::vector nodes_ids (len); + for (i = 0; i < len; i++) { + nodes_ids[i] = nodes[i]->GetID(); + } + myScript->ChangePolyhedronNodes(elem->GetID(), nodes_ids, quantities); return true; } @@ -472,15 +526,109 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, n8->GetID()); return anElem; } + +//======================================================================= +//function : AddPolygonalFace +//purpose : +//======================================================================= +SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID (std::vector nodes_ids, + const int ID) +{ + SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes_ids, ID); + if (anElem) { + myScript->AddPolygonalFace(ID, nodes_ids); + } + return anElem; +} + +SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID + (std::vector nodes, + const int ID) +{ + SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID); + if (anElem) { + int i, len = nodes.size(); + std::vector nodes_ids (len); + for (i = 0; i < len; i++) { + nodes_ids[i] = nodes[i]->GetID(); + } + myScript->AddPolygonalFace(ID, nodes_ids); + } + return anElem; +} + +SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFace + (std::vector nodes) +{ + SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFace(nodes); + if (anElem) { + int i, len = nodes.size(); + std::vector nodes_ids (len); + for (i = 0; i < len; i++) { + nodes_ids[i] = nodes[i]->GetID(); + } + myScript->AddPolygonalFace(anElem->GetID(), nodes_ids); + } + return anElem; +} + +//======================================================================= +//function : AddPolyhedralVolume +//purpose : +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID (std::vector nodes_ids, + std::vector quantities, + const int ID) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes_ids, quantities, ID); + if (anElem) { + myScript->AddPolyhedralVolume(ID, nodes_ids, quantities); + } + return anElem; +} + +SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID + (std::vector nodes, + std::vector quantities, + const int ID) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID); + if (anElem) { + int i, len = nodes.size(); + std::vector nodes_ids (len); + for (i = 0; i < len; i++) { + nodes_ids[i] = nodes[i]->GetID(); + } + myScript->AddPolyhedralVolume(ID, nodes_ids, quantities); + } + return anElem; +} + +SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolume + (std::vector nodes, + std::vector quantities) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolume(nodes, quantities); + if (anElem) { + int i, len = nodes.size(); + std::vector nodes_ids (len); + for (i = 0; i < len; i++) { + nodes_ids[i] = nodes[i]->GetID(); + } + myScript->AddPolyhedralVolume(anElem->GetID(), nodes_ids, quantities); + } + return anElem; +} + //======================================================================= //function : removeFromContainers //purpose : //======================================================================= -static void removeFromContainers (map & theSubMeshes, - set& theGroups, - list & theElems, - const bool isNode) +static void removeFromContainers (map& theSubMeshes, + set& theGroups, + list& theElems, + const bool isNode) { if ( theElems.empty() ) return; @@ -504,6 +652,8 @@ static void removeFromContainers (map & theSubMeshes, } } + const bool deleted=true; + // Rm from sub-meshes // Element should belong to only one sub-mesh map::iterator SubIt = theSubMeshes.begin(); @@ -517,9 +667,9 @@ static void removeFromContainers (map & theSubMeshes, { bool removed = false; if ( isNode ) - removed = (*SubIt).second->RemoveNode( static_cast (*elIt) ); + removed = (*SubIt).second->RemoveNode( static_cast (*elIt), deleted ); else - removed = (*SubIt).second->RemoveElement( *elIt ); + removed = (*SubIt).second->RemoveElement( *elIt, deleted ); if (removed) { @@ -541,6 +691,23 @@ static void removeFromContainers (map & theSubMeshes, //======================================================================= void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n) { + if ( n->NbInverseElements() == 0 && !(hasConstructionEdges() || hasConstructionFaces())) + { + SMESHDS_SubMesh* subMesh=0; + map::iterator SubIt = + myShapeIndexToSubMesh.find( n->GetPosition()->GetShapeId() ); + if ( SubIt != myShapeIndexToSubMesh.end() ) + subMesh = SubIt->second; + else + SubIt = myShapeIndexToSubMesh.begin(); + for ( ; !subMesh && SubIt != myShapeIndexToSubMesh.end(); SubIt++ ) + if (!SubIt->second->IsComplexSubmesh() && SubIt->second->Contains( n )) + subMesh = SubIt->second; + + RemoveFreeNode( n, subMesh, true); + return; + } + myScript->RemoveNode(n->GetID()); list removedElems; @@ -552,6 +719,35 @@ void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n) removeFromContainers( myShapeIndexToSubMesh, myGroups, removedNodes, true ); } +//======================================================================= +//function : RemoveFreeNode +//purpose : +//======================================================================= +void SMESHDS_Mesh::RemoveFreeNode(const SMDS_MeshNode * n, + SMESHDS_SubMesh * subMesh, + bool fromGroups) +{ + myScript->RemoveNode(n->GetID()); + + // Rm from group + // Node can belong to several groups + if (fromGroups && !myGroups.empty()) { + set::iterator GrIt = myGroups.begin(); + for (; GrIt != myGroups.end(); GrIt++) { + SMESHDS_Group* group = dynamic_cast(*GrIt); + if (!group || group->IsEmpty()) continue; + group->SMDSGroup().Remove(n); + } + } + + // Rm from sub-mesh + // Node should belong to only one sub-mesh + if( subMesh ) + subMesh->RemoveNode(n,/*deleted=*/false); + + SMDS_Mesh::RemoveFreeElement(n); +} + //======================================================================= //function : RemoveElement //purpose : @@ -563,7 +759,18 @@ void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt) RemoveNode( static_cast( elt )); return; } + if (!hasConstructionEdges() && !hasConstructionFaces()) + { + SMESHDS_SubMesh* subMesh=0; + map::iterator SubIt = myShapeIndexToSubMesh.begin(); + for ( ; !subMesh && SubIt != myShapeIndexToSubMesh.end(); SubIt++ ) + if (!SubIt->second->IsComplexSubmesh() && SubIt->second->Contains( elt )) + subMesh = SubIt->second; + RemoveFreeElement( elt, subMesh, true); + return; + } + myScript->RemoveElement(elt->GetID()); list removedElems; @@ -575,92 +782,207 @@ void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt) } //======================================================================= -//function : SetNodeOnVolume +//function : RemoveFreeElement //purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode, - const TopoDS_Shell & S) +//======================================================================== +void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt, + SMESHDS_SubMesh * subMesh, + bool fromGroups) { - if (myShape.IsNull()) MESSAGE("myShape is NULL"); + if (elt->GetType() == SMDSAbs_Node) { + RemoveFreeNode( static_cast(elt), subMesh); + return; + } - int Index = myIndexToShape.FindIndex(S); + if (hasConstructionEdges() || hasConstructionFaces()) + // this methods is only for meshes without descendants + return; - //Set Position on Node - //Handle (SMDS_FacePosition) aPos = new SMDS_FacePosition (myFaceToId(S),0.,0.);; - //aNode->SetPosition(aPos); + myScript->RemoveElement(elt->GetID()); - //Update or build submesh - map::iterator it=myShapeIndexToSubMesh.find(Index); - if (it==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]= new SMESHDS_SubMesh(); + // Rm from group + // Node can belong to several groups + if ( fromGroups && !myGroups.empty() ) { + set::iterator GrIt = myGroups.begin(); + for (; GrIt != myGroups.end(); GrIt++) { + SMESHDS_Group* group = dynamic_cast(*GrIt); + if (group && !group->IsEmpty()) + group->SMDSGroup().Remove(elt); + } + } + + // Rm from sub-mesh + // Element should belong to only one sub-mesh + if( subMesh ) + subMesh->RemoveElement(elt, /*deleted=*/false); - myShapeIndexToSubMesh[Index]->AddNode(aNode); + SMDS_Mesh::RemoveFreeElement(elt); } -//======================================================================= -//function : SetNodeOnFace -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode * aNode, - const TopoDS_Face & S) -{ - if (myShape.IsNull()) MESSAGE("myShape is NULL"); +//================================================================================ +/*! + * \brief Remove all data from the mesh + */ +//================================================================================ - int Index = myIndexToShape.FindIndex(S); +void SMESHDS_Mesh::ClearMesh() +{ + myScript->ClearMesh(); + SMDS_Mesh::Clear(); + + // clear submeshes + map::iterator sub, subEnd = myShapeIndexToSubMesh.end(); + for ( sub = myShapeIndexToSubMesh.begin(); sub != subEnd; ++sub ) + sub->second->Clear(); + + // clear groups + TGroups::iterator group, groupEnd = myGroups.end(); + for ( group = myGroups.begin(); group != groupEnd; ++group ) { + if ( SMESHDS_Group* g = dynamic_cast(*group)) { + SMDSAbs_ElementType groupType = g->GetType(); + g->Clear(); + g->SetType( groupType ); + } + } +} - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(Index, 0., 0.))); +//================================================================================ +/*! + * \brief return submesh by shape + * \param shape - the subshape + * \retval SMESHDS_SubMesh* - the found submesh + * + * search of submeshes is optimized + */ +//================================================================================ + +SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const TopoDS_Shape & shape ) +{ + if ( shape.IsNull() ) + return 0; - //Update or build submesh - map::iterator it=myShapeIndexToSubMesh.find(Index); - if (it==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]= new SMESHDS_SubMesh(); + if ( !myCurSubShape.IsNull() && shape.IsSame( myCurSubShape )) + return myCurSubMesh; - myShapeIndexToSubMesh[Index]->AddNode(aNode); + getSubmesh( ShapeToIndex( shape )); + myCurSubShape = shape; + return myCurSubMesh; } -//======================================================================= -//function : SetNodeOnEdge -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode * aNode, - const TopoDS_Edge & S) +//================================================================================ +/*! + * \brief return submesh by subshape index + * \param Index - the subshape index + * \retval SMESHDS_SubMesh* - the found submesh + * search of submeshes is optimized + */ +//================================================================================ + +SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const int Index ) { - if (myShape.IsNull()) MESSAGE("myShape is NULL"); + //Update or build submesh + if ( Index != myCurSubID ) { + map::iterator it = myShapeIndexToSubMesh.find( Index ); + if ( it == myShapeIndexToSubMesh.end() ) + it = myShapeIndexToSubMesh.insert( make_pair(Index, new SMESHDS_SubMesh() )).first; + myCurSubMesh = it->second; + myCurSubID = Index; + myCurSubShape.Nullify(); // myCurSubShape no more corresponds to submesh + } + return myCurSubMesh; +} - int Index = myIndexToShape.FindIndex(S); +//================================================================================ +/*! + * \brief Add element or node to submesh + * \param elem - element to add + * \param subMesh - submesh to be filled in + */ +//================================================================================ + +bool SMESHDS_Mesh::add(const SMDS_MeshElement* elem, SMESHDS_SubMesh* subMesh ) +{ + if ( elem && subMesh ) { + if ( elem->GetType() == SMDSAbs_Node ) + subMesh->AddNode( static_cast( elem )); + else + subMesh->AddElement( elem ); + return true; + } + return false; +} - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(Index, 0.))); +namespace { - //Update or build submesh - map::iterator it=myShapeIndexToSubMesh.find(Index); - if (it==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]= new SMESHDS_SubMesh(); + //================================================================================ + /*! + * \brief Creates a node position in volume + */ + //================================================================================ - myShapeIndexToSubMesh[Index]->AddNode(aNode); + inline SMDS_PositionPtr volumePosition(int volId) + { + SMDS_SpacePosition* pos = new SMDS_SpacePosition(); + pos->SetShapeId( volId ); + return SMDS_PositionPtr(pos); + } } //======================================================================= -//function : SetNodeOnVertex +//function : SetNodeOnVolume //purpose : //======================================================================= -void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode * aNode, - const TopoDS_Vertex & S) +void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode, + const TopoDS_Shell & S) { - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - int Index = myIndexToShape.FindIndex(S); + if ( add( aNode, getSubmesh(S) )) + aNode->SetPosition ( volumePosition( myCurSubID )); +} +//======================================================================= +//function : SetNodeOnVolume +//purpose : +//======================================================================= +void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode, + const TopoDS_Solid & S) +{ + if ( add( aNode, getSubmesh(S) )) + aNode->SetPosition ( volumePosition( myCurSubID )); +} - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(Index))); +//======================================================================= +//function : SetNodeOnFace +//purpose : +//======================================================================= +void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode * aNode, + const TopoDS_Face & S, + double u, + double v) +{ + if ( add( aNode, getSubmesh(S) )) + aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(myCurSubID, u, v))); +} - //Update or build submesh - map::iterator it=myShapeIndexToSubMesh.find(Index); - if (it==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]= new SMESHDS_SubMesh(); +//======================================================================= +//function : SetNodeOnEdge +//purpose : +//======================================================================= +void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode * aNode, + const TopoDS_Edge & S, + double u) +{ + if ( add( aNode, getSubmesh(S) )) + aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(myCurSubID, u))); +} - myShapeIndexToSubMesh[Index]->AddNode(aNode); +//======================================================================= +//function : SetNodeOnVertex +//purpose : +//======================================================================= +void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode * aNode, + const TopoDS_Vertex & S) +{ + if ( add( aNode, getSubmesh(S) )) + aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(myCurSubID))); } //======================================================================= @@ -669,7 +991,12 @@ void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode * aNode, //======================================================================= void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode) { - MESSAGE("not implemented"); + if ( aNode && aNode->GetPosition() ) { + map::iterator it = + myShapeIndexToSubMesh.find( aNode->GetPosition()->GetShapeId() ); + if ( it != myShapeIndexToSubMesh.end() ) + it->second->RemoveNode( aNode, /*deleted=*/false ); + } } //======================================================================= @@ -677,32 +1004,26 @@ void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode) //purpose : //======================================================================= void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement * anElement, - const TopoDS_Shape & S) + const TopoDS_Shape & S) { - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - int Index = myIndexToShape.FindIndex(S); - - if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh(); - - myShapeIndexToSubMesh[Index]->AddElement(anElement); + add( anElement, getSubmesh(S) ); } //======================================================================= //function : UnSetMeshElementOnShape //purpose : //======================================================================= -void SMESHDS_Mesh:: -UnSetMeshElementOnShape(const SMDS_MeshElement * anElement, - const TopoDS_Shape & S) +void SMESHDS_Mesh::UnSetMeshElementOnShape(const SMDS_MeshElement * elem, + const TopoDS_Shape & S) { - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - int Index = myIndexToShape.FindIndex(S); - - if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]->RemoveElement(anElement); + int Index = myIndexToShape.FindIndex(S); + + map::iterator it = myShapeIndexToSubMesh.find( Index ); + if ( it != myShapeIndexToSubMesh.end() ) + if ( elem->GetType() == SMDSAbs_Node ) + it->second->RemoveNode( static_cast( elem ), /*deleted=*/false ); + else + it->second->RemoveElement( elem, /*deleted=*/false ); } //======================================================================= @@ -738,13 +1059,12 @@ bool SMESHDS_Mesh::IsGroupOfSubShapes (const TopoDS_Shape& theShape) const /// Return the sub mesh linked to the a given TopoDS_Shape or NULL if the given /// TopoDS_Shape is unknown /////////////////////////////////////////////////////////////////////////////// -SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) +SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const { - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - int Index = ShapeToIndex(S); - if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end()) - return myShapeIndexToSubMesh[Index]; + TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index); + if (anIter != myShapeIndexToSubMesh.end()) + return anIter->second; else return NULL; } @@ -754,10 +1074,9 @@ SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) /////////////////////////////////////////////////////////////////////////////// SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index) { - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end()) - return myShapeIndexToSubMesh[Index]; + TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index); + if (anIter != myShapeIndexToSubMesh.end()) + return anIter->second; else return NULL; } @@ -781,14 +1100,14 @@ list SMESHDS_Mesh::SubMeshIndices() //purpose : //======================================================================= -const list& SMESHDS_Mesh::GetHypothesis( - const TopoDS_Shape & S) const +const list& +SMESHDS_Mesh::GetHypothesis(const TopoDS_Shape & S) const { - if (myShapeToHypothesis.find(S)!=myShapeToHypothesis.end()) - return myShapeToHypothesis.find(S)->second; + if ( myShapeToHypothesis.IsBound( S.Oriented(TopAbs_FORWARD) ) ) // ignore orientation of S + return myShapeToHypothesis.Find( S.Oriented(TopAbs_FORWARD) ); - static list empty; - return empty; + static list empty; + return empty; } //======================================================================= @@ -826,7 +1145,7 @@ bool SMESHDS_Mesh::HasMeshElements(const TopoDS_Shape & S) //======================================================================= bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S) { - return myShapeToHypothesis.find(S)!=myShapeToHypothesis.end(); + return myShapeToHypothesis.IsBound(S.Oriented(TopAbs_FORWARD)); } //======================================================================= @@ -836,13 +1155,14 @@ bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S) SMESHDS_SubMesh * SMESHDS_Mesh::NewSubMesh(int Index) { SMESHDS_SubMesh* SM = 0; - if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) + TShapeIndexToSubMesh::iterator anIter = myShapeIndexToSubMesh.find(Index); + if (anIter == myShapeIndexToSubMesh.end()) { SM = new SMESHDS_SubMesh(); myShapeIndexToSubMesh[Index]=SM; } else - SM = myShapeIndexToSubMesh[Index]; + SM = anIter->second; return SM; } @@ -855,7 +1175,7 @@ int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S, TopAbs_ShapeEnum type) { int aMainIndex = 0; - if ( IsGroupOfSubShapes( S )) + if ( IsGroupOfSubShapes( S ) || (S.ShapeType() == TopAbs_VERTEX && myIndexToShape.Contains(S)) ) { aMainIndex = myIndexToShape.Add( S ); bool all = ( type == TopAbs_SHAPE ); @@ -865,7 +1185,7 @@ int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S, SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex ); if ( !aNewSub->IsComplexSubmesh() ) // is empty { - int shapeType = all ? myShape.ShapeType() : type; + int shapeType = Max( TopAbs_SOLID, all ? myShape.ShapeType() : type ); int typeLimit = all ? TopAbs_VERTEX : type; for ( ; shapeType <= typeLimit; shapeType++ ) { @@ -886,7 +1206,7 @@ int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S, //function : IndexToShape //purpose : //======================================================================= -TopoDS_Shape SMESHDS_Mesh::IndexToShape(int ShapeIndex) +const TopoDS_Shape& SMESHDS_Mesh::IndexToShape(int ShapeIndex) const { return myIndexToShape.FindKey(ShapeIndex); } @@ -895,7 +1215,7 @@ TopoDS_Shape SMESHDS_Mesh::IndexToShape(int ShapeIndex) //function : ShapeToIndex //purpose : //======================================================================= -int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) +int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const { if (myShape.IsNull()) MESSAGE("myShape is NULL"); @@ -911,78 +1231,521 @@ int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) //======================================================================= void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index) { - //Set Position on Node - //Handle (SMDS_FacePosition) aPos = new SMDS_FacePosition (myFaceToId(S),0.,0.);; - //aNode->SetPosition(aPos); + if ( add( aNode, getSubmesh( Index ))) + ((SMDS_MeshNode*) aNode)->SetPosition( volumePosition( Index )); +} - //Update or build submesh - if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh(); +//======================================================================= +//function : SetNodeOnFace +//purpose : +//======================================================================= +void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode* aNode, int Index, double u, double v) +{ + //Set Position on Node + if ( add( aNode, getSubmesh( Index ))) + aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(Index, u, v))); +} - myShapeIndexToSubMesh[Index]->AddNode(aNode); +//======================================================================= +//function : SetNodeOnEdge +//purpose : +//======================================================================= +void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode* aNode, + int Index, + double u) +{ + //Set Position on Node + if ( add( aNode, getSubmesh( Index ))) + aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(Index, u))); } //======================================================================= -//function : SetNodeOnFace +//function : SetNodeOnVertex //purpose : //======================================================================= -void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode* aNode, int Index) +void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode* aNode, int Index) { - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(Index, 0., 0.))); + //Set Position on Node + if ( add( aNode, getSubmesh( Index ))) + aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(Index))); +} - //Update or build submesh - if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh(); +//======================================================================= +//function : SetMeshElementOnShape +//purpose : +//======================================================================= +void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement, + int Index) +{ + add( anElement, getSubmesh( Index )); +} - myShapeIndexToSubMesh[Index]->AddNode(aNode); +//======================================================================= +//function : ~SMESHDS_Mesh +//purpose : +//======================================================================= +SMESHDS_Mesh::~SMESHDS_Mesh() +{ + // myScript + delete myScript; + // submeshes + TShapeIndexToSubMesh::iterator i_sm = myShapeIndexToSubMesh.begin(); + for ( ; i_sm != myShapeIndexToSubMesh.end(); ++i_sm ) + delete i_sm->second; } + +//******************************************************************** +//******************************************************************** +//******** ********* +//***** Methods for addition of quadratic elements ****** +//******** ********* +//******************************************************************** +//******************************************************************** + //======================================================================= -//function : SetNodeOnEdge +//function : AddEdgeWithID //purpose : //======================================================================= -void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode* aNode, int Index) +SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int n12, int ID) { - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(Index, 0.))); + SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,n12,ID); + if(anElem) myScript->AddEdge(ID,n1,n2,n12); + return anElem; +} - //Update or build submesh - if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh(); +//======================================================================= +//function : AddEdge +//purpose : +//======================================================================= +SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode* n1, + const SMDS_MeshNode* n2, + const SMDS_MeshNode* n12) +{ + SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2,n12); + if(anElem) myScript->AddEdge(anElem->GetID(), + n1->GetID(), + n2->GetID(), + n12->GetID()); + return anElem; +} - myShapeIndexToSubMesh[Index]->AddNode(aNode); +//======================================================================= +//function : AddEdgeWithID +//purpose : +//======================================================================= +SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n12, + int ID) +{ + return AddEdgeWithID(n1->GetID(), + n2->GetID(), + n12->GetID(), + ID); } + //======================================================================= -//function : SetNodeOnVertex +//function : AddFace //purpose : //======================================================================= -void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode* aNode, int Index) +SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31) { - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(Index))); + SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31); + if(anElem) myScript->AddFace(anElem->GetID(), + n1->GetID(), n2->GetID(), n3->GetID(), + n12->GetID(), n23->GetID(), n31->GetID()); + return anElem; +} - //Update or build submesh - if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh(); +//======================================================================= +//function : AddFaceWithID +//purpose : +//======================================================================= +SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, + int n12,int n23,int n31, int ID) +{ + SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n12,n23,n31,ID); + if(anElem) myScript->AddFace(ID,n1,n2,n3,n12,n23,n31); + return anElem; +} - myShapeIndexToSubMesh[Index]->AddNode(aNode); +//======================================================================= +//function : AddFaceWithID +//purpose : +//======================================================================= +SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31, + int ID) +{ + return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), + n12->GetID(), n23->GetID(), n31->GetID(), + ID); } + //======================================================================= -//function : SetMeshElementOnShape +//function : AddFace //purpose : //======================================================================= -void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement, - int Index) +SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41) { - if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh(); + SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41); + if(anElem) myScript->AddFace(anElem->GetID(), + n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(), + n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID()); + return anElem; +} - myShapeIndexToSubMesh[Index]->AddElement(anElement); +//======================================================================= +//function : AddFaceWithID +//purpose : +//======================================================================= +SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4, + int n12,int n23,int n34,int n41, int ID) +{ + SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,ID); + if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41); + return anElem; } -SMESHDS_Mesh::~SMESHDS_Mesh() +//======================================================================= +//function : AddFaceWithID +//purpose : +//======================================================================= +SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41, + int ID) +{ + return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(), + n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(), + ID); +} + + +//======================================================================= +//function : AddVolume +//purpose : +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31, + const SMDS_MeshNode * n14, + const SMDS_MeshNode * n24, + const SMDS_MeshNode * n34) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34); + if(anElem) myScript->AddVolume(anElem->GetID(), + n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(), + n12->GetID(), n23->GetID(), n31->GetID(), + n14->GetID(), n24->GetID(), n34->GetID()); + return anElem; +} + +//======================================================================= +//function : AddVolumeWithID +//purpose : +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, + int n12,int n23,int n31, + int n14,int n24,int n34, int ID) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n12,n23, + n31,n14,n24,n34,ID); + if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n12,n23,n31,n14,n24,n34); + return anElem; +} + +//======================================================================= +//function : AddVolumeWithID +//purpose : 2d order tetrahedron of 10 nodes +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31, + const SMDS_MeshNode * n14, + const SMDS_MeshNode * n24, + const SMDS_MeshNode * n34, + int ID) +{ + return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(), + n12->GetID(), n23->GetID(), n31->GetID(), + n14->GetID(), n24->GetID(), n34->GetID(), ID); +} + + +//======================================================================= +//function : AddVolume +//purpose : +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41, + const SMDS_MeshNode * n15, + const SMDS_MeshNode * n25, + const SMDS_MeshNode * n35, + const SMDS_MeshNode * n45) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n12,n23,n34,n41, + n15,n25,n35,n45); + if(anElem) + myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(), + n3->GetID(), n4->GetID(), n5->GetID(), + n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(), + n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID()); + return anElem; +} + +//======================================================================= +//function : AddVolumeWithID +//purpose : +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, + int n12,int n23,int n34,int n41, + int n15,int n25,int n35,int n45, int ID) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5, + n12,n23,n34,n41, + n15,n25,n35,n45,ID); + if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n12,n23,n34,n41, + n15,n25,n35,n45); + return anElem; +} + +//======================================================================= +//function : AddVolumeWithID +//purpose : 2d order pyramid of 13 nodes +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41, + const SMDS_MeshNode * n15, + const SMDS_MeshNode * n25, + const SMDS_MeshNode * n35, + const SMDS_MeshNode * n45, + int ID) +{ + return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), + n4->GetID(), n5->GetID(), + n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(), + n15->GetID(), n25->GetID(), n35->GetID(), n45->GetID(), + ID); +} + + +//======================================================================= +//function : AddVolume +//purpose : +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31, + const SMDS_MeshNode * n45, + const SMDS_MeshNode * n56, + const SMDS_MeshNode * n64, + const SMDS_MeshNode * n14, + const SMDS_MeshNode * n25, + const SMDS_MeshNode * n36) { + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n12,n23,n31, + n45,n56,n64,n14,n25,n36); + if(anElem) + myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(), + n3->GetID(), n4->GetID(), n5->GetID(), n6->GetID(), + n12->GetID(), n23->GetID(), n31->GetID(), + n45->GetID(), n56->GetID(), n64->GetID(), + n14->GetID(), n25->GetID(), n36->GetID()); + return anElem; } + +//======================================================================= +//function : AddVolumeWithID +//purpose : +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, + int n4, int n5, int n6, + int n12,int n23,int n31, + int n45,int n56,int n64, + int n14,int n25,int n36, int ID) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6, + n12,n23,n31, + n45,n56,n64, + n14,n25,n36,ID); + if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n12,n23,n31, + n45,n56,n64,n14,n25,n36); + return anElem; +} + +//======================================================================= +//function : AddVolumeWithID +//purpose : 2d order Pentahedron with 15 nodes +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31, + const SMDS_MeshNode * n45, + const SMDS_MeshNode * n56, + const SMDS_MeshNode * n64, + const SMDS_MeshNode * n14, + const SMDS_MeshNode * n25, + const SMDS_MeshNode * n36, + int ID) +{ + return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), + n4->GetID(), n5->GetID(), n6->GetID(), + n12->GetID(), n23->GetID(), n31->GetID(), + n45->GetID(), n56->GetID(), n64->GetID(), + n14->GetID(), n25->GetID(), n36->GetID(), + ID); +} + + +//======================================================================= +//function : AddVolume +//purpose : +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41, + const SMDS_MeshNode * n56, + const SMDS_MeshNode * n67, + const SMDS_MeshNode * n78, + const SMDS_MeshNode * n85, + const SMDS_MeshNode * n15, + const SMDS_MeshNode * n26, + const SMDS_MeshNode * n37, + const SMDS_MeshNode * n48) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8, + n12,n23,n34,n41, + n56,n67,n78,n85, + n15,n26,n37,n48); + if(anElem) + myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(), + n3->GetID(), n4->GetID(), n5->GetID(), + n6->GetID(), n7->GetID(), n8->GetID(), + n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(), + n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(), + n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID()); + return anElem; +} + +//======================================================================= +//function : AddVolumeWithID +//purpose : +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, + int n5, int n6, int n7, int n8, + int n12,int n23,int n34,int n41, + int n56,int n67,int n78,int n85, + int n15,int n26,int n37,int n48, int ID) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8, + n12,n23,n34,n41, + n56,n67,n78,n85, + n15,n26,n37,n48,ID); + if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41, + n56,n67,n78,n85,n15,n26,n37,n48); + return anElem; +} + +//======================================================================= +//function : AddVolumeWithID +//purpose : 2d order Hexahedrons with 20 nodes +//======================================================================= +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41, + const SMDS_MeshNode * n56, + const SMDS_MeshNode * n67, + const SMDS_MeshNode * n78, + const SMDS_MeshNode * n85, + const SMDS_MeshNode * n15, + const SMDS_MeshNode * n26, + const SMDS_MeshNode * n37, + const SMDS_MeshNode * n48, + int ID) +{ + return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(), + n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(), + n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(), + n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(), + n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(), + ID); +} + +