From 1341c43e5f801c6d957472c36672103ba73e4f85 Mon Sep 17 00:00:00 2001 From: jriegel Date: Sat, 8 Feb 2014 14:09:45 +0100 Subject: [PATCH 1/7] Get node of face implementation --- src/Mod/Fem/App/FemMesh.cpp | 22 ++++++++++++++++++++++ src/Mod/Fem/App/FemMeshPyImp.cpp | 9 +++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Mod/Fem/App/FemMesh.cpp b/src/Mod/Fem/App/FemMesh.cpp index 02eebd515..ffd7c5dad 100755 --- a/src/Mod/Fem/App/FemMesh.cpp +++ b/src/Mod/Fem/App/FemMesh.cpp @@ -30,6 +30,7 @@ # include # include # include +# include #endif #include @@ -326,6 +327,7 @@ SMESH_Mesh* FemMesh::getSMesh() return myMesh; } + SMESH_Gen * FemMesh::getGenerator() { return myGen; @@ -404,6 +406,26 @@ std::set FemMesh::getSurfaceNodes(const TopoDS_Face &face)const std::set result; const SMESHDS_Mesh* data = myMesh->GetMeshDS(); + Bnd_Box box; + BRepBndLib::Add(face, box); + + // get the actuall transform of the FemMesh + const Base::Matrix4D Mtrx(getTransform()); + + SMDS_NodeIteratorPtr aNodeIter = myMesh->GetMeshDS()->nodesIterator(); + for (int i=0;aNodeIter->more();i++) { + const SMDS_MeshNode* aNode = aNodeIter->next(); + Base::Vector3d vec(aNode->X(),aNode->Y(),aNode->Z()); + // Apply the matrix to hold the BoundBox in absolute space. + vec = Mtrx * vec; + + if(!box.IsOut(gp_Pnt(vec.x,vec.y,vec.z))){ + + result.insert(aNode->GetID()); + + } + } + BRepAlgo_NormalProjection algo; diff --git a/src/Mod/Fem/App/FemMeshPyImp.cpp b/src/Mod/Fem/App/FemMeshPyImp.cpp index 124173274..418af9788 100755 --- a/src/Mod/Fem/App/FemMeshPyImp.cpp +++ b/src/Mod/Fem/App/FemMeshPyImp.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -534,13 +535,17 @@ PyObject* FemMeshPy::getNodesByFace(PyObject *args) try { const TopoDS_Shape& sh = static_cast(pW)->getTopoShapePtr()->_Shape; + const TopoDS_Face& fc = TopoDS::Face(sh); if (sh.IsNull()) { PyErr_SetString(PyExc_Exception, "Face is empty"); return 0; } Py::List ret; - throw Py::Exception("Not yet implemented"); - + std::set resultSet = getFemMeshPtr()->getSurfaceNodes(fc); + for( std::set::const_iterator it = resultSet.begin();it!=resultSet.end();++it) + ret.append(Py::Int(*it)); + + return Py::new_reference_to(ret); } catch (Standard_Failure) { From cd69467edeb25b60c6419aa0a391e9463dedbaa3 Mon Sep 17 00:00:00 2001 From: jriegel Date: Sun, 9 Feb 2014 17:53:21 +0100 Subject: [PATCH 2/7] Finish get nodes by surface --- src/Mod/Fem/App/FemMesh.cpp | 21 +++++++++++++++----- src/Mod/Fem/App/FemMeshPy.xml | 2 +- src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp | 13 ++++++------ 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/Mod/Fem/App/FemMesh.cpp b/src/Mod/Fem/App/FemMesh.cpp index ffd7c5dad..9349067a0 100755 --- a/src/Mod/Fem/App/FemMesh.cpp +++ b/src/Mod/Fem/App/FemMesh.cpp @@ -29,7 +29,9 @@ # include # include # include -# include +# include +# include +# include # include #endif @@ -408,6 +410,9 @@ std::set FemMesh::getSurfaceNodes(const TopoDS_Face &face)const Bnd_Box box; BRepBndLib::Add(face, box); + // limit where the mesh node belongs to the face: + double limit = box.SquareExtent()/10000.0; + box.Enlarge(limit); // get the actuall transform of the FemMesh const Base::Matrix4D Mtrx(getTransform()); @@ -420,15 +425,21 @@ std::set FemMesh::getSurfaceNodes(const TopoDS_Face &face)const vec = Mtrx * vec; if(!box.IsOut(gp_Pnt(vec.x,vec.y,vec.z))){ + // create a Vertex + BRepBuilderAPI_MakeVertex aBuilder(gp_Pnt(vec.x,vec.y,vec.z)); + TopoDS_Shape s = aBuilder.Vertex(); + // measure distance + BRepExtrema_DistShapeShape measure(face,s); + measure.Perform(); + if (!measure.IsDone() || measure.NbSolution() < 1) + continue; - result.insert(aNode->GetID()); + if(measure.Value() < limit) + result.insert(aNode->GetID()); } } - BRepAlgo_NormalProjection algo; - - return result; } diff --git a/src/Mod/Fem/App/FemMeshPy.xml b/src/Mod/Fem/App/FemMeshPy.xml index 8933354f8..d8fd2333a 100755 --- a/src/Mod/Fem/App/FemMeshPy.xml +++ b/src/Mod/Fem/App/FemMeshPy.xml @@ -89,7 +89,7 @@ Get the node position vector by an Node-ID - + Return a list of node IDs which belong to a TopoFace diff --git a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp index a24a843af..0481b5b8a 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp @@ -218,13 +218,14 @@ Py::List ViewProviderFemMeshPy::getHighlightedNodes(void) const void ViewProviderFemMeshPy::setHighlightedNodes(Py::List arg) { - /* std::set& nodeSet; - for (Py::List::iterator it = arg.begin(); it != arg.end() && index < 16; ++it) { - nodeSet.i (double)Py::Int(*it); - } - setHighlightNodes*/ - throw Py::AttributeError("Not yet implemented"); + std::set res; + for( Py::List::iterator it = arg.begin(); it!= arg.end();++it){ + Py::Int id(*it); + if(id) + res.insert(id); + } + this->getViewProviderFemMeshPtr()->setHighlightNodes(res); } Py::List ViewProviderFemMeshPy::getVisibleElementFaces(void) const From c7e41c615014472b084c166c7cad0f661c778206 Mon Sep 17 00:00:00 2001 From: jriegel Date: Sun, 9 Feb 2014 18:59:35 +0100 Subject: [PATCH 3/7] PySide switch for LibPack >= 8.2 default on in the vanilla sourc This means that you need 8.2 or higher or you have to switch of FREECAD_LIBPACK_USEPYSIDE! --- CMakeLists.txt | 1 + cMake/UseLibPack8x.cmake | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c81442d4a..52e5856e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,6 +92,7 @@ MESSAGE(STATUS "includedir: ${CMAKE_INSTALL_INCLUDEDIR}") # == Win32 is default behaviour use the LibPack copied in Source tree ========== if(MSVC) OPTION(FREECAD_LIBPACK_USE "Use the LibPack to Build FreeCAD (only Win32 so far)." ON) + OPTION(FREECAD_LIBPACK_USEPYSIDE "Use PySide in LibPack rather to PyQt and Swig." ON) set(FREECAD_LIBPACK_DIR ${CMAKE_SOURCE_DIR} CACHE PATH "Directory of the FreeCAD LibPack") else(MSVC) OPTION(FREECAD_LIBPACK_USE "Use the LibPack to Build FreeCAD (only Win32 so far)." OFF) diff --git a/cMake/UseLibPack8x.cmake b/cMake/UseLibPack8x.cmake index 0d6961d6d..4d01bba21 100644 --- a/cMake/UseLibPack8x.cmake +++ b/cMake/UseLibPack8x.cmake @@ -151,7 +151,25 @@ set(QT_RCC_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/rcc.exe) set(QT_HELPCOMPILER_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/qhelpgenerator.exe) set(QT_COLLECTIOMGENERATOR_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/qcollectiongenerator.exe) +if(FREECAD_LIBPACK_USEPYSIDE) + # SHIBOKEN_INCLUDE_DIR - Directories to include to use SHIBOKEN + # SHIBOKEN_LIBRARY - Files to link against to use SHIBOKEN + # SHIBOKEN_BINARY - Executable name + SET(SHIBOKEN_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/shiboken) + SET(SHIBOKEN_LIBRARY optimized ${FREECAD_LIBPACK_DIR}/lib/shiboken-python2.6.lib debug ${FREECAD_LIBPACK_DIR}/lib/shiboken-python2.6_d.lib) + set(SHIBOKEN_BINARY ${FREECAD_LIBPACK_DIR}/bin/shiboken) + + # PYSIDE_INCLUDE_DIR - Directories to include to use PySide + # PYSIDE_LIBRARY - Files to link against to use PySide + # PYSIDE_PYTHONPATH - Path to where the PySide Python module files could be found + # PYSIDE_TYPESYSTEMS - Type system files that should be used by other bindings extending PySide + + SET(PYSIDE_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/PySide) + SET(PYSIDE_LIBRARY optimized ${FREECAD_LIBPACK_DIR}/lib/pyside-python2.6.lib debug ${FREECAD_LIBPACK_DIR}/lib/pyside-python2.6_d.lib) + #SET(PYSIDE_PYTHONPATH ${FREECAD_LIBPACK_DIR}/pyside/Lib/site-packages) + #SET(PYSIDE_TYPESYSTEMS ${FREECAD_LIBPACK_DIR}/pyside/share/PySide/typesystems) +endif(FREECAD_LIBPACK_USEPYSIDE) MACRO (QT4_EXTRACT_OPTIONS _qt4_files _qt4_options) SET(${_qt4_files}) From 893f33004301779c1f984a976d1071d6d0e6437f Mon Sep 17 00:00:00 2001 From: jriegel Date: Sun, 9 Feb 2014 19:21:01 +0100 Subject: [PATCH 4/7] Fix default bug in Pad dialog --- src/Gui/InputField.cpp | 2 +- src/Mod/PartDesign/Gui/TaskPadParameters.cpp | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Gui/InputField.cpp b/src/Gui/InputField.cpp index b0ab87c31..7a08e170f 100644 --- a/src/Gui/InputField.cpp +++ b/src/Gui/InputField.cpp @@ -205,7 +205,7 @@ void InputField::setToLastUsedValue(void) { std::vector hist = getHistory(); if(hist.size()>0) - this->setText(hist[0]); + this->setValue(Base::Quantity::parse(hist[0])); } diff --git a/src/Mod/PartDesign/Gui/TaskPadParameters.cpp b/src/Mod/PartDesign/Gui/TaskPadParameters.cpp index ef1ee4a28..c3125034c 100644 --- a/src/Mod/PartDesign/Gui/TaskPadParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPadParameters.cpp @@ -117,11 +117,6 @@ TaskPadParameters::TaskPadParameters(ViewProviderPad *PadView,bool newObj, QWidg ui->lengthEdit2->setMaximum(INT_MAX); ui->lengthEdit2->setValue(l2); - // if it is a newly created object use the last value of the history - if(newObj){ - ui->lengthEdit->setToLastUsedValue(); - ui->lengthEdit2->setToLastUsedValue(); - } ui->checkBoxMidplane->setChecked(midplane); // According to bug #0000521 the reversed option @@ -148,6 +143,14 @@ TaskPadParameters::TaskPadParameters(ViewProviderPad *PadView,bool newObj, QWidg ui->lineFaceName->blockSignals(false); ui->changeMode->blockSignals(false); updateUI(index); + + // if it is a newly created object use the last value of the history + if(newObj){ + ui->lengthEdit->setToLastUsedValue(); + ui->lengthEdit2->setToLastUsedValue(); + } + + } void TaskPadParameters::updateUI(int index) From 58fda26298e969a9ef75ca69a544a58216484360 Mon Sep 17 00:00:00 2001 From: jriegel Date: Sun, 9 Feb 2014 19:28:15 +0100 Subject: [PATCH 5/7] Fix doulbe value entry in history of InpuField --- src/Gui/InputField.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Gui/InputField.cpp b/src/Gui/InputField.cpp index 7a08e170f..34ae8b0fb 100644 --- a/src/Gui/InputField.cpp +++ b/src/Gui/InputField.cpp @@ -162,12 +162,19 @@ void InputField::newInput(const QString & text) void InputField::pushToHistory(const QString &valueq) { - std::string value; + QString val; if(valueq.isEmpty()) - value = this->text().toUtf8().constData(); + val = this->text(); else - value = valueq.toUtf8().constData(); + val = valueq; + + // check if already in: + std::vector hist = InputField::getHistory(); + for(std::vector::const_iterator it = hist.begin();it!=hist.end();++it) + if( *it == val) + return; + std::string value(val.toUtf8()); if(_handle.isValid()){ char hist1[21]; char hist0[21]; From d17fb3aa5d120217491ceba159dcc667a0da6452 Mon Sep 17 00:00:00 2001 From: jriegel Date: Sun, 9 Feb 2014 20:50:07 +0100 Subject: [PATCH 6/7] First tests of using InputField via Python --- src/Gui/InputField.cpp | 11 ++++++ src/Gui/InputField.h | 6 +++- src/Mod/Fem/MechanicalMaterial.py | 48 ++++++++++++------------- src/Mod/Fem/MechanicalMaterial.ui | 59 ++++++++++++++----------------- 4 files changed, 64 insertions(+), 60 deletions(-) diff --git a/src/Gui/InputField.cpp b/src/Gui/InputField.cpp index 34ae8b0fb..7c5545a89 100644 --- a/src/Gui/InputField.cpp +++ b/src/Gui/InputField.cpp @@ -329,6 +329,17 @@ void InputField::setMinimum(double m) Minimum = m; } +void InputField::setUnitText(QString str) +{ + Base::Quantity quant = Base::Quantity::parse(str); + setUnit(quant.getUnit()); +} + +QString InputField::getUnitText(void) +{ + return actUnitStr; +} + // get the value of the minimum property int InputField::historySize(void)const { diff --git a/src/Gui/InputField.h b/src/Gui/InputField.h index 3c31be05f..e0fd46aa2 100644 --- a/src/Gui/InputField.h +++ b/src/Gui/InputField.h @@ -52,6 +52,7 @@ class GuiExport InputField : public QLineEdit Q_PROPERTY(double maximum READ maximum WRITE setMaximum ) Q_PROPERTY(double minimum READ minimum WRITE setMinimum ) Q_PROPERTY(int historySize READ historySize WRITE setHistorySize ) + Q_PROPERTY(QString unit READ getUnitText WRITE setUnitText ) public: @@ -88,7 +89,10 @@ public: int historySize(void)const; /// set the value of the minimum property void setHistorySize(int); - + /// set the unit by a string (can be used in the *.ui file) + void setUnitText(QString); + /// get the unit as a string (can be used in the *.ui file) + QString getUnitText(void); /// set the number portion selected (use after setValue()) void selectNumber(void); diff --git a/src/Mod/Fem/MechanicalMaterial.py b/src/Mod/Fem/MechanicalMaterial.py index 2d7a1290d..b13672840 100644 --- a/src/Mod/Fem/MechanicalMaterial.py +++ b/src/Mod/Fem/MechanicalMaterial.py @@ -128,20 +128,13 @@ class _ViewProviderMechanicalMaterial: class _MechanicalMaterialTaskPanel: '''The editmode TaskPanel for MechanicalMaterial objects''' def __init__(self,obj): - # the panel has a tree widget that contains categories - # for the subcomponents, such as additions, subtractions. - # the categories are shown only if they are not empty. - form_class, base_class = uic.loadUiType(FreeCAD.getHomePath() + "Mod/Fem/MechanicalMaterial.ui") - self.obj = obj - self.formUi = form_class() - self.form = QtGui.QWidget() - self.formUi.setupUi(self.form) + + self.form=FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/MechanicalMaterial.ui") self.params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") - - QtCore.QObject.connect(self.formUi.pushButton_MatWeb, QtCore.SIGNAL("clicked()"), self.goMatWeb) - QtCore.QObject.connect(self.formUi.comboBox_MaterialsInDir, QtCore.SIGNAL("currentIndexChanged(int)"), self.chooseMat) + QtCore.QObject.connect(self.form.pushButton_MatWeb, QtCore.SIGNAL("clicked()"), self.goMatWeb) + QtCore.QObject.connect(self.form.comboBox_MaterialsInDir, QtCore.SIGNAL("currentIndexChanged(int)"), self.chooseMat) self.update() @@ -150,10 +143,11 @@ class _MechanicalMaterialTaskPanel: matmap = self.obj.Material - matmap['Mechanical_youngsmodulus'] = str(self.formUi.spinBox_young_modulus.value() * 1e+6) - matmap['FEM_poissonratio'] = str(self.formUi.spinBox_poisson_ratio.value()) + matmap['Mechanical_youngsmodulus'] = self.form.spinBox_young_modulus.text() + matmap['FEM_poissonratio'] = str(self.form.spinBox_poisson_ratio.value()) self.obj.Material = matmap + print matmap def transferFrom(self): @@ -161,11 +155,11 @@ class _MechanicalMaterialTaskPanel: matmap = self.obj.Material if matmap.has_key('Mechanical_youngsmodulus'): - print float(matmap['Mechanical_youngsmodulus']) - self.formUi.spinBox_young_modulus.setValue(float(matmap['Mechanical_youngsmodulus'])/1e+6) + print matmap['Mechanical_youngsmodulus'] + self.form.spinBox_young_modulus.setText(matmap['Mechanical_youngsmodulus']) if matmap.has_key('FEM_poissonratio'): - print float(matmap['FEM_poissonratio']) - self.formUi.spinBox_poisson_ratio.setValue(float(matmap['FEM_poissonratio'])) + #print float(matmap['FEM_poissonratio']) + self.form.spinBox_poisson_ratio.setValue(float(matmap['FEM_poissonratio'])) def isAllowedAlterSelection(self): return False @@ -178,8 +172,8 @@ class _MechanicalMaterialTaskPanel: def update(self): 'fills the widgets' - self.formUi.spinBox_young_modulus.setValue(0.0) - self.formUi.spinBox_poisson_ratio.setValue(0.0) + #self.form.spinBox_young_modulus.setValue(0.0) + #self.form.spinBox_poisson_ratio.setValue(0.0) self.transferFrom() self.fillMaterialCombo() @@ -187,10 +181,12 @@ class _MechanicalMaterialTaskPanel: return def accept(self): + print 'accept(self)' self.transferTo() FreeCADGui.ActiveDocument.resetEdit() def reject(self): + print 'reject(self)' FreeCADGui.ActiveDocument.resetEdit() def saveMat(self): @@ -207,12 +203,12 @@ class _MechanicalMaterialTaskPanel: def chooseMat(self,index): if index == 0:return import Material - print index + #print index name = self.pathList[index-1] - print 'Import ', str(name) + #print 'Import ', str(name) self.obj.Material = Material.importFCMat(str(name)) - print self.obj.Material + #print self.obj.Material self.transferFrom() @@ -221,13 +217,13 @@ class _MechanicalMaterialTaskPanel: matmap = self.obj.Material dirname = FreeCAD.ConfigGet("AppHomePath")+"data/Mod/Material/StandardMaterial" self.pathList = glob.glob(dirname + '/*.FCMat') - self.formUi.comboBox_MaterialsInDir.clear() + self.form.comboBox_MaterialsInDir.clear() if(matmap.has_key('General_name')): - self.formUi.comboBox_MaterialsInDir.addItem(matmap['General_name']) + self.form.comboBox_MaterialsInDir.addItem(matmap['General_name']) else: - self.formUi.comboBox_MaterialsInDir.addItem('-> choose Material') + self.form.comboBox_MaterialsInDir.addItem('-> choose Material') for i in self.pathList: - self.formUi.comboBox_MaterialsInDir.addItem(os.path.basename(i) ) + self.form.comboBox_MaterialsInDir.addItem(os.path.basename(i) ) diff --git a/src/Mod/Fem/MechanicalMaterial.ui b/src/Mod/Fem/MechanicalMaterial.ui index 120266931..48cebddb5 100644 --- a/src/Mod/Fem/MechanicalMaterial.ui +++ b/src/Mod/Fem/MechanicalMaterial.ui @@ -6,8 +6,8 @@ 0 0 - 196 - 142 + 188 + 124 @@ -34,27 +34,17 @@ - - - - Qt::Horizontal - - - - - QFormLayout::AllNonFixedFieldsGrow - - - - - Qt::Horizontal + + + + Young's Modulus: - - + + 0 @@ -70,28 +60,31 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + + Pa + + 3 - + 2000.000000000000000 - + 2.000000000000000 - + 0.000000000000000 - - + + - Young's Mod.(GPa) + Poisson Ratio: - + @@ -122,17 +115,17 @@ - - - - Poisson Ratio - - - + + + Gui::InputField + QLineEdit +
Gui/InputField.h
+
+
From ad0db9f4c5284fb9ffaa7e047f64d77efecf126b Mon Sep 17 00:00:00 2001 From: jriegel Date: Sun, 9 Feb 2014 21:40:46 +0100 Subject: [PATCH 7/7] Further implementing MechanicalAnalysis --- src/Mod/Fem/MechanicalAnalysis.py | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/Mod/Fem/MechanicalAnalysis.py b/src/Mod/Fem/MechanicalAnalysis.py index 2dc0cb98c..98bd9052a 100644 --- a/src/Mod/Fem/MechanicalAnalysis.py +++ b/src/Mod/Fem/MechanicalAnalysis.py @@ -220,7 +220,7 @@ class _JobControlTaskPanel: self.formUi = form_class() self.form = QtGui.QWidget() self.formUi.setupUi(self.form) - self.params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Machining_Distortion") + #self.params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") #Connect Signals and Slots QtCore.QObject.connect(self.formUi.toolButton_chooseOutputDir, QtCore.SIGNAL("clicked()"), self.chooseOutputDir) @@ -235,7 +235,7 @@ class _JobControlTaskPanel: def update(self): 'fills the widgets' - self.formUi.lineEdit_outputDir.setText(self.params.GetString("JobDir",'/')) + self.formUi.lineEdit_outputDir.setText(tempfile.gettempdir()) return def accept(self): @@ -294,7 +294,32 @@ class _JobControlTaskPanel: return - filename_without_suffix = MeshObject.Name + filename = dirName + '/' + MeshObject.Name + '.inp' + + MeshObject.FemMesh.writeABAQUS(filename) + + # now open again and write the setup: + inpfile = open(filename,'a') + inpfile.write('*MATERIAL, Name='+matmap['General_name'] + '\n') + + + #*MATERIAL, Name=steel + #*ELASTIC + #28000000, 0.3 + #*SOLID SECTION, Elset=Eall, Material=steel + #*STEP + #*STATIC + #*BOUNDARY + #Nfix1,3,3,0 + #Nfix2,2,3,0 + #Nfix3,1,3,0 + #*DLOAD + #*INCLUDE, INPUT=load.dlo + #*NODE FILE + #U + #*EL FILE + #S, E + #*END STEP #current_file_name #young_modulus = float(matmap['FEM_youngsmodulus'])