using namespace std; //============================================================================= // File : SMESH_Mesh.cxx // Created : // Author : Yves FRICAUD, OCC // Project : SALOME // Copyright : OCC 2002 // $Header: //============================================================================= #include "SMESHDS_Mesh.ixx" #include "SMESHDS_Hypothesis.hxx" #include "SMESHDS_DataMapOfShapeListOfPtrHypothesis.hxx" #include "SMESHDS_ListIteratorOfListOfPtrHypothesis.hxx" #include "SMDS_VertexPosition.hxx" #include "SMDS_EdgePosition.hxx" #include "SMDS_FacePosition.hxx" #include #include #include #include "utilities.h" //======================================================================= //function : Create //purpose : //======================================================================= SMESHDS_Mesh::SMESHDS_Mesh(const Standard_Integer MeshID) : myMeshID( MeshID) { myScript = new SMESHDS_Script(); } //======================================================================= //function : ShapeToMesh //purpose : //======================================================================= void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape& S) { myShape = S; TopExp::MapShapes(myShape,myIndexToShape); } //======================================================================= //function : AddHypothesis //purpose : //======================================================================= Standard_Boolean SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape& SS, const SMESHDS_PtrHypothesis& H) { if (!myShapeToHypothesis.IsBound(SS)){ SMESHDS_ListOfPtrHypothesis empty; myShapeToHypothesis.Bind(SS,empty); } else { //Check if the Hypothesis is still present SMESHDS_ListOfPtrHypothesis& Hypos = myShapeToHypothesis.ChangeFind (SS); for (SMESHDS_ListIteratorOfListOfPtrHypothesis it(Hypos); it.More(); it.Next()) { if (H == it.Value()) { return Standard_False; } } } myShapeToHypothesis(SS).Append(H); return Standard_True; } //======================================================================= //function : RemoveHypothesis //purpose : //======================================================================= Standard_Boolean SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape& S, const SMESHDS_PtrHypothesis& H) { if (myShapeToHypothesis.IsBound(S)){ SMESHDS_ListOfPtrHypothesis& Hypos = myShapeToHypothesis.ChangeFind (S); for (SMESHDS_ListIteratorOfListOfPtrHypothesis it(Hypos); it.More(); it.Next()) { if (H == it.Value()) { Hypos.Remove(it); return Standard_True; } } } return Standard_False; } //======================================================================= //function : AddNode //purpose : //======================================================================= Standard_Integer SMESHDS_Mesh::AddNode(const Standard_Real x, const Standard_Real y, const Standard_Real z) { Standard_Integer NodeID = SMDS_Mesh::AddNode(x,y,z); myScript->AddNode(NodeID,x,y,z); return NodeID; } //======================================================================= //function : MoveNode //purpose : //======================================================================= void SMESHDS_Mesh::MoveNode(const Standard_Integer ID, const Standard_Real x, const Standard_Real y, const Standard_Real z) { Handle(SMDS_MeshNode) Node = Handle(SMDS_MeshNode)::DownCast(FindNode(ID)); gp_Pnt P(x,y,z); Node->SetPnt(P); myScript->MoveNode(ID,x,y,z); } //======================================================================= //function : AddEdge //purpose : //======================================================================= Standard_Integer SMESHDS_Mesh::AddEdge(const Standard_Integer idnode1, const Standard_Integer idnode2) { Standard_Integer ID = SMDS_Mesh::AddEdge(idnode1,idnode2); myScript->AddEdge (ID,idnode1,idnode2); return ID; } //======================================================================= //function :AddFace //purpose : //======================================================================= Standard_Integer SMESHDS_Mesh::AddFace(const Standard_Integer idnode1, const Standard_Integer idnode2, const Standard_Integer idnode3) { Standard_Integer ID = SMDS_Mesh::AddFace(idnode1,idnode2,idnode3); myScript->AddFace (ID,idnode1,idnode2,idnode3); return ID; } //======================================================================= //function :AddFace //purpose : //======================================================================= Standard_Integer SMESHDS_Mesh::AddFace(const Standard_Integer idnode1, const Standard_Integer idnode2, const Standard_Integer idnode3, const Standard_Integer idnode4) { Standard_Integer ID = SMDS_Mesh::AddFace(idnode1,idnode2,idnode3,idnode4); myScript->AddFace (ID,idnode1,idnode2,idnode3,idnode4); return ID; } //======================================================================= //function :AddVolume //purpose : //======================================================================= Standard_Integer SMESHDS_Mesh::AddVolume(const Standard_Integer idnode1, const Standard_Integer idnode2, const Standard_Integer idnode3, const Standard_Integer idnode4) { Standard_Integer ID = SMDS_Mesh::AddVolume(idnode1,idnode2,idnode3,idnode4); myScript->AddVolume (ID,idnode1,idnode2,idnode3,idnode4); return ID; } //======================================================================= //function :AddVolume //purpose : //======================================================================= Standard_Integer SMESHDS_Mesh::AddVolume(const Standard_Integer idnode1, const Standard_Integer idnode2, const Standard_Integer idnode3, const Standard_Integer idnode4, const Standard_Integer idnode5) { Standard_Integer ID = SMDS_Mesh::AddVolume(idnode1,idnode2,idnode3,idnode4,idnode5); myScript->AddVolume (ID,idnode1,idnode2,idnode3,idnode4,idnode5); return ID; } //======================================================================= //function :AddVolume //purpose : //======================================================================= Standard_Integer SMESHDS_Mesh::AddVolume(const Standard_Integer idnode1, const Standard_Integer idnode2, const Standard_Integer idnode3, const Standard_Integer idnode4, const Standard_Integer idnode5, const Standard_Integer idnode6) { Standard_Integer ID = SMDS_Mesh::AddVolume(idnode1,idnode2,idnode3,idnode4,idnode5,idnode6); myScript->AddVolume (ID,idnode1,idnode2,idnode3,idnode4,idnode5,idnode6); return ID; } //======================================================================= //function :AddVolume //purpose : //======================================================================= Standard_Integer SMESHDS_Mesh::AddVolume(const Standard_Integer idnode1, const Standard_Integer idnode2, const Standard_Integer idnode3, const Standard_Integer idnode4, const Standard_Integer idnode5, const Standard_Integer idnode6, const Standard_Integer idnode7, const Standard_Integer idnode8) { Standard_Integer ID = SMDS_Mesh::AddVolume(idnode1,idnode2,idnode3,idnode4,idnode5,idnode6,idnode7,idnode8); myScript->AddVolume (ID,idnode1,idnode2,idnode3,idnode4,idnode5,idnode6,idnode7,idnode8); return ID; } //======================================================================= //function : RemoveNode //purpose : //======================================================================= void SMESHDS_Mesh::RemoveNode(const Standard_Integer ID) { SMDS_Mesh::RemoveNode (ID); myScript->RemoveNode (ID); } //======================================================================= //function : RemoveElement //purpose : //======================================================================== void SMESHDS_Mesh::RemoveElement(const Standard_Integer ID) { SMDS_Mesh::RemoveElement (ID); myScript->RemoveElement (ID); } //======================================================================= //function : SetNodeOnVolume //purpose : //======================================================================= void SMESHDS_Mesh::SetNodeInVolume (const Handle(SMDS_MeshNode)& aNode, const TopoDS_Shell& S) { if (myShape.IsNull()) Standard_NullObject::Raise("SMESHDS_Mesh::SetNodeOnVolume"); Standard_Integer Index = myIndexToShape.FindIndex(S); //Set Position on Node //Handle (SMDS_FacePosition) aPos = new SMDS_FacePosition (myFaceToId(S),0.,0.);; //aNode->SetPosition(aPos); //Update or build submesh if (!myShapeIndexToSubMesh.IsBound(Index)) { Handle(SMESHDS_SubMesh) SM = new SMESHDS_SubMesh (this); myShapeIndexToSubMesh.Bind(Index,SM); } myShapeIndexToSubMesh(Index)->AddNode (aNode); } //======================================================================= //function : SetNodeOnFace //purpose : //======================================================================= void SMESHDS_Mesh::SetNodeOnFace (const Handle(SMDS_MeshNode)& aNode, const TopoDS_Face& S) { if (myShape.IsNull()) Standard_NullObject::Raise("SMESHDS_Mesh::SetNodeOnFace"); Standard_Integer Index = myIndexToShape.FindIndex(S); //Set Position on Node Handle (SMDS_FacePosition) aPos = new SMDS_FacePosition (Index,0.,0.);; aNode->SetPosition(aPos); //Update or build submesh if (!myShapeIndexToSubMesh.IsBound(Index)) { Handle(SMESHDS_SubMesh) SM = new SMESHDS_SubMesh (this); myShapeIndexToSubMesh.Bind(Index,SM); } myShapeIndexToSubMesh(Index)->AddNode (aNode); } //======================================================================= //function : SetNodeOnEdge //purpose : //======================================================================= void SMESHDS_Mesh::SetNodeOnEdge (const Handle(SMDS_MeshNode)& aNode, const TopoDS_Edge& S) { if (myShape.IsNull()) Standard_NullObject::Raise("SMESHDS_Mesh::SetNodeOnEdge"); Standard_Integer Index = myIndexToShape.FindIndex(S); //Set Position on Node Handle (SMDS_EdgePosition) aPos = new SMDS_EdgePosition (Index,0.);; aNode->SetPosition(aPos); //Update or build submesh if (!myShapeIndexToSubMesh.IsBound(Index)) { Handle(SMESHDS_SubMesh) SM = new SMESHDS_SubMesh (this); myShapeIndexToSubMesh.Bind(Index,SM); } myShapeIndexToSubMesh(Index)->AddNode (aNode); } //======================================================================= //function : SetNodeOnVertex //purpose : //======================================================================= void SMESHDS_Mesh::SetNodeOnVertex (const Handle(SMDS_MeshNode)& aNode, const TopoDS_Vertex& S) { if (myShape.IsNull()) Standard_NullObject::Raise("SMESHDS_Mesh::SetNodeOnVertex"); Standard_Integer Index = myIndexToShape.FindIndex(S); //Set Position on Node Handle (SMDS_VertexPosition) aPos = new SMDS_VertexPosition (Index);; aNode->SetPosition(aPos); //Update or build submesh if (!myShapeIndexToSubMesh.IsBound(Index)) { Handle(SMESHDS_SubMesh) SM = new SMESHDS_SubMesh (this); myShapeIndexToSubMesh.Bind(Index,SM); } myShapeIndexToSubMesh(Index)->AddNode (aNode); } //======================================================================= //function : UnSetNodeOnShape //purpose : //======================================================================= void SMESHDS_Mesh::UnSetNodeOnShape(const Handle(SMDS_MeshNode)& aNode) { MESSAGE("not implemented"); } //======================================================================= //function : SetMeshElementOnShape //purpose : //======================================================================= void SMESHDS_Mesh::SetMeshElementOnShape (const Handle(SMDS_MeshElement)& anElement, const TopoDS_Shape& S) { if (myShape.IsNull()) Standard_NullObject::Raise("SMESHDS_Mesh::SetMeshElementOnShape"); Standard_Integer Index = myIndexToShape.FindIndex(S); if (!myShapeIndexToSubMesh.IsBound(Index)) { Handle(SMESHDS_SubMesh) SM = new SMESHDS_SubMesh (this); myShapeIndexToSubMesh.Bind(Index,SM); } myShapeIndexToSubMesh(Index)->AddElement (anElement); } //======================================================================= //function : UnSetMeshElementOnShape //purpose : //======================================================================= void SMESHDS_Mesh::UnSetMeshElementOnShape (const Handle(SMDS_MeshElement)& anElement, const TopoDS_Shape& S) { if (myShape.IsNull()) Standard_NullObject::Raise("SMESHDS_Mesh::UnSetMeshElementOnShape"); Standard_Integer Index = myIndexToShape.FindIndex(S); if (myShapeIndexToSubMesh.IsBound(Index)) myShapeIndexToSubMesh(Index)->RemoveElement (anElement); } //======================================================================= //function : ShapeToMesh //purpose : //======================================================================= TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() { return myShape; } //======================================================================= //function : MeshElements //purpose : //======================================================================= Handle_SMESHDS_SubMesh SMESHDS_Mesh::MeshElements(const TopoDS_Shape& S) { if (myShape.IsNull()) Standard_NullObject::Raise("SMESHDS_Mesh::MeshElements"); Standard_Integer Index = myIndexToShape.FindIndex(S); if (myShapeIndexToSubMesh.IsBound(Index)) return myShapeIndexToSubMesh(Index); Handle(SMESHDS_SubMesh) SM; return SM; } //======================================================================= //function : GetHypothesis //purpose : //======================================================================= const SMESHDS_ListOfPtrHypothesis& SMESHDS_Mesh::GetHypothesis(const TopoDS_Shape& S) { if (myShapeToHypothesis.IsBound(S)) return myShapeToHypothesis(S); static SMESHDS_ListOfPtrHypothesis empty; return empty; } //======================================================================= //function : GetScript //purpose : //======================================================================= const Handle (SMESHDS_Script)& SMESHDS_Mesh::GetScript() { return myScript; } //======================================================================= //function : ClearScript //purpose : //======================================================================= void SMESHDS_Mesh::ClearScript() { myScript->Clear(); } //======================================================================= //function : HasMeshElements //purpose : //======================================================================= Standard_Boolean SMESHDS_Mesh::HasMeshElements(const TopoDS_Shape& S) { if (myShape.IsNull()) Standard_NullObject::Raise("SMESHDS_Mesh::MeshElements"); Standard_Integer Index = myIndexToShape.FindIndex(S); return myShapeIndexToSubMesh.IsBound(Index); } //======================================================================= //function : HasHypothesis //purpose : //======================================================================= Standard_Boolean SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape& S) { return myShapeToHypothesis.IsBound(S); } //======================================================================= //function : NewSubMesh //purpose : //======================================================================= void SMESHDS_Mesh::NewSubMesh(const Standard_Integer Index) { if (!myShapeIndexToSubMesh.IsBound(Index)) { Handle(SMESHDS_SubMesh) SM = new SMESHDS_SubMesh (this); myShapeIndexToSubMesh.Bind(Index,SM); } } //======================================================================= //function : IndexToShape //purpose : //======================================================================= TopoDS_Shape SMESHDS_Mesh::IndexToShape(const Standard_Integer ShapeIndex) { return myIndexToShape.FindKey(ShapeIndex); } //======================================================================= //function : ShapeToIndex //purpose : //======================================================================= Standard_Integer SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape& S) { if (myShape.IsNull()) Standard_NullObject::Raise("SMESHDS_Mesh::SetNodeOnVolume"); return myIndexToShape.FindIndex(S); } //======================================================================= //function : SetNodeOnVolume //purpose : //======================================================================= void SMESHDS_Mesh::SetNodeInVolume (const Handle(SMDS_MeshNode)& aNode, const Standard_Integer Index) { //Set Position on Node //Handle (SMDS_FacePosition) aPos = new SMDS_FacePosition (myFaceToId(S),0.,0.);; //aNode->SetPosition(aPos); //Update or build submesh if (!myShapeIndexToSubMesh.IsBound(Index)) { Handle(SMESHDS_SubMesh) SM = new SMESHDS_SubMesh (this); myShapeIndexToSubMesh.Bind(Index,SM); } myShapeIndexToSubMesh(Index)->AddNode (aNode); } //======================================================================= //function : SetNodeOnFace //purpose : //======================================================================= void SMESHDS_Mesh::SetNodeOnFace (const Handle(SMDS_MeshNode)& aNode, const Standard_Integer Index) { //Set Position on Node Handle (SMDS_FacePosition) aPos = new SMDS_FacePosition (Index,0.,0.);; aNode->SetPosition(aPos); //Update or build submesh if (!myShapeIndexToSubMesh.IsBound(Index)) { Handle(SMESHDS_SubMesh) SM = new SMESHDS_SubMesh (this); myShapeIndexToSubMesh.Bind(Index,SM); } myShapeIndexToSubMesh(Index)->AddNode (aNode); } //======================================================================= //function : SetNodeOnEdge //purpose : //======================================================================= void SMESHDS_Mesh::SetNodeOnEdge (const Handle(SMDS_MeshNode)& aNode, const Standard_Integer Index) { //Set Position on Node Handle (SMDS_EdgePosition) aPos = new SMDS_EdgePosition (Index,0.);; aNode->SetPosition(aPos); //Update or build submesh if (!myShapeIndexToSubMesh.IsBound(Index)) { Handle(SMESHDS_SubMesh) SM = new SMESHDS_SubMesh (this); myShapeIndexToSubMesh.Bind(Index,SM); } myShapeIndexToSubMesh(Index)->AddNode (aNode); } //======================================================================= //function : SetNodeOnVertex //purpose : //======================================================================= void SMESHDS_Mesh::SetNodeOnVertex (const Handle(SMDS_MeshNode)& aNode, const Standard_Integer Index) { //Set Position on Node Handle (SMDS_VertexPosition) aPos = new SMDS_VertexPosition (Index);; aNode->SetPosition(aPos); //Update or build submesh if (!myShapeIndexToSubMesh.IsBound(Index)) { Handle(SMESHDS_SubMesh) SM = new SMESHDS_SubMesh (this); myShapeIndexToSubMesh.Bind(Index,SM); } myShapeIndexToSubMesh(Index)->AddNode (aNode); } //======================================================================= //function : SetMeshElementOnShape //purpose : //======================================================================= void SMESHDS_Mesh::SetMeshElementOnShape (const Handle(SMDS_MeshElement)& anElement, const Standard_Integer Index) { if (!myShapeIndexToSubMesh.IsBound(Index)) { Handle(SMESHDS_SubMesh) SM = new SMESHDS_SubMesh (this); myShapeIndexToSubMesh.Bind(Index,SM); } myShapeIndexToSubMesh(Index)->AddElement (anElement); }