LAMPCAE/src/PluginMeshDataExchange/FEMdataExchange.cpp

196 lines
4.3 KiB
C++
Raw Normal View History

2023-05-08 06:32:41 +00:00
#include "meshData/meshSingleton.h"
#include "meshData/meshKernal.h"
#include "meshData/meshSet.h"
#include "mainWindow/mainWindow.h"
#include "FEMdataExchange.h"
#include "MeshThreadBase.h"
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <string>
#include <vtkUnstructuredGrid.h>
#include <vtkSmartPointer.h>
#include <vtkCellType.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;
}
}
}