FEM: mesh api, import of Abaqus inp mesh file with Fem API

This commit is contained in:
Bernd Hahnebach
2018-12-14 21:28:09 +01:00
parent ea727a9765
commit 4e99896be5
5 changed files with 45 additions and 6 deletions

View File

@@ -1169,6 +1169,42 @@ void FemMesh::readNastran(const std::string &Filename)
}
void FemMesh::readAbaqus(const std::string &FileName)
{
Base::TimeInfo Start;
Base::Console().Log("Start: FemMesh::readAbaqus() =================================\n");
/*
Python command to read Abaqus inp mesh file from test suite:
from feminout.importInpMesh import read as read_inp
femmesh = read_inp(FreeCAD.ConfigGet("AppHomePath") + 'Mod/Fem/femtest/testfiles/mesh/tetra10_mesh.inp')
*/
PyObject* module = PyImport_ImportModule("feminout.importInpMesh");
if (!module)
return;
try {
Py::Module abaqusmod(module, true);
Py::Callable method(abaqusmod.getAttr("read"));
Py::Tuple args(1);
args.setItem(0, Py::String(FileName));
Py::Object mesh(method.apply(args));
if (PyObject_TypeCheck(mesh.ptr(), &FemMeshPy::Type)) {
FemMeshPy* fempy = static_cast<FemMeshPy*>(mesh.ptr());
FemMesh* fem = fempy->getFemMeshPtr();
*this = *fem; // the deep copy should be avoided, a pointer swap method could be implemented
// see https://forum.freecadweb.org/viewtopic.php?f=10&t=31999&start=10#p274241
}
else {
throw Base::FileException("Problems reading file");
}
}
catch (Py::Exception& e) {
e.clear();
}
Base::Console().Log(" %f: Done \n",Base::TimeInfo::diffTimeF(Start,Base::TimeInfo()));
}
void FemMesh::readZ88(const std::string &FileName)
{
Base::TimeInfo Start;
@@ -1221,6 +1257,10 @@ void FemMesh::read(const char *FileName)
else if (File.hasExtension("med") ) {
myMesh->MEDToMesh(File.filePath().c_str(),File.fileNamePure().c_str());
}
else if (File.hasExtension("inp") ) {
// read Abaqus inp mesh file
readAbaqus(File.filePath());
}
else if (File.hasExtension("stl") ) {
// read brep-file
myMesh->STLToMesh(File.filePath().c_str());

View File

@@ -158,6 +158,7 @@ private:
void copyMeshData(const FemMesh&);
void readNastran(const std::string &Filename);
void readZ88(const std::string &Filename);
void readAbaqus(const std::string &Filename);
private:
/// positioning matrix

View File

@@ -63,7 +63,7 @@
<Documentation>
<UserDocu>Read in a various FEM mesh file formats.
read(file.endingToExportTo)
supported formats: DAT, MED, STL, UNV, VTK, Z88</UserDocu>
supported formats: DAT, INP, MED, STL, UNV, VTK, Z88</UserDocu>
</Documentation>
</Methode>
<Methode Name="write" Const="true">

View File

@@ -31,10 +31,9 @@ import FreeCAD
FreeCAD.addExportType("FEM mesh TetGen (*.poly)", "feminout.convert2TetGen")
# see FemMesh::read() and FemMesh::write() methods in src/Mod/Fem/App/FemMesh.cpp
FreeCAD.addImportType("FEM mesh formats (*.unv *.med *.dat *.bdf *.vtk *.vtu *.z88)", "Fem")
FreeCAD.addImportType("FEM mesh formats (*.unv *.med *.dat *.bdf *.inp *.vtk *.vtu *.z88)", "Fem")
FreeCAD.addExportType("FEM mesh formats (*.unv *.med *.stl *.dat *.inp *.vtk *.vtu *.z88)", "Fem")
FreeCAD.addImportType("FEM mesh CalculiX/Abaqus (*.inp)", "feminout.importInpMesh")
FreeCAD.addImportType("FEM result CalculiX (*.frd)", "feminout.importCcxFrdResults")
FreeCAD.addImportType("FEM mesh Fenics (*.xml *.xdmf)", "feminout.importFenicsMesh")

View File

@@ -223,9 +223,8 @@ class TestMeshEleTetra10(unittest.TestCase):
# fcc_print(outfile)
# fcc_print(testfile)
self.femmesh.writeABAQUS(outfile, 1, False) # write the mesh
from feminout.importInpMesh import read as read_inp
femmesh_outfile = read_inp(outfile) # read the mesh from written mesh
femmesh_testfile = read_inp(testfile) # read the mesh from test mesh
femmesh_outfile = Fem.read(outfile) # read the mesh from written mesh
femmesh_testfile = Fem.read(testfile) # read the mesh from test mesh
# reading the test mesh
# fcc_print([femmesh_testfile.Volumes[0], femmesh_testfile.getElementNodes(femmesh_outfile.Volumes[0])])
self.assertEqual(