+ fix crash in export to abaqus

This commit is contained in:
wmayer 2015-03-15 02:08:55 +01:00
parent 08f7afb0e4
commit 5d159f5cf3

View File

@ -662,7 +662,7 @@ void FemMesh::writeABAQUS(const std::string &Filename) const
SMDS_NodeIteratorPtr aNodeIter = myMesh->GetMeshDS()->nodesIterator(); SMDS_NodeIteratorPtr aNodeIter = myMesh->GetMeshDS()->nodesIterator();
Base::Vector3d current_node; Base::Vector3d current_node;
for (;aNodeIter->more();) { while (aNodeIter->more()) {
const SMDS_MeshNode* aNode = aNodeIter->next(); const SMDS_MeshNode* aNode = aNodeIter->next();
current_node.Set(aNode->X(),aNode->Y(),aNode->Z()); current_node.Set(aNode->X(),aNode->Y(),aNode->Z());
current_node = _Mtrx * current_node; current_node = _Mtrx * current_node;
@ -672,46 +672,54 @@ void FemMesh::writeABAQUS(const std::string &Filename) const
<< current_node.z << std::endl; << current_node.z << std::endl;
} }
anABAQUS_Output << "*Element, TYPE=C3D10, ELSET=Eall" << std::endl; typedef std::map<int, std::vector<int> > NodesMap;
typedef std::map<std::string, NodesMap> ElementsMap;
ElementsMap elementsMap;
SMDS_VolumeIteratorPtr aVolIter = myMesh->GetMeshDS()->volumesIterator(); SMDS_VolumeIteratorPtr aVolIter = myMesh->GetMeshDS()->volumesIterator();
while (aVolIter->more()) {
std::map<int,std::vector<int> > temp_map;
std::pair<int,std::vector<int> > apair;
temp_map.clear();
for (;aVolIter->more();)
{
const SMDS_MeshVolume* aVol = aVolIter->next(); const SMDS_MeshVolume* aVol = aVolIter->next();
//Dont ask about the order in which we have to output the SMESH structure std::pair<int, std::vector<int> > apair;
//I absolute dont understand the scheme behind it but somehow its working like this
apair.first = aVol->GetID(); apair.first = aVol->GetID();
apair.second.clear();
//Neuer Versuch int numNodes = aVol->NbNodes();
std::vector<int> ids;
// C3D4
if (numNodes == 4) {
apair.second.push_back(aVol->GetNode(0)->GetID());
apair.second.push_back(aVol->GetNode(3)->GetID());
apair.second.push_back(aVol->GetNode(1)->GetID()); apair.second.push_back(aVol->GetNode(1)->GetID());
apair.second.push_back(aVol->GetNode(2)->GetID());
elementsMap["C3D4"].insert(apair);
}
// C3D10
else if (numNodes == 10) {
apair.second.push_back(aVol->GetNode(0)->GetID()); apair.second.push_back(aVol->GetNode(0)->GetID());
apair.second.push_back(aVol->GetNode(2)->GetID()); apair.second.push_back(aVol->GetNode(2)->GetID());
apair.second.push_back(aVol->GetNode(1)->GetID());
apair.second.push_back(aVol->GetNode(3)->GetID()); apair.second.push_back(aVol->GetNode(3)->GetID());
apair.second.push_back(aVol->GetNode(4)->GetID());
apair.second.push_back(aVol->GetNode(6)->GetID()); apair.second.push_back(aVol->GetNode(6)->GetID());
apair.second.push_back(aVol->GetNode(5)->GetID()); apair.second.push_back(aVol->GetNode(5)->GetID());
apair.second.push_back(aVol->GetNode(8)->GetID()); apair.second.push_back(aVol->GetNode(4)->GetID());
apair.second.push_back(aVol->GetNode(7)->GetID()); apair.second.push_back(aVol->GetNode(7)->GetID());
apair.second.push_back(aVol->GetNode(9)->GetID()); apair.second.push_back(aVol->GetNode(9)->GetID());
apair.second.push_back(aVol->GetNode(8)->GetID());
temp_map.insert(apair); elementsMap["C3D10"].insert(apair);
}
} }
std::map<int,std::vector<int> >::iterator it_map; for (ElementsMap::iterator it = elementsMap.begin(); it != elementsMap.end(); ++it) {
std::vector<int>::iterator it_vector; anABAQUS_Output << "*Element, TYPE=" << it->first << ", ELSET=" << it->first << std::endl;
for(it_map = temp_map.begin();it_map!=temp_map.end();it_map++) for (NodesMap::iterator jt = it->second.begin(); jt != it->second.end(); ++jt) {
{ anABAQUS_Output << jt->first << ", ";
anABAQUS_Output << it_map->first << ","; for (std::vector<int>::iterator kt = jt->second.begin(); kt != jt->second.end(); ++kt) {
for(it_vector = it_map->second.begin();it_vector!=it_map->second.end();it_vector++) anABAQUS_Output << *kt << ", ";
{
anABAQUS_Output << *it_vector << ",";
} }
anABAQUS_Output << std::endl; anABAQUS_Output << std::endl;
} }
}
anABAQUS_Output.close(); anABAQUS_Output.close();
} }