diff --git a/doc/salome/gui/NETGENPLUGIN/images/netgen3d_local_size.png b/doc/salome/gui/NETGENPLUGIN/images/netgen3d_local_size.png
index 1bac778..efc53ff 100644
Binary files a/doc/salome/gui/NETGENPLUGIN/images/netgen3d_local_size.png and b/doc/salome/gui/NETGENPLUGIN/images/netgen3d_local_size.png differ
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 @@
Value
+
+
+ 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;