X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshers%2FStdMeshers_Deflection1D.cxx;h=6181e8cbf2c9e742d2cdaaed52490592ecd45b0e;hp=f6e54691c0db75e31df4b9d3ade63c3251cd6982;hb=30ce546b0c5099ad1112929e2db94810e683e54b;hpb=e4737e85f0da6d3f90fd08f6be1c2825195fe16f diff --git a/src/StdMeshers/StdMeshers_Deflection1D.cxx b/src/StdMeshers/StdMeshers_Deflection1D.cxx index f6e54691c..6181e8cbf 100644 --- a/src/StdMeshers/StdMeshers_Deflection1D.cxx +++ b/src/StdMeshers/StdMeshers_Deflection1D.cxx @@ -1,35 +1,47 @@ -// SMESH StdMeshers_Deflection1D : implementaion of SMESH idl descriptions +// 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 // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// 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. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// 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, 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 +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// SMESH StdMeshers_Deflection1D : implementaion of SMESH idl descriptions // File : StdMeshers_Deflection1D.cxx // Module : SMESH -// $Header$ - -using namespace std; - +// #include "StdMeshers_Deflection1D.hxx" #include "utilities.h" +#include "SMESH_Mesh.hxx" +#include "SMESH_Algo.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; //============================================================================= /*! @@ -107,7 +119,7 @@ ostream & StdMeshers_Deflection1D::SaveTo(ostream & save) istream & StdMeshers_Deflection1D::LoadFrom(istream & load) { - bool isOK = (load >> _value); + bool isOK = static_cast(load >> _value); if (!isOK) load.clear(ios::badbit | load.rdstate()); return load; @@ -134,3 +146,91 @@ istream & operator >>(istream & load, StdMeshers_Deflection1D & hyp) { return hyp.LoadFrom( load ); } +//================================================================================ +/*! + * \brief Evaluate curve deflection between two points + * \param theCurve - the curve + * \param theU1 - the parameter of the first point + * \param theU2 - the parameter of the second point + * \retval double - deflection value + */ +//================================================================================ + +static double deflection(const GeomAdaptor_Curve & theCurve, + double theU1, + double theU2) +{ + if ( theCurve.GetType() == GeomAbs_Line ) + return 0; + // line between theU1 and theU2 + gp_Pnt p1 = theCurve.Value( theU1 ), p2 = theCurve.Value( theU2 ); + gp_Lin segment( p1, gp_Vec( p1, p2 )); + + // evaluate square distance of theCurve from the segment + Standard_Real dist2 = 0; + const int nbPnt = 7; + const double step = ( theU2 - theU1 ) / nbPnt; + while (( theU1 += step ) < theU2 ) + dist2 = Max( dist2, segment.SquareDistance( theCurve.Value( theU1 ))); + + return sqrt( dist2 ); +} + +//================================================================================ +/*! + * \brief Initialize deflection value by the mesh built on the geometry + * \param theMesh - the built mesh + * \param theShape - the geometry of interest + * \retval bool - true if parameter values have been successfully defined + */ +//================================================================================ + +bool StdMeshers_Deflection1D::SetParametersByMesh(const SMESH_Mesh* theMesh, + const TopoDS_Shape& theShape) +{ + if ( !theMesh || theShape.IsNull() ) + return false; + + _value = 0.; + + Standard_Real UMin, UMax; + TopLoc_Location L; + + int nbEdges = 0; + TopTools_IndexedMapOfShape edgeMap; + TopExp::MapShapes( theShape, TopAbs_EDGE, edgeMap ); + + for ( int iE = 1; iE <= edgeMap.Extent(); ++iE ) + { + const TopoDS_Edge& edge = TopoDS::Edge( edgeMap( iE )); + Handle(Geom_Curve) C = BRep_Tool::Curve( edge, L, UMin, UMax ); + GeomAdaptor_Curve AdaptCurve(C, UMin, UMax); + if ( AdaptCurve.GetType() != GeomAbs_Line ) + { + vector< double > params; + SMESHDS_Mesh* aMeshDS = const_cast< SMESH_Mesh* >( theMesh )->GetMeshDS(); + if ( SMESH_Algo::GetNodeParamOnEdge( aMeshDS, edge, params )) + { + nbEdges++; + for ( size_t i = 1; i < params.size(); ++i ) + _value = Max( _value, deflection( AdaptCurve, params[ i-1 ], params[ i ])); + } + } + else + nbEdges++; + } + return nbEdges; +} + +//================================================================================ +/*! + * \brief Initialize my parameter values by default parameters. + * \retval bool - true if parameter values have been successfully defined + */ +//================================================================================ + +bool StdMeshers_Deflection1D::SetParametersByDefaults(const TDefaults& /*dflts*/, + const SMESH_Mesh* /*theMesh*/) +{ + return false; +}