#include "FEMdataExchange.h" #include "MainWindow/MainWindow.h" #include "MeshData/meshKernal.h" #include "MeshData/meshSet.h" #include "MeshData/meshSingleton.h" #include "MeshThreadBase.h" #include #include #include #include #include #include #include namespace MeshData { FEMdataExchange::FEMdataExchange(const QString& filename, MeshOperation operation, GUI::MainWindow* mw, int modelId) : m_fileName(filename) , m_operation(operation) , m_meshData(MeshData::getInstance()) , MeshThreadBase(filename, operation, mw) , m_modelId(modelId) { } FEMdataExchange::~FEMdataExchange() {} bool FEMdataExchange::read() { QFile file(m_fileName); int a = m_fileName.lastIndexOf('/'); int b = m_fileName.lastIndexOf('.'); int nameSize = b - a - 1; QString fileName = m_fileName.mid(a + 1, nameSize); if(!file.exists()) return false; if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) return false; QTextStream in(&file); m_grid = vtkUnstructuredGrid::New(); vtkSmartPointer vtkPoint = vtkSmartPointer::New(); while(!in.atEnd()) { QString line = in.readLine(); QStringList lineList = line.split(" "); lineList.removeAll(QString("")); if(lineList.isEmpty()) continue; if(lineList[0] == "GRID") { appendNode(lineList, vtkPoint); } else if(lineList[0] == "CTRIA3") { appendElement(lineList); } } qDebug() << Num; qDebug() << fileName; m_grid->SetPoints(vtkPoint); MeshKernal* k = new MeshKernal; k->setName(fileName); k->setPath(m_fileName); k->setMeshData(m_grid); m_meshData->appendMeshKernal(k); return true; } bool FEMdataExchange::write() { return false; } void FEMdataExchange::run() { ModuleBase::ThreadTask::run(); bool result = false; switch(m_operation) { case MESH_READ: emit showInformation(tr("Import FEM Mesh File From \"%1\"").arg(m_fileName)); result = read(); setReadResult(result); break; case MESH_WRITE: emit showInformation(tr("Export FEM Mesh File From \"%1\"").arg(m_fileName)); result = write(); setWriteResult(result); break; } defaultMeshFinished(); } void FEMdataExchange::appendNode(QStringList lineList, vtkPoints* vtkPoint) { int lineSize = lineList.size(); // qDebug() << lineList; double point[3]; switch(lineSize) { case 3: { point[0] = lineList[2].mid(0, 8).toDouble(); point[1] = lineList[2].mid(8, 8).toDouble(); point[2] = lineList[2].mid(16).toDouble(); break; } case 4: { if(lineList[2].size() > 8) { point[0] = lineList[2].mid(0, 8).toDouble(); point[1] = lineList[2].mid(8).toDouble(); point[2] = lineList[3].toDouble(); } else { point[0] = lineList[2].toDouble(); point[1] = lineList[3].mid(0, 8).toDouble(); point[2] = lineList[3].mid(8).toDouble(); } break; } case 5: { point[0] = lineList[2].toDouble(); point[1] = lineList[3].toDouble(); point[2] = lineList[4].toDouble(); break; } default: return; } // qDebug() << pointId << " " << point[0] << " " << point[1] << " " << point[2]; vtkPoint->InsertNextPoint(point); m_pointHash.insert(lineList[1].toInt(), m_pointId); m_pointId++; } void FEMdataExchange::appendElement(QStringList lineList) { if(lineList.size() < 6) return; VTKCellType cellType = VTK_EMPTY_CELL; vtkSmartPointer IdList = vtkSmartPointer::New(); elementTypeSelect(lineList[0], cellType); if(cellType == VTK_EMPTY_CELL) return; for(int i = 3; i < lineList.size(); i++) { int p = m_pointHash.value(lineList[i].toInt()); IdList->InsertNextId(p); } m_grid->InsertNextCell(cellType, IdList); } void FEMdataExchange::elementTypeSelect(QString elementName, VTKCellType& type) { if(elementName == "CTRIA3") { type = VTK_TRIANGLE; } else if(elementName == "CTRIA6") { type = VTK_QUADRATIC_TRIANGLE; } else if(elementName == "CQUAD4") { type = VTK_QUAD; } else if(elementName == "CQUAD8") { type = VTK_QUADRATIC_QUAD; } else if(elementName == "CTETRA") { type = VTK_TETRA; } else if(elementName == "c") { type = VTK_QUADRATIC_TETRA; } else if(elementName == "CHEXA") { type = VTK_HEXAHEDRON; } else if(elementName == "cc") { type = VTK_QUADRATIC_HEXAHEDRON; } } } // namespace MeshData