修正了模型保存时,可能会替换内置模型

pull/1/head
剑古敛锋 2024-07-23 10:30:50 +08:00
parent 49781f86a8
commit 8f64808f65
1 changed files with 122 additions and 150 deletions

View File

@ -22,68 +22,60 @@
#include <vtkDataSetSurfaceFilter.h> #include <vtkDataSetSurfaceFilter.h>
#include "MainWindow/MainWindow.h" #include "MainWindow/MainWindow.h"
#include "MainWindow/SubWindowManager.h" #include "MainWindow/SubWindowManager.h"
#include "Settings/BusAPI.h"
namespace MeshData {
namespace MeshData VTKdataExchange::VTKdataExchange(const QString& fileName, MeshOperation operation,
{ GUI::MainWindow* mw, int modelId)
VTKdataExchange::VTKdataExchange(const QString &fileName, MeshOperation operation, GUI::MainWindow *mw, int modelId) : MeshThreadBase(fileName, operation, mw), : MeshThreadBase(fileName, operation, mw)
_fileName(fileName), , _fileName(fileName)
_meshData(MeshData::getInstance()), , _meshData(MeshData::getInstance())
_operation(operation), , _operation(operation)
_modelId(modelId) , _modelId(modelId)
{ {
} }
bool VTKdataExchange::read() bool VTKdataExchange::read()
{ {
QFileInfo info(_fileName); QFileInfo info(_fileName);
if (!info.exists()) if(!info.exists())
return false; return false;
QString name = info.fileName(); QString name = info.fileName();
QString path = info.filePath(); QString path = info.filePath();
QString suffix = info.suffix().toLower(); QString suffix = info.suffix().toLower();
vtkDataSet *dataset = nullptr; vtkDataSet* dataset = nullptr;
if (suffix == "vtk") if(suffix == "vtk") {
{
dataset = readVTK(); dataset = readVTK();
} } else if(suffix == "stl") {
else if (suffix == "stl")
{
dataset = readSTL(); dataset = readSTL();
} } else if(suffix == "dat") {
else if (suffix == "dat")
{
dataset = readTecplot(); dataset = readTecplot();
} }
if (dataset != nullptr) if(dataset != nullptr) {
{
// 网格面片三角化 // 网格面片三角化
emit _mainwindow->printMessage(Common::Message::Normal,u8"surface triangulation ....."); // emit _mainwindow->printMessage(Common::Message::Normal,
// u8"surface triangulation .....");
// vtkSmartPointer<vtkDataSetSurfaceFilter> surfaceFilter = vtkSmartPointer<vtkDataSetSurfaceFilter>::New(); MeshKernal* k = new MeshKernal;
// surfaceFilter->SetInputData(dataset);
// surfaceFilter->Update();
// dataset = surfaceFilter->GetOutput();
MeshKernal *k = new MeshKernal;
k->setName(name); k->setName(name);
k->setPath(path); k->setPath(path);
if(QFile(path).exists()) {
QString appworkpath = Setting::BusAPI::instance()->getApplicationExePath();
if(path.contains(appworkpath)) {
QString emptyStr;
k->setPath(emptyStr);
}
}
int nKernal = _meshData->getKernalCount(); int nKernal = _meshData->getKernalCount();
for (int iKernal = 0; iKernal < nKernal; ++iKernal) for(int iKernal = 0; iKernal < nKernal; ++iKernal) {
{ if(!_threadRuning)
if (!_threadRuning)
return false; return false;
MeshKernal *temp = _meshData->getKernalAt(iKernal); MeshKernal* temp = _meshData->getKernalAt(iKernal);
if (temp->getPath() == path) if(temp->getPath() == path) { ///< MG same file update
{ ///< MG same file update
_meshData->removeKernalAt(iKernal); _meshData->removeKernalAt(iKernal);
break; break;
} }
} }
k->setMeshData(dataset); k->setMeshData(dataset);
_meshData->appendMeshKernal(k); _meshData->appendMeshKernal(k);
return true; return true;
@ -91,11 +83,11 @@ namespace MeshData
return false; return false;
} }
vtkDataSet *VTKdataExchange::readVTK() vtkDataSet* VTKdataExchange::readVTK()
{ {
if (!_threadRuning) if(!_threadRuning)
return nullptr; return nullptr;
QTextCodec *codec = QTextCodec::codecForName("GB18030"); QTextCodec* codec = QTextCodec::codecForName("GB18030");
QByteArray ba = codec->fromUnicode(_fileName); QByteArray ba = codec->fromUnicode(_fileName);
_vtkReader = vtkSmartPointer<vtkDataSetReader>::New(); _vtkReader = vtkSmartPointer<vtkDataSetReader>::New();
_vtkReader->SetFileName(ba); _vtkReader->SetFileName(ba);
@ -109,37 +101,37 @@ namespace MeshData
return dataset; return dataset;
} }
vtkDataSet *VTKdataExchange::readSTL() vtkDataSet* VTKdataExchange::readSTL()
{ {
if (!_threadRuning) if(!_threadRuning)
return nullptr; return nullptr;
QTextCodec *codec = QTextCodec::codecForName("GB18030"); QTextCodec* codec = QTextCodec::codecForName("GB18030");
QByteArray ba = codec->fromUnicode(_fileName); QByteArray ba = codec->fromUnicode(_fileName);
_stlReader = vtkSmartPointer<vtkSTLReader>::New(); _stlReader = vtkSmartPointer<vtkSTLReader>::New();
_stlReader->SetFileName(ba); _stlReader->SetFileName(_fileName.toLocal8Bit().constData());
_stlReader->SetMerging(true); // _stlReader->SetMerging(true);
_stlReader->Update(); _stlReader->Update();
return _stlReader->GetOutput(); return _stlReader->GetOutput();
} }
vtkDataSet *VTKdataExchange::readTecplot() vtkDataSet* VTKdataExchange::readTecplot()
{ {
if (!_threadRuning) if(!_threadRuning)
return nullptr; return nullptr;
QTextCodec *codec = QTextCodec::codecForName("GB18030"); QTextCodec* codec = QTextCodec::codecForName("GB18030");
QByteArray ba = codec->fromUnicode(_fileName); QByteArray ba = codec->fromUnicode(_fileName);
_tecplotReader = vtkSmartPointer<vtkTecplotReader>::New(); _tecplotReader = vtkSmartPointer<vtkTecplotReader>::New();
_tecplotReader->SetFileName(ba); _tecplotReader->SetFileName(ba);
_tecplotReader->Update(); _tecplotReader->Update();
vtkMultiBlockDataSet *mudataset = _tecplotReader->GetOutput(); vtkMultiBlockDataSet* mudataset = _tecplotReader->GetOutput();
// blockDataSet = mudataset;//add for multi zone test // blockDataSet = mudataset;//add for multi zone test
const int nblock = mudataset->GetNumberOfBlocks(); const int nblock = mudataset->GetNumberOfBlocks();
if (nblock <= 0) if(nblock <= 0)
return nullptr; return nullptr;
vtkAppendFilter *filter = vtkAppendFilter::New(); vtkAppendFilter* filter = vtkAppendFilter::New();
for (int i = 0; i < nblock; ++i) for(int i = 0; i < nblock; ++i) {
{ vtkDataSet* dataset = vtkDataSet::SafeDownCast(mudataset->GetBlock(i));
vtkDataSet *dataset = vtkDataSet::SafeDownCast(mudataset->GetBlock(i));
filter->AddInputData(dataset); filter->AddInputData(dataset);
} }
filter->Update(); // put multi zone together filter->Update(); // put multi zone together
@ -154,16 +146,11 @@ namespace MeshData
QString path = info.filePath(); QString path = info.filePath();
QString suffix = info.suffix().toLower(); QString suffix = info.suffix().toLower();
if (suffix == "vtk") if(suffix == "vtk") {
{
return writeVTK(); return writeVTK();
} } else if(suffix == "stl") {
else if (suffix == "stl")
{
return writeSTL(); return writeSTL();
} } else if(suffix == "dat") {
else if (suffix == "dat")
{
return false; return false;
} }
return false; return false;
@ -173,8 +160,7 @@ namespace MeshData
{ {
ModuleBase::ThreadTask::run(); ModuleBase::ThreadTask::run();
bool result = false; bool result = false;
switch (_operation) switch(_operation) {
{
case MESH_READ: case MESH_READ:
emit showInformation(tr("Import VTK Mesh File From \"%1\"").arg(_fileName)); emit showInformation(tr("Import VTK Mesh File From \"%1\"").arg(_fileName));
result = read(); result = read();
@ -190,40 +176,35 @@ namespace MeshData
} }
bool VTKdataExchange::writeVTK() bool VTKdataExchange::writeVTK()
{ {
QTextCodec *codec = QTextCodec::codecForName("GB18030"); QTextCodec* codec = QTextCodec::codecForName("GB18030");
QByteArray ba = codec->fromUnicode(_fileName); QByteArray ba = codec->fromUnicode(_fileName);
vtkUnstructuredGrid *ungird = vtkUnstructuredGrid::New(); vtkUnstructuredGrid* ungird = vtkUnstructuredGrid::New();
vtkSmartPointer<vtkAppendFilter> filter = vtkSmartPointer<vtkAppendFilter>::New(); vtkSmartPointer<vtkAppendFilter> filter = vtkSmartPointer<vtkAppendFilter>::New();
if (_modelId > 0) if(_modelId > 0) {
{ MeshKernal* kernal = _meshData->getKernalByID(_modelId);
MeshKernal *kernal = _meshData->getKernalByID(_modelId); if(kernal != nullptr) {
if (kernal != nullptr) vtkDataSet* dataset = kernal->getMeshData();
{ if(dataset != nullptr)
vtkDataSet *dataset = kernal->getMeshData();
if (dataset != nullptr)
filter->AddInputData(dataset); filter->AddInputData(dataset);
} }
} } else {
else
{
const int n = _meshData->getKernalCount(); const int n = _meshData->getKernalCount();
for (int i = 0; i < n; ++i) for(int i = 0; i < n; ++i) {
{ if(!_threadRuning)
if (!_threadRuning)
return false; return false;
MeshKernal *kernal = _meshData->getKernalAt(i); MeshKernal* kernal = _meshData->getKernalAt(i);
if (kernal != nullptr) if(kernal != nullptr) {
{ vtkDataSet* dataset = kernal->getMeshData();
vtkDataSet *dataset = kernal->getMeshData(); if(dataset != nullptr)
if (dataset != nullptr)
filter->AddInputData(dataset); filter->AddInputData(dataset);
} }
} }
} }
filter->Update(); filter->Update();
ungird->CopyStructure(filter->GetOutput()); // ungird->CopyStructure(filter->GetOutput());
vtkSmartPointer<vtkUnstructuredGridWriter> writer = vtkSmartPointer<vtkUnstructuredGridWriter>::New(); vtkSmartPointer<vtkUnstructuredGridWriter> writer =
writer->SetInputData(ungird); vtkSmartPointer<vtkUnstructuredGridWriter>::New();
writer->SetInputData(filter->GetOutput());
writer->SetFileTypeToBinary(); writer->SetFileTypeToBinary();
writer->SetFileName(_fileName.toLocal8Bit().constData()); writer->SetFileName(_fileName.toLocal8Bit().constData());
writer->Write(); writer->Write();
@ -232,67 +213,58 @@ namespace MeshData
bool VTKdataExchange::writeSTL() bool VTKdataExchange::writeSTL()
{ {
QFile infile(_fileName); QFile infile(_fileName);
if(infile.exists()){ if(infile.exists()) {
infile.remove(); infile.remove();
} }
qDebug()<<" VTKdataExchange::writeSTL start "; qDebug() << " VTKdataExchange::writeSTL start ";
QTextCodec *codec = QTextCodec::codecForName("GB18030"); QTextCodec* codec = QTextCodec::codecForName("GB18030");
QByteArray ba = codec->fromUnicode(_fileName); QByteArray ba = codec->fromUnicode(_fileName);
vtkUnstructuredGrid *ungird = vtkUnstructuredGrid::New(); vtkSmartPointer<vtkGeometryFilter> cellToPointFilter =
// vtkSmartPointer<vtkAppendFilter> filter = vtkSmartPointer<vtkAppendFilter>::New(); vtkSmartPointer<vtkGeometryFilter>::New();
vtkSmartPointer<vtkGeometryFilter> cellToPointFilter = vtkSmartPointer<vtkGeometryFilter>::New(); if(_modelId > 0) {
if (_modelId > 0) MeshKernal* kernal = _meshData->getKernalByID(_modelId);
{ if(kernal != nullptr) {
MeshKernal *kernal = _meshData->getKernalByID(_modelId); vtkDataSet* dataset = kernal->getMeshData();
if (kernal != nullptr) if(dataset != nullptr) {
{
vtkDataSet *dataset = kernal->getMeshData();
if (dataset != nullptr)
cellToPointFilter->AddInputData(dataset); cellToPointFilter->AddInputData(dataset);
} }
} }
else } else {
{
const int n = _meshData->getKernalCount(); const int n = _meshData->getKernalCount();
for (int i = 0; i < n; ++i) for(int i = 0; i < n; ++i) {
{ if(!_threadRuning)
if (!_threadRuning)
return false; return false;
MeshKernal *kernal = _meshData->getKernalAt(i); MeshKernal* kernal = _meshData->getKernalAt(i);
if (kernal != nullptr) if(kernal != nullptr) {
{ vtkDataSet* dataset = kernal->getMeshData();
vtkDataSet *dataset = kernal->getMeshData(); if(dataset != nullptr)
if (dataset != nullptr)
cellToPointFilter->AddInputData(dataset); cellToPointFilter->AddInputData(dataset);
} }
} }
} }
cellToPointFilter->Update(); cellToPointFilter->Update();
// ungird->CopyStructure(filter->GetOutput()); vtkSmartPointer<vtkPolyData> inpolyData = vtkSmartPointer<vtkPolyData>::New();
// qDebug()<<"ungird , cell Count : "+QString::number(ungird->GetNumberOfCells());
vtkSmartPointer<vtkPolyData> inpolyData=vtkSmartPointer<vtkPolyData>::New();
inpolyData = cellToPointFilter->GetOutput(); inpolyData = cellToPointFilter->GetOutput();
if(nullptr==inpolyData){ if(nullptr == inpolyData) {
qDebug()<<"inpolyData ,nullptr : "; qDebug() << "inpolyData ,nullptr : ";
}else{ } else {
qDebug()<<"inpolyData , cell Count : "+QString::number(inpolyData->GetNumberOfCells()); qDebug() << "inpolyData , cell Count : "
+ QString::number(inpolyData->GetNumberOfCells());
} }
vtkSmartPointer<vtkSTLWriter> writer = vtkSmartPointer<vtkSTLWriter>::New(); vtkSmartPointer<vtkSTLWriter> writer = vtkSmartPointer<vtkSTLWriter>::New();
writer->SetInputConnection(cellToPointFilter->GetOutputPort()); writer->SetInputConnection(cellToPointFilter->GetOutputPort());
// writer->SetInputData(ungird);
writer->SetFileTypeToBinary(); writer->SetFileTypeToBinary();
writer->SetFileName(_fileName.toLocal8Bit().constData()); writer->SetFileName(_fileName.toLocal8Bit().constData());
writer->Write(); writer->Write();
qDebug()<<" VTKdataExchange::writeSTL finish !!!! "+ba; qDebug() << " VTKdataExchange::writeSTL finish !!!! " + ba;
QFile outfile(_fileName); QFile outfile(_fileName);
return outfile.exists();// 判断文件是否存在 return outfile.exists(); // 判断文件是否存在
return true; return true;
} }
bool VTKdataExchange::writeTecplot() bool VTKdataExchange::writeTecplot()
{ {
return false; return false;
} }
} } // namespace MeshData