#include "SMDS_VertexPosition.hxx"
#include "SMDS_EdgePosition.hxx"
#include "SMDS_FacePosition.hxx"
+#include "SMDS_SpacePosition.hxx"
#include "SMESHDS_GroupOnGeom.hxx"
+
#include <TopExp_Explorer.hxx>
#include <TopExp.hxx>
#include <TopoDS_Iterator.hxx>
//=======================================================================
bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS,
- const SMESHDS_Hypothesis * H)
+ const SMESHDS_Hypothesis * H)
{
- //list<const SMESHDS_Hypothesis *>& alist=myShapeToHypothesis[SS];
-
- if ( !myShapeToHypothesis.IsBound( SS ) )
- myShapeToHypothesis.Bind( SS, list<const SMESHDS_Hypothesis *>() );
-
- list<const SMESHDS_Hypothesis *>& alist = myShapeToHypothesis.ChangeFind( SS );
-
-
+ if (!myShapeToHypothesis.IsBound(SS.Oriented(TopAbs_FORWARD))) {
+ list<const SMESHDS_Hypothesis *> aList;
+ myShapeToHypothesis.Bind(SS.Oriented(TopAbs_FORWARD), aList);
+ }
+ list<const SMESHDS_Hypothesis *>& alist =
+ myShapeToHypothesis(SS.Oriented(TopAbs_FORWARD)); // ignore orientation of SS
- //Check if the Hypothesis is still present
- list<const SMESHDS_Hypothesis*>::iterator ith=alist.begin();
+ //Check if the Hypothesis is still present
+ list<const SMESHDS_Hypothesis*>::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;
}
//=======================================================================
//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<const SMESHDS_Hypothesis*>::iterator ith=(*its).second.begin();
-
- for (; ith!=(*its).second.end(); ith++)
- if (H == *ith)
- {
- (*its).second.erase(ith);
- return true;
- }
- }*/
- if ( myShapeToHypothesis.IsBound( S ) )
+ if( myShapeToHypothesis.IsBound( S.Oriented(TopAbs_FORWARD) ) )
{
- list<const SMESHDS_Hypothesis *>& alist = myShapeToHypothesis.ChangeFind( S );
- list<const SMESHDS_Hypothesis*>::iterator ith = alist.begin();
-
- for (; ith != alist.end(); ith++)
- if (H == *ith)
- {
- alist.erase(ith);
- return true;
- }
+ list<const SMESHDS_Hypothesis *>& alist=myShapeToHypothesis.ChangeFind( S.Oriented(TopAbs_FORWARD) );
+ list<const SMESHDS_Hypothesis*>::iterator ith=find(alist.begin(),alist.end(), H );
+ if (ith != alist.end())
+ {
+ alist.erase(ith);
+ return true;
+ }
}
- return false;
+ return false;
}
//=======================================================================
return false;
}
+namespace {
+
+ //================================================================================
+ /*!
+ * \brief Creates a node position in volume
+ */
+ //================================================================================
+
+ inline SMDS_PositionPtr volumePosition(int volId)
+ {
+ SMDS_SpacePosition* pos = new SMDS_SpacePosition();
+ pos->SetShapeId( volId );
+ return SMDS_PositionPtr(pos);
+ }
+}
+
//=======================================================================
//function : SetNodeOnVolume
//purpose :
const TopoDS_Shell & S)
{
if ( add( aNode, getSubmesh(S) ))
- const_cast<SMDS_Position*>( aNode->GetPosition().get() )->SetShapeId( myCurSubID );
+ aNode->SetPosition ( volumePosition( myCurSubID ));
}
//=======================================================================
//function : SetNodeOnVolume
const TopoDS_Solid & S)
{
if ( add( aNode, getSubmesh(S) ))
- const_cast<SMDS_Position*>( aNode->GetPosition().get() )->SetShapeId( myCurSubID );
+ aNode->SetPosition ( volumePosition( myCurSubID ));
}
//=======================================================================
//purpose :
//=======================================================================
-const list<const SMESHDS_Hypothesis*>& SMESHDS_Mesh::GetHypothesis(
- const TopoDS_Shape & S) const
+const list<const SMESHDS_Hypothesis*>&
+SMESHDS_Mesh::GetHypothesis(const TopoDS_Shape & S) const
{
- if ( myShapeToHypothesis.IsBound(S) )
- return myShapeToHypothesis.Find(S);
+ if ( myShapeToHypothesis.IsBound( S.Oriented(TopAbs_FORWARD) ) ) // ignore orientation of S
+ return myShapeToHypothesis.Find( S.Oriented(TopAbs_FORWARD) );
- static list<const SMESHDS_Hypothesis*> empty;
- return empty;
+ static list<const SMESHDS_Hypothesis*> empty;
+ return empty;
}
//=======================================================================
//=======================================================================
bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S)
{
- return myShapeToHypothesis.IsBound(S);
+ return myShapeToHypothesis.IsBound(S.Oriented(TopAbs_FORWARD));
}
//=======================================================================
void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index)
{
if ( add( aNode, getSubmesh( Index )))
- const_cast<SMDS_Position*>( aNode->GetPosition().get() )->SetShapeId( Index );
+ ((SMDS_MeshNode*) aNode)->SetPosition( volumePosition( Index ));
}
//=======================================================================
add( anElement, getSubmesh( Index ));
}
+//=======================================================================
+//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;
}
-
//********************************************************************
//********************************************************************
//******** *********