#include "KEYdataExchange.h" #include "meshDataExchangePlugin.h" #include "MeshData/meshSingleton.h" #include "MeshData/meshKernal.h" #include "MeshData/meshSet.h" #include #include #include #include #include #include #include namespace MeshData { KEYdataExchange::KEYdataExchange(const QString &fileName, MeshOperation operation, GUI::MainWindow *mw, int modelId) : _meshData(MeshData::getInstance()), _operation(operation), _fileName(fileName), _stream(nullptr), MeshThreadBase(fileName, operation, mw), _modelId(modelId) { } KEYdataExchange::~KEYdataExchange() { if (_stream != nullptr) { delete _stream; _stream = nullptr; } } void KEYdataExchange::run() { ModuleBase::ThreadTask::run(); bool result = false; switch (_operation) { case MESH_READ: emit showInformation(tr("Import KEY Mesh File From \"%1\"").arg(_fileName)); result = read(); setReadResult(result); break; case MESH_WRITE: emit showInformation(tr("Export KEY Mesh File From \"%1\"").arg(_fileName)); result = write(); setWriteResult(result); break; } defaultMeshFinished(); } bool KEYdataExchange::read() { QFile file(_fileName); if (!file.open(QIODevice::ReadOnly)) return false; _stream = new QTextStream(&file); QString aLine{}; vtkSmartPointer grid = vtkSmartPointer::New(); auto mk = new MeshKernal; mk->setMeshData(grid); const int mkID = mk->getID(); while (!_stream->atEnd()) { if (!_threadRuning) return false; readLine(aLine); if (aLine.startsWith("*NODE")) readNodes(grid, aLine); else if (aLine.startsWith("*ELEMENT_SOLID")) readElements(grid, aLine, mkID); else if (aLine.startsWith("*SET_NODE_LIST")) readNodesGroup(mkID, aLine); } if (grid->GetNumberOfPoints() < 1 || grid->GetNumberOfCells() < 1) return false; mk->setName(QString("KEY_%1").arg(mkID)); mk->setPath(_fileName); mk->appendProperty("Points", (int)grid->GetNumberOfPoints()); mk->appendProperty("Cells", (int)grid->GetNumberOfCells()); _meshData->appendMeshKernal(mk); _meshData->generateDisplayDataSet(); file.close(); return true; } bool KEYdataExchange::readNodes(vtkSmartPointer grid, QString &aLine) { vtkSmartPointer points = vtkSmartPointer::New(); while (!_stream->atEnd()) { if (!_threadRuning) return false; readLine(aLine); if (aLine.startsWith("$")) break; if (aLine.size() < 56) continue; int nodeID = aLine.mid(0, 8).toInt(); double nodeX = aLine.mid(8, 16).toDouble(); double nodeY = aLine.mid(24, 16).toDouble(); double nodeZ = aLine.mid(40, 16).toDouble(); QStringList lineList = aLine.split(' '); points->InsertNextPoint(nodeX, nodeY, nodeZ); } grid->SetPoints(points); return true; } bool KEYdataExchange::readElements(vtkSmartPointer grid, QString &aLine, int mkId) { while (!_stream->atEnd()) { if (!_threadRuning) return false; readLine(aLine); if (aLine.startsWith("$") || aLine.startsWith("*")) break; setGridCells(grid, aLine, mkId); } return true; } bool KEYdataExchange::readNodesGroup(const int mkID, QString &aLine) { MeshSet *ms = new MeshSet("", Node); if (ms == nullptr) return false; _meshData->appendMeshSet(ms); readLine(aLine); QStringList list = aLine.simplified().split(" "); int setID = list.at(0).toInt(); ms->setName(QString("NodeSet_%1").arg(setID)); ms->appendProperty("K_ID", setID); while (!_stream->atEnd()) { if (!_threadRuning) return false; readLine(aLine); if (aLine.startsWith("*") || aLine.startsWith("$")) break; QStringList lineList = aLine.simplified().split(' '); for (QString str : lineList) { int cellIndex = str.toInt() - 1; ms->appendMember(mkID, cellIndex); } } return true; } void KEYdataExchange::setGridCells(vtkSmartPointer grid, QString &aLine, int mKid) { QMap> cells{}; while (!_stream->atEnd()) { if (!_threadRuning) return; if (aLine.startsWith("$") || aLine.startsWith("*")) break; QStringList lineList = aLine.simplified().split(" "); int elementID = lineList.at(0).toInt(); int cellID = lineList.at(1).toInt(); cells[cellID].append(elementID - 1); int numOfPonits = lineList.size() - 2; switch (numOfPonits) { case 8: { vtkSmartPointer aHexahedronCell = vtkSmartPointer::New(); aHexahedronCell->GetPointIds()->SetId(0, lineList.at(2).toInt() - 1); aHexahedronCell->GetPointIds()->SetId(1, lineList.at(3).toInt() - 1); aHexahedronCell->GetPointIds()->SetId(2, lineList.at(4).toInt() - 1); aHexahedronCell->GetPointIds()->SetId(3, lineList.at(5).toInt() - 1); aHexahedronCell->GetPointIds()->SetId(4, lineList.at(6).toInt() - 1); aHexahedronCell->GetPointIds()->SetId(5, lineList.at(7).toInt() - 1); aHexahedronCell->GetPointIds()->SetId(6, lineList.at(8).toInt() - 1); aHexahedronCell->GetPointIds()->SetId(7, lineList.at(9).toInt() - 1); grid->InsertNextCell(aHexahedronCell->GetCellType(), aHexahedronCell->GetPointIds()); } break; case 4: { vtkSmartPointer aTetraCell = vtkSmartPointer::New(); aTetraCell->GetPointIds()->SetId(0, lineList.at(2).toInt() - 1); aTetraCell->GetPointIds()->SetId(1, lineList.at(3).toInt() - 1); aTetraCell->GetPointIds()->SetId(2, lineList.at(4).toInt() - 1); aTetraCell->GetPointIds()->SetId(3, lineList.at(5).toInt() - 1); grid->InsertNextCell(aTetraCell->GetCellType(), aTetraCell->GetPointIds()); } break; case 10: { vtkSmartPointer aQTetraCell = vtkSmartPointer::New(); aQTetraCell->GetPointIds()->SetId(0, lineList.at(2).toInt() - 1); aQTetraCell->GetPointIds()->SetId(1, lineList.at(3).toInt() - 1); aQTetraCell->GetPointIds()->SetId(2, lineList.at(4).toInt() - 1); aQTetraCell->GetPointIds()->SetId(3, lineList.at(5).toInt() - 1); aQTetraCell->GetPointIds()->SetId(4, lineList.at(6).toInt() - 1); aQTetraCell->GetPointIds()->SetId(5, lineList.at(7).toInt() - 1); aQTetraCell->GetPointIds()->SetId(6, lineList.at(8).toInt() - 1); aQTetraCell->GetPointIds()->SetId(7, lineList.at(9).toInt() - 1); aQTetraCell->GetPointIds()->SetId(8, lineList.at(10).toInt() - 1); aQTetraCell->GetPointIds()->SetId(9, lineList.at(11).toInt() - 1); grid->InsertNextCell(aQTetraCell->GetCellType(), aQTetraCell->GetPointIds()); } break; case 20: { vtkSmartPointer aQHexCell = vtkSmartPointer::New(); aQHexCell->GetPointIds()->SetId(0, lineList.at(2).toInt() - 1); aQHexCell->GetPointIds()->SetId(1, lineList.at(3).toInt() - 1); aQHexCell->GetPointIds()->SetId(2, lineList.at(4).toInt() - 1); aQHexCell->GetPointIds()->SetId(3, lineList.at(5).toInt() - 1); aQHexCell->GetPointIds()->SetId(4, lineList.at(6).toInt() - 1); aQHexCell->GetPointIds()->SetId(5, lineList.at(7).toInt() - 1); aQHexCell->GetPointIds()->SetId(6, lineList.at(8).toInt() - 1); aQHexCell->GetPointIds()->SetId(7, lineList.at(9).toInt() - 1); aQHexCell->GetPointIds()->SetId(8, lineList.at(10).toInt() - 1); aQHexCell->GetPointIds()->SetId(9, lineList.at(11).toInt() - 1); aQHexCell->GetPointIds()->SetId(10, lineList.at(12).toInt() - 1); aQHexCell->GetPointIds()->SetId(11, lineList.at(13).toInt() - 1); aQHexCell->GetPointIds()->SetId(12, lineList.at(14).toInt() - 1); aQHexCell->GetPointIds()->SetId(13, lineList.at(15).toInt() - 1); aQHexCell->GetPointIds()->SetId(14, lineList.at(16).toInt() - 1); aQHexCell->GetPointIds()->SetId(15, lineList.at(17).toInt() - 1); aQHexCell->GetPointIds()->SetId(16, lineList.at(18).toInt() - 1); aQHexCell->GetPointIds()->SetId(17, lineList.at(19).toInt() - 1); aQHexCell->GetPointIds()->SetId(18, lineList.at(20).toInt() - 1); aQHexCell->GetPointIds()->SetId(19, lineList.at(21).toInt() - 1); grid->InsertNextCell(aQHexCell->GetCellType(), aQHexCell->GetPointIds()); } break; default: break; } readLine(aLine); } QMapIterator> it(cells); while (it.hasNext()) { it.next(); const int id = it.key(); MeshSet *ms = new MeshSet("", Element); for (auto &id : it.value()) { ms->appendMember(mKid, id); } _meshData->appendMeshSet(ms); ms->setName(QString("CellSet_%1").arg(id)); ms->appendProperty("K_ID", id); } } void KEYdataExchange::readLine(QString &aLine) { while (_threadRuning) { if (_stream->atEnd()) { //_threadRuning = false; break; } aLine = _stream->readLine(); if (aLine.isEmpty()) continue; break; } } bool KEYdataExchange::write() { // if (_modelId < 1) return false; QFile file(_fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; _stream = new QTextStream(&file); int a = _meshData->getKernalCount(); auto mk = _meshData->getKernalByID(_modelId); //_meshData-> auto grid = mk->getMeshData(); // vtkUnstructuredGrid* grid = dynamic_cast(mk->getMeshData()); // writePointPart(grid); // writeCellPart(grid); writeMeshPart(); file.close(); return true; } bool KEYdataExchange::writePointPart(vtkDataSet *grid) { int index{0}; int numOfPoint = grid->GetNumberOfPoints(); *_stream << QString(" NODES %1").arg(numOfPoint) << endl << endl; while (index < numOfPoint) { if (!_threadRuning) return false; double *array = grid->GetPoint(index); index++; *_stream << QString(" %1 %2 %3 %4").arg(index).arg(array[0]).arg(array[1]).arg(array[2]) << endl; } return true; } bool KEYdataExchange::writeCellPart(vtkDataSet *grid) { int index{0}, hexahedronCount{0}; int numOfCell = grid->GetNumberOfCells(); *_stream << QString(" ELEMENTS %1").arg(numOfCell) << endl << endl; while (index < numOfCell) { if (!_threadRuning) return false; vtkCell *cell = grid->GetCell(index); if (cell == nullptr) continue; if (cell->GetCellType() == VTK_HEXAHEDRON) { hexahedronCount++; vtkIdList *PointIdIndexs = cell->GetPointIds(); *_stream << QString(" %1 %2 %3 %4 %5 %6 %7 %8 %9").arg(hexahedronCount).arg(PointIdIndexs->GetId(0) + 1).arg(PointIdIndexs->GetId(1) + 1).arg(PointIdIndexs->GetId(2) + 1).arg(PointIdIndexs->GetId(3) + 1).arg(PointIdIndexs->GetId(4) + 1).arg(PointIdIndexs->GetId(5) + 1).arg(PointIdIndexs->GetId(6) + 1).arg(PointIdIndexs->GetId(7) + 1) << endl; } index++; } return false; } bool KEYdataExchange::writeMeshPart() { QList setIds = _meshData->getSetIDFromKernal(_modelId); for (int setId : setIds) { auto ms = _meshData->getMeshSetByID(setId); } return false; } }