diff --git a/src/App/ComplexGeoData.h b/src/App/ComplexGeoData.h
index 5e69badbfa..8788395967 100644
--- a/src/App/ComplexGeoData.h
+++ b/src/App/ComplexGeoData.h
@@ -163,7 +163,6 @@ protected:
return Base::Vector3f((float)tmp.x,(float)tmp.y,(float)tmp.z);
}
- //Base::Matrix4D _Mtrx;
};
} //namespace App
diff --git a/src/App/ComplexGeoDataPyImp.cpp b/src/App/ComplexGeoDataPyImp.cpp
index bfd3b16543..1cef19c3fc 100644
--- a/src/App/ComplexGeoDataPyImp.cpp
+++ b/src/App/ComplexGeoDataPyImp.cpp
@@ -71,6 +71,7 @@ Py::Object ComplexGeoDataPy::getMatrix(void) const
return Py::Matrix(getComplexGeoDataPtr()->getTransform());
}
+// FIXME would be better to call it setTransform() as in all other interfaces...
void ComplexGeoDataPy::setMatrix(Py::Object arg)
{
PyObject* p = arg.ptr();
diff --git a/src/Mod/Fem/App/FemMesh.cpp b/src/Mod/Fem/App/FemMesh.cpp
index b1748cf62c..da05e2afa8 100755
--- a/src/Mod/Fem/App/FemMesh.cpp
+++ b/src/Mod/Fem/App/FemMesh.cpp
@@ -125,6 +125,8 @@ void FemMesh::copyMeshData(const FemMesh& mesh)
//int numPris = info.NbPrisms();
//int numHedr = info.NbPolyhedrons();
+ _Mtrx = mesh._Mtrx;
+
SMESHDS_Mesh* meshds = this->myMesh->GetMeshDS();
meshds->ClearMesh();
@@ -415,6 +417,8 @@ void FemMesh::readNastran(const std::string &Filename)
Base::TimeInfo Start;
Base::Console().Log("Start: FemMesh::readNastran() =================================\n");
+ _Mtrx = Base::Matrix4D();
+
std::ifstream inputfile;
inputfile.open(Filename.c_str());
inputfile.seekg(std::ifstream::beg);
@@ -575,6 +579,7 @@ void FemMesh::readNastran(const std::string &Filename)
void FemMesh::read(const char *FileName)
{
Base::FileInfo File(FileName);
+ _Mtrx = Base::Matrix4D();
// checking on the file
if (!File.isReadable())
@@ -604,7 +609,7 @@ void FemMesh::read(const char *FileName)
}
}
-void FemMesh::writeABAQUS(const std::string &Filename, Base::Placement* placement) const
+void FemMesh::writeABAQUS(const std::string &Filename) const
{
std::ofstream anABAQUS_Output;
anABAQUS_Output.open(Filename.c_str());
@@ -612,29 +617,16 @@ void FemMesh::writeABAQUS(const std::string &Filename, Base::Placement* placemen
//Extract Nodes and Elements of the current SMESH datastructure
SMDS_NodeIteratorPtr aNodeIter = myMesh->GetMeshDS()->nodesIterator();
- if (placement)
- {
- Base::Vector3d current_node;
- Base::Matrix4D matrix = placement->toMatrix();
- for (;aNodeIter->more();) {
- const SMDS_MeshNode* aNode = aNodeIter->next();
- current_node.Set(aNode->X(),aNode->Y(),aNode->Z());
- current_node = matrix * current_node;
- anABAQUS_Output << aNode->GetID() << ","
- << current_node.x << ","
- << current_node.y << ","
- << current_node.z << std::endl;
- }
- }
- else
- {
- for (;aNodeIter->more();) {
- const SMDS_MeshNode* aNode = aNodeIter->next();
- anABAQUS_Output << aNode->GetID() << ","
- << aNode->X() << ","
- << aNode->Y() << ","
- << aNode->Z() << std::endl;
- }
+
+ Base::Vector3d current_node;
+ for (;aNodeIter->more();) {
+ const SMDS_MeshNode* aNode = aNodeIter->next();
+ current_node.Set(aNode->X(),aNode->Y(),aNode->Z());
+ current_node = _Mtrx * current_node;
+ anABAQUS_Output << aNode->GetID() << ","
+ << current_node.x << ","
+ << current_node.y << ","
+ << current_node.z << std::endl;
}
anABAQUS_Output << "*Element, TYPE=C3D10, ELSET=Eall" << std::endl;
@@ -725,10 +717,49 @@ unsigned int FemMesh::getMemSize (void) const
void FemMesh::Save (Base::Writer &writer) const
{
+ //See SaveDocFile(), RestoreDocFile()
+ writer.Stream() << writer.ind() << "" << std::endl;
+
+
}
void FemMesh::Restore(Base::XMLReader &reader)
{
+
+ reader.readElement("FemMesh");
+ std::string file (reader.getAttribute("file") );
+
+ if (!file.empty()) {
+ // initate a file read
+ reader.addFile(file.c_str(),this);
+ }
+ if( reader.hasAttribute("a11")){
+ _Mtrx[0][0] = (float)reader.getAttributeAsFloat("a11");
+ _Mtrx[0][1] = (float)reader.getAttributeAsFloat("a12");
+ _Mtrx[0][2] = (float)reader.getAttributeAsFloat("a13");
+ _Mtrx[0][3] = (float)reader.getAttributeAsFloat("a14");
+
+ _Mtrx[1][0] = (float)reader.getAttributeAsFloat("a21");
+ _Mtrx[1][1] = (float)reader.getAttributeAsFloat("a22");
+ _Mtrx[1][2] = (float)reader.getAttributeAsFloat("a23");
+ _Mtrx[1][3] = (float)reader.getAttributeAsFloat("a24");
+
+ _Mtrx[2][0] = (float)reader.getAttributeAsFloat("a31");
+ _Mtrx[2][1] = (float)reader.getAttributeAsFloat("a32");
+ _Mtrx[2][2] = (float)reader.getAttributeAsFloat("a33");
+ _Mtrx[2][3] = (float)reader.getAttributeAsFloat("a34");
+
+ _Mtrx[3][0] = (float)reader.getAttributeAsFloat("a41");
+ _Mtrx[3][1] = (float)reader.getAttributeAsFloat("a42");
+ _Mtrx[3][2] = (float)reader.getAttributeAsFloat("a43");
+ _Mtrx[3][3] = (float)reader.getAttributeAsFloat("a44");
+ }
}
void FemMesh::SaveDocFile (Base::Writer &writer) const
@@ -795,12 +826,12 @@ void FemMesh::transformGeometry(const Base::Matrix4D& rclTrf)
void FemMesh::setTransform(const Base::Matrix4D& rclTrf)
{
// Placement handling, no geometric transformation
+ _Mtrx = rclTrf;
}
Base::Matrix4D FemMesh::getTransform(void) const
{
- Base::Matrix4D mtrx;
- return mtrx;
+ return _Mtrx;
}
Base::BoundBox3d FemMesh::getBoundBox(void) const
@@ -812,7 +843,10 @@ Base::BoundBox3d FemMesh::getBoundBox(void) const
SMDS_NodeIteratorPtr aNodeIter = data->nodesIterator();
for (;aNodeIter->more();) {
const SMDS_MeshNode* aNode = aNodeIter->next();
- box.Add(Base::Vector3d(aNode->X(),aNode->Y(),aNode->Z()));
+ Base::Vector3d vec(aNode->X(),aNode->Y(),aNode->Z());
+ // Apply the matrix to hold the BoundBox in absolute space.
+ vec = _Mtrx * vec;
+ box.Add(vec);
}
return box;
diff --git a/src/Mod/Fem/App/FemMesh.h b/src/Mod/Fem/App/FemMesh.h
index e7a013f519..7268456372 100755
--- a/src/Mod/Fem/App/FemMesh.h
+++ b/src/Mod/Fem/App/FemMesh.h
@@ -107,7 +107,7 @@ public:
/// import from files
void read(const char *FileName);
void write(const char *FileName) const;
- void writeABAQUS(const std::string &Filename, Base::Placement* = 0) const;
+ void writeABAQUS(const std::string &Filename) const;
private:
void copyMeshData(const FemMesh&);
diff --git a/src/Mod/Fem/App/FemMeshProperty.cpp b/src/Mod/Fem/App/FemMeshProperty.cpp
index 0223374715..e322035a91 100755
--- a/src/Mod/Fem/App/FemMeshProperty.cpp
+++ b/src/Mod/Fem/App/FemMeshProperty.cpp
@@ -138,23 +138,12 @@ unsigned int PropertyFemMesh::getMemSize (void) const
void PropertyFemMesh::Save (Base::Writer &writer) const
{
- if (!writer.isForceXML()) {
- //See SaveDocFile(), RestoreDocFile()
- writer.Stream() << writer.ind() << "" << std::endl;
- }
+ _FemMesh->Save(writer);
}
void PropertyFemMesh::Restore(Base::XMLReader &reader)
{
- reader.readElement("FemMesh");
- std::string file (reader.getAttribute("file") );
-
- if (!file.empty()) {
- // initate a file read
- reader.addFile(file.c_str(),this);
- }
+ _FemMesh->Restore(reader);
}
void PropertyFemMesh::SaveDocFile (Base::Writer &writer) const
diff --git a/src/Mod/Fem/App/FemMeshPyImp.cpp b/src/Mod/Fem/App/FemMeshPyImp.cpp
index d7511fae10..a54010052b 100755
--- a/src/Mod/Fem/App/FemMeshPyImp.cpp
+++ b/src/Mod/Fem/App/FemMeshPyImp.cpp
@@ -400,17 +400,11 @@ PyObject* FemMeshPy::write(PyObject *args)
PyObject* FemMeshPy::writeABAQUS(PyObject *args)
{
char* filename;
- PyObject* plm=0;
- if (!PyArg_ParseTuple(args, "s|O!", &filename, &(Base::PlacementPy::Type),&plm))
+ if (!PyArg_ParseTuple(args, "s", &filename))
return 0;
try {
- Base::Placement* placement = 0;
- if (plm) {
- placement = static_cast(plm)->getPlacementPtr();
- }
-
- getFemMeshPtr()->writeABAQUS(filename, placement);
+ getFemMeshPtr()->writeABAQUS(filename);
}
catch (const std::exception& e) {
PyErr_SetString(PyExc_Exception, e.what());