Back to index

salome-smesh  6.5.0
StdMeshers_MaxElementArea.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 //  SMESH SMESH : implementaion of SMESH idl descriptions
00024 //  File   : StdMeshers_MaxElementArea.cxx
00025 //           Moved here from SMESH_MaxElementArea.cxx
00026 //  Author : Paul RASCLE, EDF
00027 //  Module : SMESH
00028 //
00029 #include "StdMeshers_MaxElementArea.hxx"
00030 
00031 #include "SMESH_ControlsDef.hxx"
00032 #include "SMDS_MeshElement.hxx"
00033 #include "SMESHDS_SubMesh.hxx"
00034 #include "SMESH_Mesh.hxx"
00035 
00036 #include <TopExp.hxx>
00037 #include <TopTools_IndexedMapOfShape.hxx>
00038 
00039 #include "utilities.h"
00040 
00041 using namespace std;
00042 
00043 //=============================================================================
00047 //=============================================================================
00048 
00049 StdMeshers_MaxElementArea::StdMeshers_MaxElementArea(int hypId, int studyId, SMESH_Gen* gen)
00050   : SMESH_Hypothesis(hypId, studyId, gen)
00051 {
00052   _maxArea =1.;
00053   _name = "MaxElementArea";
00054   _param_algo_dim = 2; 
00055 }
00056 
00057 //=============================================================================
00061 //=============================================================================
00062 
00063 StdMeshers_MaxElementArea::~StdMeshers_MaxElementArea()
00064 {
00065 }
00066 
00067 //=============================================================================
00071 //=============================================================================
00072 
00073 void StdMeshers_MaxElementArea::SetMaxArea(double maxArea)
00074   throw (SALOME_Exception)
00075 {
00076   double oldArea = _maxArea;
00077   if (maxArea <= 0) 
00078     throw SALOME_Exception(LOCALIZED("maxArea must be positive"));
00079   _maxArea = maxArea;
00080   if (_maxArea != oldArea)
00081     NotifySubMeshesHypothesisModification();
00082 }
00083 
00084 //=============================================================================
00088 //=============================================================================
00089 
00090 double StdMeshers_MaxElementArea::GetMaxArea() const
00091 {
00092   return _maxArea;
00093 }
00094 
00095 //=============================================================================
00099 //=============================================================================
00100 
00101 ostream & StdMeshers_MaxElementArea::SaveTo(ostream & save)
00102 {
00103   save << this->_maxArea;
00104   return save;
00105 }
00106 
00107 //=============================================================================
00111 //=============================================================================
00112 
00113 istream & StdMeshers_MaxElementArea::LoadFrom(istream & load)
00114 {
00115   bool isOK = true;
00116   double a;
00117   isOK = (load >> a);
00118   if (isOK) 
00119     this->_maxArea = a;
00120   else 
00121     load.clear(ios::badbit | load.rdstate());
00122   return load;
00123 }
00124 
00125 //=============================================================================
00129 //=============================================================================
00130 
00131 ostream & operator << (ostream & save, StdMeshers_MaxElementArea & hyp)
00132 {
00133   return hyp.SaveTo( save );
00134 }
00135 
00136 //=============================================================================
00140 //=============================================================================
00141 
00142 istream & operator >> (istream & load, StdMeshers_MaxElementArea & hyp)
00143 {
00144   return hyp.LoadFrom( load );
00145 }
00146 
00147 //================================================================================
00154 //================================================================================
00155 
00156 bool StdMeshers_MaxElementArea::SetParametersByMesh(const SMESH_Mesh*   theMesh,
00157                                                     const TopoDS_Shape& theShape)
00158 {
00159   if ( !theMesh || theShape.IsNull() )
00160     return false;
00161 
00162   _maxArea = 0;
00163 
00164   SMESH::Controls::Area areaControl;
00165   SMESH::Controls::TSequenceOfXYZ nodesCoords;
00166 
00167   SMESHDS_Mesh* aMeshDS = const_cast< SMESH_Mesh* >( theMesh )->GetMeshDS();
00168 
00169   TopTools_IndexedMapOfShape faceMap;
00170   TopExp::MapShapes( theShape, TopAbs_FACE, faceMap );
00171   for ( int iF = 1; iF <= faceMap.Extent(); ++iF )
00172   {
00173     SMESHDS_SubMesh * subMesh = aMeshDS->MeshElements( faceMap( iF ));
00174     if ( !subMesh )
00175       return false;
00176     SMDS_ElemIteratorPtr fIt = subMesh->GetElements();
00177     while ( fIt->more() )
00178     {
00179       const SMDS_MeshElement* elem = fIt->next();
00180       if ( elem->GetType() == SMDSAbs_Face ) {
00181         areaControl.GetPoints( elem, nodesCoords );
00182         _maxArea = max( _maxArea, areaControl.GetValue( nodesCoords ));
00183       }
00184     }
00185   }
00186   return _maxArea > 0;
00187 }
00188 //================================================================================
00193 //================================================================================
00194 
00195 bool StdMeshers_MaxElementArea::SetParametersByDefaults(const TDefaults&  dflts,
00196                                                         const SMESH_Mesh* /*theMesh*/)
00197 {
00198   return ( _maxArea = dflts._elemLength*dflts._elemLength );
00199 }
00200