X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers_I%2FStdMeshers_CartesianParameters3D_i.cxx;h=90d4ea4928062f0d2af688fa1410da4b8ff0d739;hp=d8b0724764bb2fd3e99ada024431a8fa82491074;hb=30ce546b0c5099ad1112929e2db94810e683e54b;hpb=bd4e115a78b52e3fbc016e5e30bb0e19b2a9e7d6 diff --git a/src/StdMeshers_I/StdMeshers_CartesianParameters3D_i.cxx b/src/StdMeshers_I/StdMeshers_CartesianParameters3D_i.cxx index d8b072476..90d4ea492 100644 --- a/src/StdMeshers_I/StdMeshers_CartesianParameters3D_i.cxx +++ b/src/StdMeshers_I/StdMeshers_CartesianParameters3D_i.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -64,7 +64,6 @@ StdMeshers_CartesianParameters3D_i( PortableServer::POA_ptr thePOA, : SALOME::GenericObj_i( thePOA ), SMESH_Hypothesis_i( thePOA ) { - MESSAGE( "StdMeshers_CartesianParameters3D_i::StdMeshers_CartesianParameters3D_i" ); myBaseImpl = new ::StdMeshers_CartesianParameters3D( theGenImpl->GetANewId(), theStudyId, theGenImpl ); @@ -80,7 +79,6 @@ StdMeshers_CartesianParameters3D_i( PortableServer::POA_ptr thePOA, StdMeshers_CartesianParameters3D_i::~StdMeshers_CartesianParameters3D_i() { - MESSAGE( "StdMeshers_CartesianParameters3D_i::~StdMeshers_CartesianParameters3D_i" ); } //============================================================================= @@ -169,8 +167,8 @@ CORBA::Double StdMeshers_CartesianParameters3D_i::GetSizeThreshold() //\brief Set grid spacing along the three axes // \param spaceFunctions - functions defining spacing values at given point on axis // \param internalPoints - points dividing a grid into parts along each direction -// Parameter t of spaceFunction f(t) is a position [0,1] withing bounding box of -// the shape to mesh or withing an interval defined by internal points +// Parameter t of spaceFunction f(t) is a position [0,1] within bounding box of +// the shape to mesh or within an interval defined by internal points //======================================================================= void StdMeshers_CartesianParameters3D_i::SetGridSpacing(const SMESH::string_array& spaceFunctions, @@ -178,8 +176,8 @@ void StdMeshers_CartesianParameters3D_i::SetGridSpacing(const SMESH::string_arra CORBA::Short axis) throw (SALOME::SALOME_Exception) { - vector funVec; - vector pointVec; + std::vector funVec; + std::vector pointVec; _array2vec( spaceFunctions, funVec, (const char*) ); _array2vec( internalPoints, pointVec, ); @@ -209,8 +207,8 @@ void StdMeshers_CartesianParameters3D_i::GetGridSpacing(SMESH::string_array_out { ASSERT( myBaseImpl ); try { - vector funVec; - vector pointVec; + std::vector funVec; + std::vector pointVec; this->GetImpl()->GetGridSpacing( funVec, pointVec, axis ); xSpaceFunctions = new SMESH::string_array(); @@ -224,9 +222,124 @@ void StdMeshers_CartesianParameters3D_i::GetGridSpacing(SMESH::string_array_out } } +//======================================================================= +//function : SetAxesDirs +//purpose : Set custom direction of axes +//======================================================================= + +void StdMeshers_CartesianParameters3D_i::SetAxesDirs(const SMESH::DirStruct& xDir, + const SMESH::DirStruct& yDir, + const SMESH::DirStruct& zDir) + throw (SALOME::SALOME_Exception) +{ + double coords[9]; + coords[0] = xDir.PS.x; + coords[1] = xDir.PS.y; + coords[2] = xDir.PS.z; + coords[3] = yDir.PS.x; + coords[4] = yDir.PS.y; + coords[5] = yDir.PS.z; + coords[6] = zDir.PS.x; + coords[7] = zDir.PS.y; + coords[8] = zDir.PS.z; + try { + this->GetImpl()->SetAxisDirs(coords); + + SMESH::TPythonDump() << _this() << ".SetAxesDirs( " + << xDir << ", " + << yDir << ", " + << zDir << " )"; + } + catch ( SALOME_Exception& S_ex ) { + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), SALOME::BAD_PARAM ); + } +} + +//======================================================================= +//function : GetAxesDirs +//purpose : Returns direction of axes +//======================================================================= + +void StdMeshers_CartesianParameters3D_i::GetAxesDirs(SMESH::DirStruct& xDir, + SMESH::DirStruct& yDir, + SMESH::DirStruct& zDir) +{ + const double* coords = GetImpl()->GetAxisDirs(); + xDir.PS.x = coords[0]; + xDir.PS.y = coords[1]; + xDir.PS.z = coords[2]; + yDir.PS.x = coords[3]; + yDir.PS.y = coords[4]; + yDir.PS.z = coords[5]; + zDir.PS.x = coords[6]; + zDir.PS.y = coords[7]; + zDir.PS.z = coords[8]; +} + +//======================================================================= +//function : SetFixedPoint +//purpose : * Set/unset a fixed point, at which a node will be created provided that grid +// * is defined by spacing in all directions +//======================================================================= + +void StdMeshers_CartesianParameters3D_i::SetFixedPoint(const SMESH::PointStruct& ps, + CORBA::Boolean toUnset) +{ + double p[3] = { ps.x, ps.y, ps.z }; + GetImpl()->SetFixedPoint( p, toUnset ); + + SMESH::TPythonDump() << _this() << ".SetFixedPoint( " << ps << ", " << toUnset << " )"; +} + +//======================================================================= +//function : GetFixedPoint +//purpose : Returns a fixed point +//======================================================================= + +CORBA::Boolean StdMeshers_CartesianParameters3D_i::GetFixedPoint(SMESH::PointStruct& ps) +{ + double p[3]; + if ( GetImpl()->GetFixedPoint( p ) ) + { + ps.x = p[0]; + ps.y = p[1]; + ps.z = p[2]; + return true; + } + else + { + ps.x = 0.; + ps.y = 0.; + ps.z = 0.; + } + return false; +} + +//======================================================================= +//function : SetToAddEdges +//purpose : Enables implementation of geometrical edges into the mesh. +//======================================================================= + +void StdMeshers_CartesianParameters3D_i::SetToAddEdges(CORBA::Boolean toAdd) +{ + GetImpl()->SetToAddEdges( toAdd ); + SMESH::TPythonDump() << _this() << ".SetToAddEdges( " << toAdd << " )"; +} + +//======================================================================= +//function : GetToAddEdges +//purpose : Returns true if implementation of geometrical edges into the +// mesh is enabled +//======================================================================= + +CORBA::Boolean StdMeshers_CartesianParameters3D_i::GetToAddEdges() +{ + return GetImpl()->GetToAddEdges(); +} + //======================================================================= //function : IsGridBySpacing -//purpose : Return true if the grid is defined by spacing functions and +//purpose : Return true if the grid is defined by spacing functions and // not by node coordinates //======================================================================= @@ -235,6 +348,37 @@ CORBA::Boolean StdMeshers_CartesianParameters3D_i::IsGridBySpacing(CORBA::Short return this->GetImpl()->IsGridBySpacing(axis); } +//======================================================================= +//function : ComputeOptimalAxesDirs +//purpose : Returns axes at which number of hexahedra is maximal +//======================================================================= + +void StdMeshers_CartesianParameters3D_i:: +ComputeOptimalAxesDirs(GEOM::GEOM_Object_ptr go, + CORBA::Boolean isOrthogonal, + SMESH::DirStruct& xDir, + SMESH::DirStruct& yDir, + SMESH::DirStruct& zDir) + throw (SALOME::SALOME_Exception) +{ + TopoDS_Shape shape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( go ); + if ( shape.IsNull() ) + THROW_SALOME_CORBA_EXCEPTION( "Null shape", SALOME::BAD_PARAM ); + + double c[9]; + ::StdMeshers_CartesianParameters3D::ComputeOptimalAxesDirs( shape, isOrthogonal, c ); + + xDir.PS.x = c[0]; + xDir.PS.y = c[1]; + xDir.PS.z = c[2]; + yDir.PS.x = c[3]; + yDir.PS.y = c[4]; + yDir.PS.z = c[5]; + zDir.PS.x = c[6]; + zDir.PS.y = c[7]; + zDir.PS.z = c[8]; +} + //======================================================================= //function : ComputeCoordinates //purpose : Computes node coordinates by spacing functions @@ -246,13 +390,13 @@ StdMeshers_CartesianParameters3D_i::ComputeCoordinates(CORBA::Double const SMESH::string_array& spaceFuns, const SMESH::double_array& points, const char* axisName ) - throw (SALOME::SALOME_Exception) + throw (SALOME::SALOME_Exception) { - vector xFuns; - vector xPoints, coords; + std::vector xFuns; + std::vector xPoints, coords; _array2vec( spaceFuns, xFuns, (const char*) ); _array2vec( points, xPoints, ); - + try { this->GetImpl()->ComputeCoordinates( x0, x1, xFuns, xPoints, coords, axisName ); } @@ -273,7 +417,6 @@ StdMeshers_CartesianParameters3D_i::ComputeCoordinates(CORBA::Double ::StdMeshers_CartesianParameters3D* StdMeshers_CartesianParameters3D_i::GetImpl() { - MESSAGE( "StdMeshers_CartesianParameters3D_i::GetImpl" ); return ( ::StdMeshers_CartesianParameters3D* )myBaseImpl; }