X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Hexa_3D.cxx;h=a3ed4f11a7142cca9be57bc944b2e49de2af9d57;hb=aeef41e893791465b04f5ce306640a42605849b9;hp=f80cd53cbc4c34ad94478b8b32d764f358178cfb;hpb=ed456586bfb1411c5bff73b221658766689a6253;p=modules%2Fsmesh.git diff --git a/src/StdMeshers/StdMeshers_Hexa_3D.cxx b/src/StdMeshers/StdMeshers_Hexa_3D.cxx index f80cd53cb..a3ed4f11a 100644 --- a/src/StdMeshers/StdMeshers_Hexa_3D.cxx +++ b/src/StdMeshers/StdMeshers_Hexa_3D.cxx @@ -37,6 +37,8 @@ using namespace std; #include "SMDS_MeshElement.hxx" #include "SMDS_MeshNode.hxx" #include "SMDS_FacePosition.hxx" +#include "SMDS_VolumeTool.hxx" +#include "SMDS_VolumeOfNodes.hxx" #include #include @@ -56,7 +58,7 @@ using namespace std; #include "Utils_ExceptHandlers.hxx" //modified by NIZNHY-PKV Wed Nov 17 15:31:58 2004 f -#include +#include "StdMeshers_Penta_3D.hxx" static bool ComputePentahedralMesh(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape); //modified by NIZNHY-PKV Wed Nov 17 15:32:00 2004 t @@ -88,6 +90,8 @@ StdMeshers_Hexa_3D::StdMeshers_Hexa_3D(int hypId, int studyId, StdMeshers_Hexa_3D::~StdMeshers_Hexa_3D() { MESSAGE("StdMeshers_Hexa_3D::~StdMeshers_Hexa_3D"); + for (int i = 0; i < 6; i++) + StdMeshers_Quadrangle_2D::QuadDelete(_quads[i]); } //============================================================================= @@ -167,7 +171,7 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, // 0. - shape and face mesh verification // 0.1 - shape must be a solid (or a shell) with 6 faces - MESSAGE("---"); + //MESSAGE("---"); vector < SMESH_subMesh * >meshFaces; for (TopExp_Explorer exp(aShape, TopAbs_FACE); exp.More(); exp.Next()) @@ -402,16 +406,7 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, int nbz = _cube.quad_Y0->nbPts[0]; if (cy0.a1 != 0.) nbz = _cube.quad_Y0->nbPts[1]; -// int nbx = _cube.quad_Y0->nbPts[0]; -// int nby = _cube.quad_Y0->nbPts[1]; -// int nbz; -// if (cx0.a1 != 0) -// nbz = _cube.quad_X0->nbPts[1]; -// else -// nbz = _cube.quad_X0->nbPts[0]; - //SCRUTE(nbx); - //SCRUTE(nby); - //SCRUTE(nbz); + int i1, j1, nbxyz = nbx * nby * nbz; Point3DStruct *np = new Point3DStruct[nbxyz]; @@ -611,17 +606,7 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, // - compute the point 3D // - store the point 3D in SMESHDS, store its ID in 3D structure - TopoDS_Shell aShell; - TopExp_Explorer exp(aShape, TopAbs_SHELL); - if (exp.More()) - { - aShell = TopoDS::Shell(exp.Current()); - } - else - { - MESSAGE("no shell..."); - ASSERT(0); - } + int shapeID = meshDS->ShapeToIndex( aShape ); Pt3 p000, p001, p010, p011, p100, p101, p110, p111; Pt3 px00, px01, px10, px11; @@ -695,17 +680,39 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, SMDS_MeshNode * node = meshDS->AddNode(X[0], X[1], X[2]); np[ijk].node = node; - //meshDS->SetNodeInVolume(node, TopoDS::Solid(aShape)); - meshDS->SetNodeInVolume(node, aShell); + meshDS->SetNodeInVolume(node, shapeID); } } } + // find orientation of furute volumes according to MED convention + vector< bool > forward( nbx * nby ); + SMDS_VolumeTool vTool; + for (int i = 0; i < nbx - 1; i++) + for (int j = 0; j < nby - 1; j++) + { + int n1 = j * nbx + i; + int n2 = j * nbx + i + 1; + int n3 = (j + 1) * nbx + i + 1; + int n4 = (j + 1) * nbx + i; + int n5 = nbx * nby + j * nbx + i; + int n6 = nbx * nby + j * nbx + i + 1; + int n7 = nbx * nby + (j + 1) * nbx + i + 1; + int n8 = nbx * nby + (j + 1) * nbx + i; + + SMDS_VolumeOfNodes tmpVol (np[n1].node,np[n2].node,np[n3].node,np[n4].node, + np[n5].node,np[n6].node,np[n7].node,np[n8].node); + vTool.Set( &tmpVol ); + forward[ n1 ] = vTool.IsForward(); + } + //2.1 - for each node of the cube (less 3 *1 Faces): // - store hexahedron in SMESHDS MESSAGE("Storing hexahedron into the DS"); for (int i = 0; i < nbx - 1; i++) for (int j = 0; j < nby - 1; j++) + { + bool isForw = forward.at( j * nbx + i ); for (int k = 0; k < nbz - 1; k++) { int n1 = k * nbx * nby + j * nbx + i; @@ -717,46 +724,30 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, int n7 = (k + 1) * nbx * nby + (j + 1) * nbx + i + 1; int n8 = (k + 1) * nbx * nby + (j + 1) * nbx + i; -// MESSAGE(" "<AddVolume(np[n1].node, - np[n2].node, - np[n3].node, - np[n4].node, - np[n5].node, - np[n6].node, - np[n7].node, - np[n8].node); - ; - meshDS->SetMeshElementOnShape(elt, aShell); - - // *** 5 tetrahedres ... verifier orientations, - // mettre en coherence &vec quadrangles-> triangles - // choisir afficher 1 parmi edges, face et volumes -// int tetra1 = meshDS->AddVolume(np[n1].nodeId, -// np[n2].nodeId, -// np[n4].nodeId, -// np[n5].nodeId); -// int tetra2 = meshDS->AddVolume(np[n2].nodeId, -// np[n3].nodeId, -// np[n4].nodeId, -// np[n7].nodeId); -// int tetra3 = meshDS->AddVolume(np[n5].nodeId, -// np[n6].nodeId, -// np[n7].nodeId, -// np[n2].nodeId); -// int tetra4 = meshDS->AddVolume(np[n5].nodeId, -// np[n7].nodeId, -// np[n8].nodeId, -// np[n4].nodeId); -// int tetra5 = meshDS->AddVolume(np[n5].nodeId, -// np[n7].nodeId, -// np[n2].nodeId, -// np[n4].nodeId); - - } - + SMDS_MeshVolume * elt; + if ( isForw ) + elt = meshDS->AddVolume(np[n1].node, + np[n2].node, + np[n3].node, + np[n4].node, + np[n5].node, + np[n6].node, + np[n7].node, + np[n8].node); + else + elt = meshDS->AddVolume(np[n1].node, + np[n4].node, + np[n3].node, + np[n2].node, + np[n5].node, + np[n8].node, + np[n7].node, + np[n6].node); + + meshDS->SetMeshElementOnShape(elt, shapeID); + } + } + if ( np ) delete [] np; //MESSAGE("End of StdMeshers_Hexa_3D::Compute()"); return true; } @@ -1058,7 +1049,7 @@ bool ComputePentahedralMesh(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) //printf(" ComputePentahedralMesh HERE\n"); // bool bOK; - int iErr; + //int iErr; StdMeshers_Penta_3D anAlgo; // bOK=anAlgo.Compute(aMesh, aShape);