From 80fe1ddefc561a7a571ac08807f7d173f45d8080 Mon Sep 17 00:00:00 2001 From: imn Date: Wed, 16 Jul 2014 11:45:56 +0400 Subject: [PATCH] =?UTF-8?q?Add=20=E2=80=9CGrading=E2=80=9D=20parameter=20t?= =?UTF-8?q?o=20Adaptive=201D=20hypothesis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../defining_hypotheses_adaptive1d.py | 4 ++- doc/salome/gui/SMESH/images/adaptive1d.png | Bin 15931 -> 14043 bytes .../gui/SMESH/input/1d_meshing_hypo.doc | 4 +-- idl/SMESH_BasicHypothesis.idl | 7 ++++ resources/StdMeshers.xml.in | 4 +-- src/SMESH_SWIG/StdMeshersBuilder.py | 9 +++-- src/StdMeshers/StdMeshers_Adaptive1D.cxx | 22 +++++++++++-- src/StdMeshers/StdMeshers_Adaptive1D.hxx | 9 ++++- .../StdMeshersGUI_StdHypothesisCreator.cxx | 12 ++++++- src/StdMeshersGUI/StdMeshers_msg_en.ts | 4 +++ src/StdMeshersGUI/StdMeshers_msg_fr.ts | 4 +++ src/StdMeshersGUI/StdMeshers_msg_ja.ts | 4 +++ src/StdMeshers_I/StdMeshers_Adaptive1D_i.cxx | 31 ++++++++++++++++++ src/StdMeshers_I/StdMeshers_Adaptive1D_i.hxx | 6 ++++ 14 files changed, 107 insertions(+), 13 deletions(-) diff --git a/doc/salome/examples/defining_hypotheses_adaptive1d.py b/doc/salome/examples/defining_hypotheses_adaptive1d.py index 96e2fabfe..0110ebc88 100644 --- a/doc/salome/examples/defining_hypotheses_adaptive1d.py +++ b/doc/salome/examples/defining_hypotheses_adaptive1d.py @@ -19,12 +19,14 @@ shape = geompy.MakeCut( shape, tool, theName="shape" ) # Parameters of Adaptive hypothesis. minSize and maxSize are such that they do not limit # size of segments because size of geometrical features lies within [2.-100.] range, hence # size of segments is defined by deflection parameter and size of geometrical features only. +# grading is defined how much size of adjacent elements can differ. minSize = 0.1 maxSize = 200 deflection = 0.05 +grading = 0.7 mesh = smesh.Mesh( shape ) -mesh.Segment().Adaptive( minSize, maxSize, deflection ) +mesh.Segment().Adaptive( minSize, maxSize, deflection, grading ) mesh.Triangle().MaxElementArea( 300 ) mesh.Compute() diff --git a/doc/salome/gui/SMESH/images/adaptive1d.png b/doc/salome/gui/SMESH/images/adaptive1d.png index 8091c8d0ed7e8da41533a57a36ea75a44e36cd2b..dcabeee0fafdef4545744b1cc09fbe4482ab54ee 100644 GIT binary patch literal 14043 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 literal 15931 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 diff --git a/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc b/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc index 1228865f7..d11a8baa0 100644 --- a/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc +++ b/doc/salome/gui/SMESH/input/1d_meshing_hypo.doc @@ -31,8 +31,8 @@ creation of narrow 2D elements. - Min size parameter limits the minimal segment size. - Max size parameter defines the length of segments on straight edges. -- \b Deflection parameter gives maximal distance of a segment from a curved edge. - +- Deflection parameter gives maximal distance of a segment from a curved edge. +- Grading parameter defines how much size of adjacent elements can differ. \image html adaptive1d_sample_mesh.png "Adaptive hypothesis and Netgen 2D algorithm - the size of mesh segments reflects the size of geometrical features" See Also a \ref tui_1d_adaptive "sample TUI Script" that uses Adaptive hypothesis. diff --git a/idl/SMESH_BasicHypothesis.idl b/idl/SMESH_BasicHypothesis.idl index 72d1b1a2d..a8f9b31b1 100644 --- a/idl/SMESH_BasicHypothesis.idl +++ b/idl/SMESH_BasicHypothesis.idl @@ -433,6 +433,13 @@ module StdMeshers */ void SetDeflection(in double deflection) raises (SALOME::SALOME_Exception); double GetDeflection(); + + /*! + * Sets parameter value, + * i.e. how much size of adjacent elements can differ + */ + void SetGrading(in double grading) raises (SALOME::SALOME_Exception); + double GetGrading(); }; /*! diff --git a/resources/StdMeshers.xml.in b/resources/StdMeshers.xml.in index 239ff2cb4..cf8146f54 100644 --- a/resources/StdMeshers.xml.in +++ b/resources/StdMeshers.xml.in @@ -236,7 +236,7 @@ GeometricProgression=GeometricProgression(SetStartLength(),SetCommonRatio(),SetReversedEdges()) StartEndLength=StartEndLength(SetStartLength(),SetEndLength(),SetReversedEdges()) Deflection1D=Deflection1D(SetDeflection()) - Adaptive1D=Adaptive(SetMinSize(),SetMaxSize(),SetDeflection()) + Adaptive1D=Adaptive(SetMinSize(),SetMaxSize(),SetDeflection(),SetGrading()) AutomaticLength=AutomaticLength(SetFineness()) FixedPoints1D=FixedPoints1D(SetPoints(),SetNbSegments(),SetReversedEdges()) Propagation=Propagation() @@ -262,7 +262,7 @@ GeometricProgression=GeometricProgression(SetStartLength(),SetCommonRatio(),SetReversedEdges()) StartEndLength=StartEndLength(SetStartLength(),SetEndLength(),SetReversedEdges()) Deflection1D=Deflection1D(SetDeflection()) - Adaptive1D=Adaptive(SetMinSize(),SetMaxSize(),SetDeflection()) + Adaptive1D=Adaptive(SetMinSize(),SetMaxSize(),SetDeflection(),SetGrading()) AutomaticLength=AutomaticLength(SetFineness()) FixedPoints1D=FixedPoints1D(SetPoints(),SetNbSegments(),SetReversedEdges()) Propagation=Propagation() diff --git a/src/SMESH_SWIG/StdMeshersBuilder.py b/src/SMESH_SWIG/StdMeshersBuilder.py index 1e9c73533..054bd7e7e 100644 --- a/src/SMESH_SWIG/StdMeshersBuilder.py +++ b/src/SMESH_SWIG/StdMeshersBuilder.py @@ -183,20 +183,23 @@ class StdMeshersBuilder_Segment(Mesh_Algorithm): # @param minSize defines the minimal allowed segment length # @param maxSize defines the maximal allowed segment length # @param deflection defines the maximal allowed distance from a segment to an edge + # @param grading defines how much size of adjacent elements can differ # @param UseExisting if ==true - searches for an existing hypothesis created with # the same parameters, else (default) - creates a new one # @return an instance of StdMeshers_Adaptive1D hypothesis # @ingroup l3_hypos_1dhyps - def Adaptive(self, minSize, maxSize, deflection, UseExisting=False): + def Adaptive(self, minSize, maxSize, deflection, grading, UseExisting=False): from salome.smesh.smeshBuilder import IsEqual compFun = lambda hyp, args: ( IsEqual(hyp.GetMinSize(), args[0]) and \ IsEqual(hyp.GetMaxSize(), args[1]) and \ - IsEqual(hyp.GetDeflection(), args[2])) - hyp = self.Hypothesis("Adaptive1D", [minSize, maxSize, deflection], + IsEqual(hyp.GetDeflection(), args[2]) and \ + IsEqual(hyp.GetGrading(), args[3])) + hyp = self.Hypothesis("Adaptive1D", [minSize, maxSize, deflection, grading], UseExisting=UseExisting, CompareMethod=compFun) hyp.SetMinSize(minSize) hyp.SetMaxSize(maxSize) hyp.SetDeflection(deflection) + hyp.SetGrading(grading) return hyp ## Defines "Arithmetic1D" hypothesis to cut an edge in several segments with a length diff --git a/src/StdMeshers/StdMeshers_Adaptive1D.cxx b/src/StdMeshers/StdMeshers_Adaptive1D.cxx index ecb30b1aa..55d5d00b4 100644 --- a/src/StdMeshers/StdMeshers_Adaptive1D.cxx +++ b/src/StdMeshers/StdMeshers_Adaptive1D.cxx @@ -942,6 +942,7 @@ StdMeshers_Adaptive1D::StdMeshers_Adaptive1D(int hypId, myMinSize = 1e-10; myMaxSize = 1e+10; myDeflection = 1e-2; + myGrading = 1e-2; myAlgo = NULL; _name = "Adaptive1D"; _param_algo_dim = 1; // is used by SMESH_Regular_1D @@ -968,6 +969,20 @@ void StdMeshers_Adaptive1D::SetDeflection(double value) } } //======================================================================= +//function : SetGrading +//purpose : +void StdMeshers_Adaptive1D::SetGrading(double value) + throw(SALOME_Exception) +{ + if (value <= std::numeric_limits::min() ) + throw SALOME_Exception("Grading must be greater that zero"); + if (myGrading != value) + { + myGrading = value; + NotifySubMeshesHypothesisModification(); + } +} +//======================================================================= //function : SetMinSize //purpose : Sets minimal allowed segment length void StdMeshers_Adaptive1D::SetMinSize(double minSize) @@ -1002,7 +1017,7 @@ void StdMeshers_Adaptive1D::SetMaxSize(double maxSize) //purpose : Persistence ostream & StdMeshers_Adaptive1D::SaveTo(ostream & save) { - save << myMinSize << " " << myMaxSize << " " << myDeflection; + save << myMinSize << " " << myMaxSize << " " << myDeflection << " " << myGrading; save << " " << -1 << " " << -1; // preview addition of parameters return save; } @@ -1012,7 +1027,7 @@ ostream & StdMeshers_Adaptive1D::SaveTo(ostream & save) istream & StdMeshers_Adaptive1D::LoadFrom(istream & load) { int dummyParam; - bool isOK = (load >> myMinSize >> myMaxSize >> myDeflection >> dummyParam >> dummyParam); + bool isOK = (load >> myMinSize >> myMaxSize >> myDeflection >> myGrading >> dummyParam >> dummyParam); if (!isOK) load.clear(ios::badbit | load.rdstate()); return load; @@ -1082,6 +1097,7 @@ bool StdMeshers_Adaptive1D::SetParametersByDefaults(const TDefaults& dflts, myMinSize = dflts._elemLength / 10; myMaxSize = dflts._elemLength * 2; myDeflection = myMinSize / 7; + myGrading = 0.7; return true; } @@ -1145,7 +1161,7 @@ bool AdaptiveAlgo::Compute(SMESH_Mesh & theMesh, myMesh = &theMesh; SMESH_MesherHelper helper( theMesh ); - const double grading = 0.7; + const double grading = myHyp->GetGrading(); TopTools_IndexedMapOfShape edgeMap, faceMap; TopExp::MapShapes( theShape, TopAbs_EDGE, edgeMap ); diff --git a/src/StdMeshers/StdMeshers_Adaptive1D.hxx b/src/StdMeshers/StdMeshers_Adaptive1D.hxx index a62118087..200465026 100644 --- a/src/StdMeshers/StdMeshers_Adaptive1D.hxx +++ b/src/StdMeshers/StdMeshers_Adaptive1D.hxx @@ -59,6 +59,13 @@ class STDMESHERS_EXPORT StdMeshers_Adaptive1D : public SMESH_Hypothesis void SetDeflection(double value) throw(SALOME_Exception); double GetDeflection() const { return myDeflection; } + /*! + * Sets parameter value, + * i.e. how much size of adjacent elements can differ + */ + void SetGrading(double value) throw(SALOME_Exception); + double GetGrading() const { return myGrading; } + virtual std::ostream & SaveTo(std::ostream & save); virtual std::istream & LoadFrom(std::istream & load); @@ -83,7 +90,7 @@ class STDMESHERS_EXPORT StdMeshers_Adaptive1D : public SMESH_Hypothesis protected: - double myMinSize, myMaxSize, myDeflection; + double myMinSize, myMaxSize, myDeflection, myGrading; SMESH_Algo* myAlgo; // StdMeshers_AdaptiveAlgo_1D implemented in cxx file }; diff --git a/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx b/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx index 891b2c0c8..904f0bbd7 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx @@ -609,6 +609,8 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const h->SetMaxSize( params[1].myValue.toDouble() ); h->SetVarParameter( params[0].text(), "SetDeflection" ); h->SetDeflection( params[2].myValue.toDouble() ); + h->SetVarParameter( params[0].text(), "SetGrading" ); + h->SetGrading( params[3].myValue.toDouble() ); } else if( hypType()=="AutomaticLength" ) { @@ -1048,6 +1050,11 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const if(!initVariableName( hyp, item, "SetDeflection" )) item.myValue = h->GetDeflection(); p.append( item ); + + item.myName = tr( "SMESH_GRADING1D_PARAM" ); + if(!initVariableName( hyp, item, "SetGrading" )) + item.myValue = h->GetGrading(); + p.append( item ); } else if( hypType()=="AutomaticLength" ) { @@ -1421,7 +1428,10 @@ void StdMeshersGUI_StdHypothesisCreator::attuneStdWidget (QWidget* w, const int) } else if( hypType()=="Adaptive1D" ) { - sb->RangeStepAndValidator( VALUE_SMALL, VALUE_MAX, 1.0, "length_precision" ); + if (sb->objectName() == tr("SMESH_GRADING1D_PARAM")) + sb->RangeStepAndValidator( 0.0, 2.0, 0.1, "length_precision" ); + else + sb->RangeStepAndValidator( VALUE_SMALL, VALUE_MAX, 1.0, "length_precision" ); } else if( hypType().startsWith( "ViscousLayers" )) { diff --git a/src/StdMeshersGUI/StdMeshers_msg_en.ts b/src/StdMeshersGUI/StdMeshers_msg_en.ts index 08dcd5671..abf15afdb 100644 --- a/src/StdMeshersGUI/StdMeshers_msg_en.ts +++ b/src/StdMeshersGUI/StdMeshers_msg_en.ts @@ -150,6 +150,10 @@ SMESH_INVALID_FUNCTION Function is invalid + + SMESH_GRADING1D_PARAM + Grading + SMESH_LAYERS_DISTRIBUTION 1D Hypothesis diff --git a/src/StdMeshersGUI/StdMeshers_msg_fr.ts b/src/StdMeshersGUI/StdMeshers_msg_fr.ts index ef19f469f..2a434ca5b 100755 --- a/src/StdMeshersGUI/StdMeshers_msg_fr.ts +++ b/src/StdMeshersGUI/StdMeshers_msg_fr.ts @@ -135,6 +135,10 @@ SMESH_INVALID_FUNCTION La fonction n'est pas valide + + SMESH_GRADING1D_PARAM + Grading + SMESH_LAYERS_DISTRIBUTION Hypothèse 1D diff --git a/src/StdMeshersGUI/StdMeshers_msg_ja.ts b/src/StdMeshersGUI/StdMeshers_msg_ja.ts index 8a90c5e1f..5e5d155cb 100644 --- a/src/StdMeshersGUI/StdMeshers_msg_ja.ts +++ b/src/StdMeshersGUI/StdMeshers_msg_ja.ts @@ -150,6 +150,10 @@ SMESH_INVALID_FUNCTION 関数が無効です。 + + SMESH_GRADING1D_PARAM + Grading + SMESH_LAYERS_DISTRIBUTION 仮説 1 d diff --git a/src/StdMeshers_I/StdMeshers_Adaptive1D_i.cxx b/src/StdMeshers_I/StdMeshers_Adaptive1D_i.cxx index c6d82b9c1..bcf6cc5ac 100644 --- a/src/StdMeshers_I/StdMeshers_Adaptive1D_i.cxx +++ b/src/StdMeshers_I/StdMeshers_Adaptive1D_i.cxx @@ -152,6 +152,37 @@ CORBA::Double StdMeshers_Adaptive1D_i::GetDeflection() return this->GetImpl()->GetDeflection(); } +//======================================================================= +//function : SetGrading +//purpose : Sets how much size of adjacent elements can differ. +//======================================================================= + +void StdMeshers_Adaptive1D_i::SetGrading( CORBA::Double theValue ) + throw ( SALOME::SALOME_Exception ) +{ + ASSERT( myBaseImpl ); + try { + this->GetImpl()->SetGrading( theValue ); + } + catch ( SALOME_Exception& S_ex ) { + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), SALOME::BAD_PARAM ); + } + + // Update Python script + SMESH::TPythonDump() << _this() << ".SetGrading( " << SMESH::TVar(theValue) << " )"; +} + +//======================================================================= +//function : GetGrading +//purpose : Returns grading +//======================================================================= + +CORBA::Double StdMeshers_Adaptive1D_i::GetGrading() +{ + ASSERT( myBaseImpl ); + return this->GetImpl()->GetGrading(); +} + //======================================================================= //function : GetImpl //purpose : Get implementation diff --git a/src/StdMeshers_I/StdMeshers_Adaptive1D_i.hxx b/src/StdMeshers_I/StdMeshers_Adaptive1D_i.hxx index 7dd59e708..fada85ba6 100644 --- a/src/StdMeshers_I/StdMeshers_Adaptive1D_i.hxx +++ b/src/StdMeshers_I/StdMeshers_Adaptive1D_i.hxx @@ -70,6 +70,12 @@ class STDMESHERS_I_EXPORT StdMeshers_Adaptive1D_i: void SetDeflection( CORBA::Double theLength ) throw (SALOME::SALOME_Exception); CORBA::Double GetDeflection(); + /*! + * Sets parameter value, + // * i.e. a maximal allowed distance between a segment and an edge. + */ + void SetGrading( CORBA::Double theLength ) throw (SALOME::SALOME_Exception); + CORBA::Double GetGrading(); /*! * Returns implementation