00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef StdMeshers_Penta_3D_HeaderFile
00027 #define StdMeshers_Penta_3D_HeaderFile
00028
00029 #include "SMESH_StdMeshers.hxx"
00030
00031 #include <map>
00032
00034
00035
00036
00038 #include <gp_Pnt.hxx>
00039 #include <gp_XYZ.hxx>
00040 #include <TopoDS_Vertex.hxx>
00041 #include <TopoDS_Shell.hxx>
00042 #include <TopTools_IndexedMapOfOrientedShape.hxx>
00043 #include <TColStd_MapOfInteger.hxx>
00044
00045 #include "SMESH_Block.hxx"
00046 #include "SMESH_ComputeError.hxx"
00047 #include "SMESH_MesherHelper.hxx"
00048 #include "SMESH_3D_Algo.hxx"
00049
00050 typedef std::map< double, std::vector<const SMDS_MeshNode*> > StdMeshers_IJNodeMap;
00051
00052 class STDMESHERS_EXPORT StdMeshers_SMESHBlock {
00053
00054 public:
00055
00056 StdMeshers_SMESHBlock();
00057
00058 void Load (const TopoDS_Shell& theShell);
00059
00060 void Load (const TopoDS_Shell& theShell,
00061 const TopoDS_Vertex& theV000,
00062 const TopoDS_Vertex& theV001);
00063
00064 void ComputeParameters(const gp_Pnt& thePnt,
00065 gp_XYZ& theXYZ);
00066
00067 void ComputeParameters(const gp_Pnt& thePnt,
00068 const TopoDS_Shape& theShape,
00069 gp_XYZ& theXYZ);
00070
00071 void ComputeParameters(const double& theU,
00072 const TopoDS_Shape& theShape,
00073 gp_XYZ& theXYZ);
00074
00075 void Point(const gp_XYZ& theParams,
00076 gp_Pnt& thePnt);
00077
00078 void Point(const gp_XYZ& theParams,
00079 const TopoDS_Shape& theShape,
00080 gp_Pnt& thePnt);
00081
00082 int ShapeID(const TopoDS_Shape& theShape);
00083
00084 const TopoDS_Shape& Shape(const int theID);
00085
00086 SMESH_Block & Block() { return myTBlock; }
00087
00088 bool IsForwadEdge(const int theEdgeID);
00089
00090 int ErrorStatus() const;
00091
00092 SMESH_ComputeErrorPtr GetError() const;
00093
00094
00095 protected:
00096 TopoDS_Shell myShell;
00097 TopTools_IndexedMapOfOrientedShape myShapeIDMap;
00098 SMESH_Block myTBlock;
00099 TopoDS_Shape myEmptyShape;
00100 std::vector<int> myIsEdgeForward;
00101
00102 int myErrorStatus;
00103 };
00104
00106
00107
00108
00110 #include "SMDS_MeshNode.hxx"
00111
00112 class STDMESHERS_EXPORT StdMeshers_TNode {
00113
00114 public:
00115
00116 StdMeshers_TNode(){
00117 myNode=NULL;
00118 myXYZ.SetCoord(99., 99., 99.);
00119 myShapeSupportID=-1;
00120 myBaseNodeID=-1;
00121 }
00122
00123 void SetNode(const SMDS_MeshNode* theNode) {
00124 myNode=(SMDS_MeshNode*) theNode;
00125 }
00126
00127 const SMDS_MeshNode* Node()const {
00128 return myNode;
00129 }
00130
00131 void SetShapeSupportID (const int theID) {
00132 myShapeSupportID=theID;
00133 }
00134
00135 int ShapeSupportID()const {
00136 return myShapeSupportID;
00137 }
00138
00139 void SetNormCoord (const gp_XYZ& theXYZ) {
00140 myXYZ=theXYZ;
00141 }
00142
00143 const gp_XYZ& NormCoord ()const{
00144 return myXYZ;
00145 }
00146
00147 void SetBaseNodeID (const int theID) {
00148 myBaseNodeID=theID;
00149 }
00150
00151 int BaseNodeID ()const{
00152 return myBaseNodeID;
00153 }
00154
00155 private:
00156 SMDS_MeshNode* myNode;
00157 int myShapeSupportID;
00158 gp_XYZ myXYZ;
00159 int myBaseNodeID;
00160 };
00161
00163
00164
00165
00167 #include "SMESH_Mesh.hxx"
00168 #include <TopoDS_Shape.hxx>
00169
00170 class STDMESHERS_EXPORT StdMeshers_Penta_3D {
00171
00172 public:
00173 StdMeshers_Penta_3D();
00174
00175 ~StdMeshers_Penta_3D();
00176
00177 bool Compute(SMESH_Mesh& , const TopoDS_Shape& );
00178
00179 int ErrorStatus() const {
00180 if (myErrorStatus->IsOK())
00181 return 0;
00182 return myErrorStatus->myName;
00183 }
00184
00185 SMESH_ComputeErrorPtr GetComputeError() const {
00186 return myErrorStatus;
00187 }
00188
00189 void SetTolerance(const double theTol3D) {
00190 myTol3D=theTol3D;
00191 }
00192
00193 double Tolerance() const {
00194 return myTol3D;
00195 }
00196
00197 bool LoadIJNodes(StdMeshers_IJNodeMap & theIJNodes,
00198 const TopoDS_Face& theFace,
00199 const TopoDS_Edge& theBaseEdge,
00200 SMESHDS_Mesh* theMesh);
00201
00202
00203
00204
00205
00206
00207
00208 bool Evaluate(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape,
00209 MapShapeNbElems& aResMap);
00210
00211
00212 protected:
00213
00214 void CheckData();
00215
00216 void MakeBlock();
00217
00218 void MakeNodes();
00219
00220 double SetHorizEdgeXYZ(const gp_XYZ& aBNXYZ,
00221 const int aFaceID,
00222 std::vector<const SMDS_MeshNode*>*& aCol1,
00223 std::vector<const SMDS_MeshNode*>*& aCol2);
00224
00225 void ShapeSupportID(const bool theIsUpperLayer,
00226 const SMESH_Block::TShapeID theBNSSID,
00227 SMESH_Block::TShapeID& theSSID);
00228
00229 void FindNodeOnShape(const TopoDS_Shape& aS,
00230 const gp_XYZ& aParams,
00231 const int z,
00232 StdMeshers_TNode& aTN);
00233
00234 void CreateNode(const bool theIsUpperLayer,
00235 const gp_XYZ& aParams,
00236 StdMeshers_TNode& aTN);
00237
00238 void ClearMeshOnFxy1();
00239
00240 void MakeMeshOnFxy1();
00241
00242 void MakeConnectingMap();
00243
00244 int GetIndexOnLayer(const int aID);
00245
00246 void MakeVolumeMesh();
00247
00248 void SetMesh(SMESH_Mesh& theMesh) {
00249 myMesh=(void *)&theMesh;
00250 }
00251
00252 SMESH_Mesh* GetMesh()const {
00253 return (SMESH_Mesh*)myMesh;
00254 }
00255
00256 protected:
00257 TopoDS_Shape myShape;
00258 StdMeshers_SMESHBlock myBlock;
00259 void * myMesh;
00260 SMESH_ComputeErrorPtr myErrorStatus;
00261
00262 std::vector <StdMeshers_TNode> myTNodes;
00263 int myISize;
00264 int myJSize;
00265 double myTol3D;
00266 std::map < int, int > myConnectingMap;
00267
00268 std::vector<StdMeshers_IJNodeMap> myWallNodesMaps;
00269 std::vector<gp_XYZ> myShapeXYZ;
00270
00271 bool myCreateQuadratic;
00272 SMESH_MesherHelper* myTool;
00273 };
00274
00275 #endif