From e1a0d0a23f4ae76cef3888df02e448877ebb8d19 Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 7 Oct 2016 17:49:45 +0300 Subject: [PATCH] Add possibility to define Local Size via a file --- .../images/netgen3d_local_size.png | Bin 14408 -> 14135 bytes .../NETGENPLUGIN/input/netgen_2d_3d_hypo.doc | 19 +++ idl/NETGENPlugin_Algorithm.idl | 3 + src/GUI/NETGENPluginGUI_HypothesisCreator.cxx | 141 ++++++++++-------- src/GUI/NETGENPluginGUI_HypothesisCreator.h | 8 +- src/GUI/NETGENPlugin_msg_en.ts | 4 + src/NETGENPlugin/NETGENPluginBuilder.py | 6 + src/NETGENPlugin/NETGENPlugin_Hypothesis.cxx | 43 +++++- src/NETGENPlugin/NETGENPlugin_Hypothesis.hxx | 4 + .../NETGENPlugin_Hypothesis_2D_i.cxx | 2 - .../NETGENPlugin_Hypothesis_i.cxx | 18 +++ .../NETGENPlugin_Hypothesis_i.hxx | 3 + src/NETGENPlugin/NETGENPlugin_Mesher.cxx | 29 ++-- src/NETGENPlugin/NETGENPlugin_Mesher.hxx | 3 +- .../NETGENPlugin_NETGEN_2D_ONLY.cxx | 13 +- src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx | 10 +- 16 files changed, 216 insertions(+), 90 deletions(-) diff --git a/doc/salome/gui/NETGENPLUGIN/images/netgen3d_local_size.png b/doc/salome/gui/NETGENPLUGIN/images/netgen3d_local_size.png index 1bac778f08f44cd07152b28c491d7eb31ef020eb..efc53ff34d76418427de4041c5c56c5de38d7e76 100644 GIT binary patch literal 14135 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 literal 14408 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 diff --git a/doc/salome/gui/NETGENPLUGIN/input/netgen_2d_3d_hypo.doc b/doc/salome/gui/NETGENPLUGIN/input/netgen_2d_3d_hypo.doc index ff7555a..4ef8e06 100644 --- a/doc/salome/gui/NETGENPLUGIN/input/netgen_2d_3d_hypo.doc +++ b/doc/salome/gui/NETGENPLUGIN/input/netgen_2d_3d_hypo.doc @@ -67,6 +67,25 @@ to the type of the geometrical objects: On Vertex, On default Value will be added in the table where the Value can be changed. - Remove - deletes a selected row from the table. +- Mesh-size File - opens a dialog to select a file defining +size of elements. The file includes two obligatory sections. The first +section defines the size at points. The second section defines the +size along lines. Let's consider the following sample size file. +\code +2 +92.5 92.5 92.5 0.05 +42.5 42.5 42.5 0.04 +1 +25 25 0 25 25 200 0.3 +\endcode +"2" at the first line means that there are two points in the first +section.
+"92.5 92.5 92.5 0.05" at the second line means that at the point with +coordinates (92.5, 92.5, 92.5) size of elements should be 0.05.
+"1" at the fourth line means that there is one line in the second +section.
+"25 25 0 25 25 200 0.3" means that along the line between points (25, +25, 0) and (25, 25, 200) size of elements should be 0.3. \image html netgen2d3d_simple.png diff --git a/idl/NETGENPlugin_Algorithm.idl b/idl/NETGENPlugin_Algorithm.idl index e18a128..5a0b252 100644 --- a/idl/NETGENPlugin_Algorithm.idl +++ b/idl/NETGENPlugin_Algorithm.idl @@ -110,6 +110,9 @@ module NETGENPlugin double GetLocalSizeOnEntry(in string entry); string_array GetLocalSizeEntries(); void UnsetLocalSizeOnEntry(in string entry); + + void SetMeshSizeFile(in string fileName); + string GetMeshSizeFile(); }; /*! diff --git a/src/GUI/NETGENPluginGUI_HypothesisCreator.cxx b/src/GUI/NETGENPluginGUI_HypothesisCreator.cxx index e5bb0aa..2db7d1e 100644 --- a/src/GUI/NETGENPluginGUI_HypothesisCreator.cxx +++ b/src/GUI/NETGENPluginGUI_HypothesisCreator.cxx @@ -34,8 +34,9 @@ #include CORBA_SERVER_HEADER(NETGENPlugin_Algorithm) -#include +#include #include +#include #include #include @@ -82,7 +83,8 @@ enum { LSZ_FACE_BTN, LSZ_SOLID_BTN, LSZ_SEPARATOR2, - LSZ_REMOVE_BTN + LSZ_REMOVE_BTN, + LSZ_FILE_LE = 9 }; NETGENPluginGUI_HypothesisCreator::NETGENPluginGUI_HypothesisCreator( const QString& theHypType ) @@ -242,7 +244,7 @@ QFrame* NETGENPluginGUI_HypothesisCreator::buildFrame() QGridLayout* localSizeLayout = new QGridLayout(localSizeGroup); myLocalSizeTable = new QTableWidget(0, LSZ_NB_COLUMNS, localSizeGroup); - localSizeLayout->addWidget(myLocalSizeTable, 1, 0, 8, 1); + localSizeLayout->addWidget(myLocalSizeTable, 1, 0, 8, 2); QStringList localSizeHeaders; localSizeHeaders << tr( "LSZ_ENTRY_COLUMN" )<< tr( "LSZ_NAME_COLUMN" ) << tr( "LSZ_LOCALSIZE_COLUMN" ); myLocalSizeTable->setHorizontalHeaderLabels(localSizeHeaders); @@ -258,21 +260,27 @@ QFrame* NETGENPluginGUI_HypothesisCreator::buildFrame() myLocalSizeTable->verticalHeader()->hide(); QPushButton* addVertexButton = new QPushButton(tr("NETGEN_LSZ_VERTEX"), localSizeGroup); - localSizeLayout->addWidget(addVertexButton, LSZ_VERTEX_BTN, 1, 1, 1); + localSizeLayout->addWidget(addVertexButton, LSZ_VERTEX_BTN, 2, 1, 1); QPushButton* addEdgeButton = new QPushButton(tr("NETGEN_LSZ_EDGE"), localSizeGroup); - localSizeLayout->addWidget(addEdgeButton, LSZ_EDGE_BTN, 1, 1, 1); + localSizeLayout->addWidget(addEdgeButton, LSZ_EDGE_BTN, 2, 1, 1); QPushButton* addFaceButton = new QPushButton(tr("NETGEN_LSZ_FACE"), localSizeGroup); - localSizeLayout->addWidget(addFaceButton, LSZ_FACE_BTN, 1, 1, 1); + localSizeLayout->addWidget(addFaceButton, LSZ_FACE_BTN, 2, 1, 1); QPushButton* addSolidButton = new QPushButton(tr("NETGEN_LSZ_SOLID"), localSizeGroup); - localSizeLayout->addWidget(addSolidButton, LSZ_SOLID_BTN, 1, 1, 1); + localSizeLayout->addWidget(addSolidButton, LSZ_SOLID_BTN, 2, 1, 1); QFrame *line2 = new QFrame(localSizeGroup); line2->setFrameShape(QFrame::HLine); line2->setFrameShadow(QFrame::Sunken); - localSizeLayout->addWidget(line2, LSZ_SEPARATOR2, 1, 1, 1); + localSizeLayout->addWidget(line2, LSZ_SEPARATOR2, 2, 1, 1); QPushButton* removeButton = new QPushButton(tr("NETGEN_LSZ_REMOVE"), localSizeGroup); - localSizeLayout->addWidget(removeButton, LSZ_REMOVE_BTN, 1, 1, 1); + localSizeLayout->addWidget(removeButton, LSZ_REMOVE_BTN, 2, 1, 1); + + QPushButton* fileBtn = new QPushButton(tr("NETGEN_LSZ_FILE"), localSizeGroup); + myMeshSizeFile = new QLineEdit(localSizeGroup); + myMeshSizeFile->setReadOnly( true ); + localSizeLayout->addWidget( fileBtn, LSZ_FILE_LE, 0, 1, 1); + localSizeLayout->addWidget( myMeshSizeFile, LSZ_FILE_LE, 1, 1, 2); connect( addVertexButton, SIGNAL(clicked()), this, SLOT(onAddLocalSizeOnVertex())); connect( addEdgeButton, SIGNAL(clicked()), this, SLOT(onAddLocalSizeOnEdge())); @@ -280,6 +288,7 @@ QFrame* NETGENPluginGUI_HypothesisCreator::buildFrame() connect( addSolidButton, SIGNAL(clicked()), this, SLOT(onAddLocalSizeOnSolid())); connect( removeButton, SIGNAL(clicked()), this, SLOT(onRemoveLocalSizeOnShape())); connect( myLocalSizeTable, SIGNAL(cellChanged(int, int)), this, SLOT(onSetLocalSize(int, int))); + connect( fileBtn, SIGNAL(clicked()), this, SLOT(onSetSizeFile())); tab->insertTab(LSZ_TAB, localSizeGroup, tr("NETGEN_LOCAL_SIZE")); } @@ -327,7 +336,7 @@ void NETGENPluginGUI_HypothesisCreator::retrieveParams() const myNbSegPerRadius->setValue( data.myNbSegPerRadius ); else myNbSegPerRadius->setText( data.myNbSegPerRadiusVar ); - } + } if (myAllowQuadrangles) myAllowQuadrangles->setChecked( data.myAllowQuadrangles ); @@ -361,6 +370,8 @@ void NETGENPluginGUI_HypothesisCreator::retrieveParams() const } myLocalSizeTable->resizeColumnToContents(LSZ_NAME_COLUMN); myLocalSizeTable->resizeColumnToContents(LSZ_LOCALSIZE_COLUMN); + + myMeshSizeFile->setText( data.myMeshSizeFile ); } } @@ -369,7 +380,7 @@ QString NETGENPluginGUI_HypothesisCreator::storeParams() const NetgenHypothesisData data; readParamsFromWidgets( data ); storeParamsToHypo( data ); - + QString valStr = tr("NETGEN_MAX_SIZE") + " = " + QString::number( data.myMaxSize ) + "; "; valStr += tr("NETGEN_MIN_SIZE") + " = " + QString::number( data.myMinSize ) + "; "; if ( data.mySecondOrder ) @@ -377,12 +388,12 @@ QString NETGENPluginGUI_HypothesisCreator::storeParams() const if ( data.myOptimize ) valStr += tr("NETGEN_OPTIMIZE") + "; "; valStr += myFineness->currentText() + "(" + QString::number( data.myGrowthRate ) + ", " + - QString::number( data.myNbSegPerEdge ) + ", " + - QString::number( data.myNbSegPerRadius ) + ")"; + QString::number( data.myNbSegPerEdge ) + ", " + + QString::number( data.myNbSegPerRadius ) + ")"; if ( myIs2D && data.myAllowQuadrangles ) valStr += "; " + tr("NETGEN_ALLOW_QUADRANGLES"); - + if ( data.mySurfaceCurvature ) valStr += "; " + tr("NETGEN_SURFACE_CURVATURE"); @@ -416,34 +427,35 @@ bool NETGENPluginGUI_HypothesisCreator::readParamsFromHypo( NetgenHypothesisData h_data.myMinSizeVar = getVariableName("SetMinSize"); h_data.mySurfaceCurvature = h->GetUseSurfaceCurvature(); h_data.myFuseEdges = h->GetFuseEdges(); + h_data.myMeshSizeFile = h->GetMeshSizeFile(); //if ( myIs2D ) - { - NETGENPlugin::NETGENPlugin_Hypothesis_var h = - NETGENPlugin::NETGENPlugin_Hypothesis::_narrow( initParamsHypothesis() ); + { + NETGENPlugin::NETGENPlugin_Hypothesis_var h = + NETGENPlugin::NETGENPlugin_Hypothesis::_narrow( initParamsHypothesis() ); + + if ( !h->_is_nil() ) + h_data.myAllowQuadrangles = h->GetQuadAllowed(); + } - if ( !h->_is_nil() ) - h_data.myAllowQuadrangles = h->GetQuadAllowed(); - } - NETGENPluginGUI_HypothesisCreator* that = (NETGENPluginGUI_HypothesisCreator*)this; NETGENPlugin::string_array_var myEntries = h->GetLocalSizeEntries(); for ( size_t i = 0; i < myEntries->length(); i++ ) + { + QString entry = myEntries[i].in(); + double val = h->GetLocalSizeOnEntry(entry.toStdString().c_str()); + std::ostringstream tmp; + tmp << val; + QString valstring = QString::fromStdString(tmp.str()); + if (myLocalSizeMap.contains(entry)) { - QString entry = myEntries[i].in(); - double val = h->GetLocalSizeOnEntry(entry.toStdString().c_str()); - std::ostringstream tmp; - tmp << val; - QString valstring = QString::fromStdString(tmp.str()); - if (myLocalSizeMap.contains(entry)) - { - if (myLocalSizeMap[entry] == "__TO_DELETE__") - { - continue; - } - } - that->myLocalSizeMap[entry] = valstring; + if (myLocalSizeMap[entry] == "__TO_DELETE__") + { + continue; + } } + that->myLocalSizeMap[entry] = valstring; + } return true; } @@ -466,28 +478,29 @@ bool NETGENPluginGUI_HypothesisCreator::storeParamsToHypo( const NetgenHypothesi h->SetFineness ( fineness ); if( fineness==UserDefined ) - { - h->SetVarParameter ( h_data.myGrowthRateVar.toLatin1().constData(), "SetGrowthRate"); - h->SetGrowthRate ( h_data.myGrowthRate ); - h->SetVarParameter ( h_data.myNbSegPerEdgeVar.toLatin1().constData(), "SetNbSegPerEdge"); - h->SetNbSegPerEdge ( h_data.myNbSegPerEdge ); - h->SetVarParameter ( h_data.myNbSegPerRadiusVar.toLatin1().constData(), "SetNbSegPerRadius"); - h->SetNbSegPerRadius( h_data.myNbSegPerRadius ); - } + { + h->SetVarParameter ( h_data.myGrowthRateVar.toLatin1().constData(), "SetGrowthRate"); + h->SetGrowthRate ( h_data.myGrowthRate ); + h->SetVarParameter ( h_data.myNbSegPerEdgeVar.toLatin1().constData(), "SetNbSegPerEdge"); + h->SetNbSegPerEdge ( h_data.myNbSegPerEdge ); + h->SetVarParameter ( h_data.myNbSegPerRadiusVar.toLatin1().constData(), "SetNbSegPerRadius"); + h->SetNbSegPerRadius( h_data.myNbSegPerRadius ); + } h->SetVarParameter ( h_data.myMinSizeVar.toLatin1().constData(), "SetMinSize"); h->SetMinSize ( h_data.myMinSize ); h->SetUseSurfaceCurvature( h_data.mySurfaceCurvature ); h->SetFuseEdges ( h_data.myFuseEdges ); - + h->SetMeshSizeFile ( h_data.myMeshSizeFile.toUtf8().constData() ); + //if ( myIs2D ) - { - // NETGENPlugin::NETGENPlugin_Hypothesis_2D_var h_2d = - // NETGENPlugin::NETGENPlugin_Hypothesis_2D::_narrow( h ); - - // if ( !h_2d->_is_nil() ) - // h_2d->SetQuadAllowed( h_data.myAllowQuadrangles ); - h->SetQuadAllowed( h_data.myAllowQuadrangles ); - } + { + // NETGENPlugin::NETGENPlugin_Hypothesis_2D_var h_2d = + // NETGENPlugin::NETGENPlugin_Hypothesis_2D::_narrow( h ); + + // if ( !h_2d->_is_nil() ) + // h_2d->SetQuadAllowed( h_data.myAllowQuadrangles ); + h->SetQuadAllowed( h_data.myAllowQuadrangles ); + } QMapIterator i(myLocalSizeMap); while (i.hasNext()) { @@ -495,16 +508,16 @@ bool NETGENPluginGUI_HypothesisCreator::storeParamsToHypo( const NetgenHypothesi const QString entry = i.key(); const QString localSize = i.value(); if (localSize == "__TO_DELETE__") - { - h->UnsetLocalSizeOnEntry(entry.toLatin1().constData()); - } + { + h->UnsetLocalSizeOnEntry(entry.toLatin1().constData()); + } else - { - std::istringstream tmp(localSize.toLatin1().constData()); - double val; - tmp >> val; - h->SetLocalSizeOnEntry(entry.toLatin1().constData(), val); - } + { + std::istringstream tmp(localSize.toLatin1().constData()); + double val; + tmp >> val; + h->SetLocalSizeOnEntry(entry.toLatin1().constData(), val); + } } } catch(const SALOME::SALOME_Exception& ex) @@ -559,6 +572,7 @@ bool NETGENPluginGUI_HypothesisCreator::readParamsFromWidgets( NetgenHypothesisD QString localSize = myLocalSizeTable->item(row, LSZ_LOCALSIZE_COLUMN)->text().trimmed(); that->myLocalSizeMap[entry] = localSize; } + h_data.myMeshSizeFile = myMeshSizeFile->text(); } return true; } @@ -744,6 +758,13 @@ void NETGENPluginGUI_HypothesisCreator::onSetLocalSize(int row,int col) } } +void NETGENPluginGUI_HypothesisCreator::onSetSizeFile() +{ + QString dir = SUIT_FileDlg::getFileName( dlg(), QString(), + QStringList() << tr( "ALL_FILES_FILTER" ) + " (*)"); + myMeshSizeFile->setText( dir ); +} + GeomSelectionTools* NETGENPluginGUI_HypothesisCreator::getGeomSelectionTools() { _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); diff --git a/src/GUI/NETGENPluginGUI_HypothesisCreator.h b/src/GUI/NETGENPluginGUI_HypothesisCreator.h index 24ca59c..64a1616 100644 --- a/src/GUI/NETGENPluginGUI_HypothesisCreator.h +++ b/src/GUI/NETGENPluginGUI_HypothesisCreator.h @@ -47,7 +47,7 @@ typedef struct double myMaxSize, myMinSize, myGrowthRate, myNbSegPerEdge, myNbSegPerRadius; int myFineness; bool mySecondOrder, myAllowQuadrangles, myOptimize, mySurfaceCurvature, myFuseEdges; - QString myName; + QString myName, myMeshSizeFile; QString myMaxSizeVar, myMinSizeVar, myGrowthRateVar, myNbSegPerEdgeVar, myNbSegPerRadiusVar; } NetgenHypothesisData; @@ -83,6 +83,7 @@ protected slots: virtual void onAddLocalSizeOnSolid(); virtual void onRemoveLocalSizeOnShape(); virtual void onSetLocalSize(int,int); + virtual void onSetSizeFile(); private: bool readParamsFromHypo( NetgenHypothesisData& ) const; @@ -108,8 +109,9 @@ private: bool myIs2D; bool myIsONLY; - QTableWidget* myLocalSizeTable; - GeomSelectionTools* myGeomSelectionTools; + QLineEdit* myMeshSizeFile; + QTableWidget* myLocalSizeTable; + GeomSelectionTools* myGeomSelectionTools; QMap myLocalSizeMap; }; diff --git a/src/GUI/NETGENPlugin_msg_en.ts b/src/GUI/NETGENPlugin_msg_en.ts index c90b504..139fb85 100644 --- a/src/GUI/NETGENPlugin_msg_en.ts +++ b/src/GUI/NETGENPlugin_msg_en.ts @@ -159,5 +159,9 @@ LSZ_LOCALSIZE_COLUMN Value + + NETGEN_LSZ_FILE + Mesh-size File + diff --git a/src/NETGENPlugin/NETGENPluginBuilder.py b/src/NETGENPlugin/NETGENPluginBuilder.py index 39c5a70..d5f9460 100644 --- a/src/NETGENPlugin/NETGENPluginBuilder.py +++ b/src/NETGENPlugin/NETGENPluginBuilder.py @@ -169,6 +169,12 @@ class NETGEN_Algorithm(Mesh_Algorithm): return self.params + ## Defines a file specifying size of elements at points and lines + # @param file name of the file + def SetMeshSizeFile(self, file): + self.Parameters().SetMeshSizeFile(file) + pass + pass # end of NETGEN_Algorithm class diff --git a/src/NETGENPlugin/NETGENPlugin_Hypothesis.cxx b/src/NETGENPlugin/NETGENPlugin_Hypothesis.cxx index 42ea851..fe4c2ee 100644 --- a/src/NETGENPlugin/NETGENPlugin_Hypothesis.cxx +++ b/src/NETGENPlugin/NETGENPlugin_Hypothesis.cxx @@ -247,6 +247,20 @@ void NETGENPlugin_Hypothesis::UnsetLocalSizeOnEntry(const std::string& entry) NotifySubMeshesHypothesisModification(); } +//============================================================================= +/*! + * + */ +//============================================================================= +void NETGENPlugin_Hypothesis::SetMeshSizeFile(const std::string& fileName) +{ + if ( fileName != _meshSizeFile ) + { + _meshSizeFile = fileName; + NotifySubMeshesHypothesisModification(); + } +} + //============================================================================= /*! * @@ -347,6 +361,8 @@ ostream & NETGENPlugin_Hypothesis::SaveTo(ostream & save) save << " " << _surfaceCurvature; save << " " << _fuseEdges; + save << " " << _meshSizeFile.size() << " " << _meshSizeFile; + return save; } @@ -432,19 +448,34 @@ istream & NETGENPlugin_Hypothesis::LoadFrom(istream & load) if ( !hasLocalSize && !option_or_sm.empty() ) _minSize = atof( option_or_sm.c_str() ); + else + load >> _minSize; - isOK = static_cast( load >> _quadAllowed ); - if ( !isOK ) + isOK = static_cast( load >> is ); + if ( isOK ) + _quadAllowed = (bool) is; + else _quadAllowed = GetDefaultQuadAllowed(); - isOK = static_cast( load >> _surfaceCurvature ); - if ( !isOK ) + isOK = static_cast( load >> is ); + if ( isOK ) + _surfaceCurvature = (bool) is; + else _surfaceCurvature = GetDefaultSurfaceCurvature(); - isOK = static_cast( load >> _fuseEdges ); - if ( !isOK ) + isOK = static_cast( load >> is ); + if ( isOK ) + _fuseEdges = (bool) is; + else _fuseEdges = GetDefaultFuseEdges(); + isOK = static_cast( load >> is >> std::ws ); // size of meshSizeFile + if ( isOK && is > 0 ) + { + _meshSizeFile.resize( is ); + load.get( &_meshSizeFile[0], is+1 ); + } + return load; } diff --git a/src/NETGENPlugin/NETGENPlugin_Hypothesis.hxx b/src/NETGENPlugin/NETGENPlugin_Hypothesis.hxx index 3b818b8..7d6da32 100644 --- a/src/NETGENPlugin/NETGENPlugin_Hypothesis.hxx +++ b/src/NETGENPlugin/NETGENPlugin_Hypothesis.hxx @@ -90,6 +90,9 @@ public: const TLocalSize& GetLocalSizesAndEntries() const { return _localSize; } void UnsetLocalSizeOnEntry(const std::string& entry); + void SetMeshSizeFile(const std::string& fileName); + const std::string& GetMeshSizeFile() const { return _meshSizeFile; } + void SetQuadAllowed(bool theVal); bool GetQuadAllowed() const { return _quadAllowed; } @@ -141,6 +144,7 @@ private: bool _secondOrder; bool _optimize; TLocalSize _localSize; + std::string _meshSizeFile; bool _quadAllowed; bool _surfaceCurvature; bool _fuseEdges; diff --git a/src/NETGENPlugin/NETGENPlugin_Hypothesis_2D_i.cxx b/src/NETGENPlugin/NETGENPlugin_Hypothesis_2D_i.cxx index 3a5f334..e889033 100644 --- a/src/NETGENPlugin/NETGENPlugin_Hypothesis_2D_i.cxx +++ b/src/NETGENPlugin/NETGENPlugin_Hypothesis_2D_i.cxx @@ -51,7 +51,6 @@ NETGENPlugin_Hypothesis_2D_i (PortableServer::POA_ptr thePOA, SMESH_Hypothesis_i( thePOA ), NETGENPlugin_Hypothesis_i( thePOA, theStudyId, theGenImpl ) { - MESSAGE( "NETGENPlugin_Hypothesis_2D_i::NETGENPlugin_Hypothesis_2D_i" ); if (myBaseImpl) delete (::NETGENPlugin_Hypothesis*)myBaseImpl; myBaseImpl = new ::NETGENPlugin_Hypothesis_2D (theGenImpl->GetANewId(), @@ -68,7 +67,6 @@ NETGENPlugin_Hypothesis_2D_i (PortableServer::POA_ptr thePOA, //============================================================================= NETGENPlugin_Hypothesis_2D_i::~NETGENPlugin_Hypothesis_2D_i() { - MESSAGE( "NETGENPlugin_Hypothesis_2D_i::~NETGENPlugin_Hypothesis_2D_i" ); } //============================================================================= diff --git a/src/NETGENPlugin/NETGENPlugin_Hypothesis_i.cxx b/src/NETGENPlugin/NETGENPlugin_Hypothesis_i.cxx index 26048f7..d60d666 100644 --- a/src/NETGENPlugin/NETGENPlugin_Hypothesis_i.cxx +++ b/src/NETGENPlugin/NETGENPlugin_Hypothesis_i.cxx @@ -366,6 +366,24 @@ void NETGENPlugin_Hypothesis_i::UnsetLocalSizeOnEntry(const char* entry) //============================================================================= +void NETGENPlugin_Hypothesis_i::SetMeshSizeFile(const char* fileName) +{ + if ( GetImpl()->GetMeshSizeFile() != fileName ) + { + GetImpl()->SetMeshSizeFile( fileName ); + SMESH::TPythonDump() << _this() << ".SetMeshSizeFile( '" << fileName << "' )"; + } +} + +//============================================================================= + +char* NETGENPlugin_Hypothesis_i::GetMeshSizeFile() +{ + return CORBA::string_dup( GetImpl()->GetMeshSizeFile().c_str() ); +} + +//============================================================================= + void NETGENPlugin_Hypothesis_i::SetQuadAllowed (CORBA::Boolean theValue) { if ( NETGENPlugin_Hypothesis_i::isToSetParameter( GetQuadAllowed(), diff --git a/src/NETGENPlugin/NETGENPlugin_Hypothesis_i.hxx b/src/NETGENPlugin/NETGENPlugin_Hypothesis_i.hxx index d03b242..12ffa7b 100644 --- a/src/NETGENPlugin/NETGENPlugin_Hypothesis_i.hxx +++ b/src/NETGENPlugin/NETGENPlugin_Hypothesis_i.hxx @@ -86,6 +86,9 @@ class NETGENPLUGIN_EXPORT NETGENPlugin_Hypothesis_i: NETGENPlugin::string_array* GetLocalSizeEntries(); void UnsetLocalSizeOnEntry(const char* entry); + void SetMeshSizeFile(const char* fileName); + char* GetMeshSizeFile(); + void SetQuadAllowed(CORBA::Boolean theVal); CORBA::Boolean GetQuadAllowed(); diff --git a/src/NETGENPlugin/NETGENPlugin_Mesher.cxx b/src/NETGENPlugin/NETGENPlugin_Mesher.cxx index ed36d22..5d5c401 100644 --- a/src/NETGENPlugin/NETGENPlugin_Mesher.cxx +++ b/src/NETGENPlugin/NETGENPlugin_Mesher.cxx @@ -283,6 +283,8 @@ void NETGENPlugin_Mesher::SetParameters(const NETGENPlugin_Hypothesis* hyp) mparams.uselocalh = hyp->GetSurfaceCurvature(); netgen::merge_solids = hyp->GetFuseEdges(); _simpleHyp = NULL; + // mesh size file + mparams.meshsizefilename= hyp->GetMeshSizeFile().empty() ? 0 : hyp->GetMeshSizeFile().c_str(); SMESH_Gen_i* smeshGen_i = SMESH_Gen_i::GetSMESHGen(); CORBA::Object_var anObject = smeshGen_i->GetNS()->Resolve("/myStudyManager"); @@ -661,7 +663,7 @@ void NETGENPlugin_Mesher::SetLocalSize( netgen::OCCGeometry& occgeo, if ( !ControlPoints.empty() ) { - for ( size_t i = 1; i < ControlPoints.size(); ++i ) + for ( size_t i = 0; i < ControlPoints.size(); ++i ) NETGENPlugin_Mesher::RestrictLocalSize( ngMesh, ControlPoints[i].XYZ(), ControlPoints[i].Size() ); } } @@ -2486,16 +2488,6 @@ bool NETGENPlugin_Mesher::Compute() NETGENPlugin_NetgenLibWrapper ngLib; netgen::MeshingParameters& mparams = netgen::mparam; - MESSAGE("Compute with:\n" - " max size = " << mparams.maxh << "\n" - " segments per edge = " << mparams.segmentsperedge); - MESSAGE("\n" - " growth rate = " << mparams.grading << "\n" - " elements per radius = " << mparams.curvaturesafety << "\n" - " second order = " << mparams.secondorder << "\n" - " quad allowed = " << mparams.quad << "\n" - " surface curvature = " << mparams.uselocalh << "\n" - " fuse edges = " << netgen::merge_solids); SMESH_ComputeErrorPtr error = SMESH_ComputeError::New(); SMESH_MesherHelper quadHelper( *_mesh ); @@ -2585,6 +2577,12 @@ bool NETGENPlugin_Mesher::Compute() { comment << text(ex); } + catch (netgen::NgException & ex) + { + comment << text(ex); + if ( mparams.meshsizefilename ) + throw SMESH_ComputeError(COMPERR_BAD_PARMETERS, comment ); + } err = 0; //- MESHCONST_ANALYSE isn't so important step if ( !_ngMesh ) return false; @@ -2592,6 +2590,9 @@ bool NETGENPlugin_Mesher::Compute() _ngMesh->ClearFaceDescriptors(); // we make descriptors our-self + if ( !mparams.uselocalh ) // mparams.grading is not taken into account yet + _ngMesh->LocalHFunction().SetGrading( mparams.grading ); + if ( _simpleHyp ) { // Pass 1D simple parameters to NETGEN @@ -3475,10 +3476,10 @@ NETGENPlugin_Mesher::ReadErrors(const vector& nodeVec) */ //================================================================================ -void NETGENPlugin_Mesher::toPython( const netgen::Mesh* ngMesh, - const std::string& pyFile) +void NETGENPlugin_Mesher::toPython( const netgen::Mesh* ngMesh ) { - ofstream outfile(pyFile.c_str(), ios::out); + const char* pyFile = "/tmp/ngMesh.py"; + ofstream outfile( pyFile, ios::out ); if ( !outfile ) return; outfile << "import SMESH" << endl diff --git a/src/NETGENPlugin/NETGENPlugin_Mesher.hxx b/src/NETGENPlugin/NETGENPlugin_Mesher.hxx index 2335b84..01a387f 100644 --- a/src/NETGENPlugin/NETGENPlugin_Mesher.hxx +++ b/src/NETGENPlugin/NETGENPlugin_Mesher.hxx @@ -191,8 +191,7 @@ class NETGENPLUGIN_EXPORT NETGENPlugin_Mesher static SMESH_ComputeErrorPtr ReadErrors(const std::vector< const SMDS_MeshNode* >& nodeVec); - static void toPython( const netgen::Mesh* ngMesh, - const std::string& pyFile); // debug + static void toPython( const netgen::Mesh* ngMesh ); // debug private: diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx index c383e5f..16baad4 100644 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx +++ b/src/NETGENPlugin/NETGENPlugin_NETGEN_2D_ONLY.cxx @@ -298,8 +298,7 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh& aMesh, for ( int iE = 1; iE <= edgeMap.Extent(); ++iE ) { const TopoDS_Shape& edge = edgeMap( iE ); - if ( SMESH_Algo::isDegenerated( TopoDS::Edge( edge ))/* || - helper.IsSubShape( edge, aShape )*/) + if ( SMESH_Algo::isDegenerated( TopoDS::Edge( edge ))) continue; SMESHDS_SubMesh* smDS = meshDS->MeshElements( edge ); if ( !smDS ) continue; @@ -317,6 +316,11 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh& aMesh, // set local size defined on shapes aMesher.SetLocalSize( occgeoComm, *ngMeshes[0] ); + try { + ngMeshes[0]->LoadLocalMeshSize( mparam.meshsizefilename ); + } catch (NgException & ex) { + return error( COMPERR_BAD_PARMETERS, ex.What() ); + } } netgen::mparam.uselocalh = toOptimize; // restore as it is used at surface optimization @@ -453,6 +457,11 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh& aMesh, bb.Increase (bb.Diam()/10); ngMesh->SetLocalH (bb.PMin(), bb.PMax(), mparam.grading); aMesher.SetLocalSize( occgeom, *ngMesh ); + try { + ngMesh->LoadLocalMeshSize( mparam.meshsizefilename ); + } catch (NgException & ex) { + return error( COMPERR_BAD_PARMETERS, ex.What() ); + } } nodeVec.clear(); diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx index 17a33c9..8fe43bb 100644 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx +++ b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D.cxx @@ -71,6 +71,7 @@ #define OCCGEOMETRY #endif #include +#include namespace nglib { #include } @@ -438,7 +439,8 @@ bool NETGENPlugin_NETGEN_3D::compute(SMESH_Mesh& aMesh, { aMesher.SetParameters( _hypParameters ); - if ( !_hypParameters->GetLocalSizesAndEntries().empty() ) + if ( !_hypParameters->GetLocalSizesAndEntries().empty() || + !_hypParameters->GetMeshSizeFile().empty() ) { if ( ! &ngMesh->LocalHFunction() ) { @@ -447,6 +449,12 @@ bool NETGENPlugin_NETGEN_3D::compute(SMESH_Mesh& aMesh, ngMesh->SetLocalH( pmin, pmax, _hypParameters->GetGrowthRate() ); } aMesher.SetLocalSize( occgeo, *ngMesh ); + + try { + ngMesh->LoadLocalMeshSize( netgen::mparam.meshsizefilename ); + } catch (netgen::NgException & ex) { + return error( COMPERR_BAD_PARMETERS, ex.What() ); + } } if ( !_hypParameters->GetOptimize() ) endWith = netgen::MESHCONST_MESHVOLUME; -- 2.30.2