LAMPCAE/src/PluginMeshDataExchange/FEMdataExchange.cpp

170 lines
4.4 KiB
C++

#include "FEMdataExchange.h"
#include "MainWindow/MainWindow.h"
#include "MeshData/meshKernal.h"
#include "MeshData/meshSet.h"
#include "MeshData/meshSingleton.h"
#include "MeshThreadBase.h"
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <string>
#include <vtkCellType.h>
#include <vtkSmartPointer.h>
#include <vtkUnstructuredGrid.h>
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<vtkPoints> vtkPoint = vtkSmartPointer<vtkPoints>::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<vtkIdList> IdList = vtkSmartPointer<vtkIdList>::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