X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHDS%2FSMESHDS_Mesh.hxx;h=53d26caffd75507774ae87067205e7a00ceda4bb;hb=f87e54ae3a450f6adeee75d1b42c3b17e9c6250c;hp=dece6ab48ed5d9be805c48278690ca59acbddc22;hpb=e4737e85f0da6d3f90fd08f6be1c2825195fe16f;p=modules%2Fsmesh.git diff --git a/src/SMESHDS/SMESHDS_Mesh.hxx b/src/SMESHDS/SMESHDS_Mesh.hxx index dece6ab48..53d26caff 100644 --- a/src/SMESHDS/SMESHDS_Mesh.hxx +++ b/src/SMESHDS/SMESHDS_Mesh.hxx @@ -38,10 +38,15 @@ #include #include +#include #include #include #include #include +#include +#ifdef WNT +#include +#endif //Not portable see http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_4 to know more. #ifdef __GNUC__ @@ -60,9 +65,15 @@ namespace gstd = std; #endif +#if defined WNT && defined WIN32 && defined SMESHDS_EXPORTS +#define SMESHDS_WNT_EXPORT __declspec( dllexport ) +#else +#define SMESHDS_WNT_EXPORT +#endif + class SMESHDS_GroupBase; -class SMESHDS_Mesh:public SMDS_Mesh{ +class SMESHDS_WNT_EXPORT SMESHDS_Mesh:public SMDS_Mesh{ public: SMESHDS_Mesh(int MeshID); void ShapeToMesh(const TopoDS_Shape & S); @@ -157,17 +168,45 @@ public: const SMDS_MeshNode * n7, const SMDS_MeshNode * n8); + virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector nodes_ids, + const int ID); + + virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector nodes, + const int ID); + + virtual SMDS_MeshFace* AddPolygonalFace (std::vector nodes); + + virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID + (std::vector nodes_ids, + std::vector quantities, + const int ID); + + virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID + (std::vector nodes, + std::vector quantities, + const int ID); + + virtual SMDS_MeshVolume* AddPolyhedralVolume + (std::vector nodes, + std::vector quantities); + void MoveNode(const SMDS_MeshNode *, double x, double y, double z); virtual void RemoveNode(const SMDS_MeshNode *); void RemoveElement(const SMDS_MeshElement *); bool ChangeElementNodes(const SMDS_MeshElement * elem, const SMDS_MeshNode * nodes[], const int nbnodes); + bool ChangePolygonNodes(const SMDS_MeshElement * elem, + std::vector nodes); + bool ChangePolyhedronNodes(const SMDS_MeshElement * elem, + std::vector nodes, + std::vector quantities); void Renumber (const bool isNodes, const int startID=1, const int deltaID=1); void SetNodeInVolume(SMDS_MeshNode * aNode, const TopoDS_Shell & S); - void SetNodeOnFace(SMDS_MeshNode * aNode, const TopoDS_Face & S); - void SetNodeOnEdge(SMDS_MeshNode * aNode, const TopoDS_Edge & S); + void SetNodeInVolume(SMDS_MeshNode * aNode, const TopoDS_Solid & S); + void SetNodeOnFace(SMDS_MeshNode * aNode, const TopoDS_Face & S, double u=0., double v=0.); + void SetNodeOnEdge(SMDS_MeshNode * aNode, const TopoDS_Edge & S, double u=0.); void SetNodeOnVertex(SMDS_MeshNode * aNode, const TopoDS_Vertex & S); void UnSetNodeOnShape(const SMDS_MeshNode * aNode); void SetMeshElementOnShape(const SMDS_MeshElement * anElt, @@ -176,51 +215,92 @@ public: const TopoDS_Shape & S); TopoDS_Shape ShapeToMesh() const; bool HasMeshElements(const TopoDS_Shape & S); - SMESHDS_SubMesh * MeshElements(const TopoDS_Shape & S); + SMESHDS_SubMesh * MeshElements(const TopoDS_Shape & S) const; SMESHDS_SubMesh * MeshElements(const int Index); - list SubMeshIndices(); + std::list SubMeshIndices(); const std::map& SubMeshes() { return myShapeIndexToSubMesh; } bool HasHypothesis(const TopoDS_Shape & S); - const list& GetHypothesis(const TopoDS_Shape & S) const; + const std::list& GetHypothesis(const TopoDS_Shape & S) const; SMESHDS_Script * GetScript(); void ClearScript(); - int ShapeToIndex(const TopoDS_Shape & aShape); + int ShapeToIndex(const TopoDS_Shape & aShape) const; TopoDS_Shape IndexToShape(int ShapeIndex); SMESHDS_SubMesh * NewSubMesh(int Index); int AddCompoundSubmesh(const TopoDS_Shape& S, TopAbs_ShapeEnum type = TopAbs_SHAPE); void SetNodeInVolume(const SMDS_MeshNode * aNode, int Index); - void SetNodeOnFace(SMDS_MeshNode * aNode, int Index); - void SetNodeOnEdge(SMDS_MeshNode * aNode, int Index); + void SetNodeOnFace(SMDS_MeshNode * aNode, int Index , double u=0., double v=0.); + void SetNodeOnEdge(SMDS_MeshNode * aNode, int Index , double u=0.); void SetNodeOnVertex(SMDS_MeshNode * aNode, int Index); void SetMeshElementOnShape(const SMDS_MeshElement * anElt, int Index); void AddGroup (SMESHDS_GroupBase* theGroup) { myGroups.insert(theGroup); } void RemoveGroup (SMESHDS_GroupBase* theGroup) { myGroups.erase(theGroup); } int GetNbGroups() const { return myGroups.size(); } - const set& GetGroups() const { return myGroups; } + const std::set& GetGroups() const { return myGroups; } bool IsGroupOfSubShapes (const TopoDS_Shape& aSubShape) const; ~SMESHDS_Mesh(); private: +#ifndef WNT struct HashTopoDS_Shape{ size_t operator()(const TopoDS_Shape& S) const { return S.HashCode(2147483647); } }; +#else + typedef gstd::hash_compare< TopoDS_Shape, less > HashTopoDS; + + class HashTopoDS_Shape : public HashTopoDS { + public: + + size_t operator()(const TopoDS_Shape& S) const { + return S.HashCode(2147483647); + } + + bool operator()(const TopoDS_Shape& S1,const TopoDS_Shape& S2) const { + return S1==S2; + } + }; + + + +#endif + + void addNodeToSubmesh( const SMDS_MeshNode* aNode, int Index ) + { + //Update or build submesh + map::iterator it = myShapeIndexToSubMesh.find( Index ); + if ( it == myShapeIndexToSubMesh.end() ) + it = myShapeIndexToSubMesh.insert( make_pair(Index, new SMESHDS_SubMesh() )).first; + it->second->AddNode( aNode ); // add aNode to submesh + } + typedef std::list THypList; + +#ifndef WNT typedef gstd::hash_map ShapeToHypothesis; +#else + typedef gstd::hash_map ShapeToHypothesis; +#endif + ShapeToHypothesis myShapeToHypothesis; int myMeshID; TopoDS_Shape myShape; + + typedef std::map TShapeIndexToSubMesh; + TShapeIndexToSubMesh myShapeIndexToSubMesh; + TopTools_IndexedMapOfShape myIndexToShape; - map myShapeIndexToSubMesh; - set myGroups; + + typedef std::set TGroups; + TGroups myGroups; + SMESHDS_Script* myScript; };