comac_desk_app/PostProcessing/ThreeDimensionDiagraph.cpp

1163 lines
46 KiB
C++
Raw Permalink Normal View History

2024-11-21 11:50:43 +08:00
#include "ThreeDimensionDiagraph.h"
#include "ui_ThreeDimensionDiagraph.h"
#include <QFileDialog>
#include <vtkLightKit.h>
#include <vtkAxesActor.h>
#include <vtkRenderer.h>
#include <vtksys/SystemTools.hxx>
#include <vtkOrientationMarkerWidget.h>
#include <vtkPlaneWidget.h>
#include <vtkPlane.h>
#include <vtkDataSet.h>
#include <vtkUnstructuredGrid.h>
#include <vtkStructuredGrid.h>
#include <vtkPolyData.h>
#include <vtkMapper.h>
#include <vtkPolyDataMapper.h>
#include <vtkPointSet.h>
#include <vtkPropAssembly.h>
#include <vtkCubeAxesActor.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <WidgetCutter.h>
#include <UnstructuredGridReader.h>
#include <vtkTextProperty.h>
#include <vtkCutter.h>
#include <vtkUnstructuredGrid.h>
#include <vtkCamera.h>
#include <vtkCellData.h>
#include <MutiVTKFilesReader.h>
#include <vtkLookupTable.h>
#include <vtkPointData.h>
#include <vtkDataSetMapper.h>
#include <vtkScalarBarActor.h>
#include <vtkScalarBarWidget.h>
#include <vtkProperty.h>
#include <vtkScalarBarRepresentation.h>
#include <vtkDelimitedTextReader.h>
#include <vtkRenderWindowInteractor.h>
#include <CommonFunction.h>
#include "DelimitedTextReader.h"
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkSphereSource.h>
#include "FarFieldDataGenerator.h"
#include "NearFieldDataGenerator.h"
#include "PostTools.h"
namespace pst
{
ThreeDimensionDiagraph::ThreeDimensionDiagraph(QWidget* parent)
: PostWindowBase(parent/*, caseID*//*, BaseModule::GraphWindowType::Post3dDrawing*/)
, ui(new Ui::ThreeDimensionDiagraph())
, m_dataType(-1)
, m_renderWindow3D(vtkSmartPointer<vtkGenericOpenGLRenderWindow> ::New())
//, m_fieldGraphGenerator(std::shared_ptr<pst::FieldGraphGenerator>(new pst::FieldGraphGenerator()))
, m_mutiReader(std::shared_ptr<pst::MutiVTKFilesReader>(new pst::MutiVTKFilesReader()))
, m_widgetCutter(std::shared_ptr<pst::WidgetCutter>(new pst::WidgetCutter()))
, m_render3D(vtkSmartPointer<vtkRenderer>::New())
, m_leftDownCornerAxes(vtkSmartPointer<vtkAxesActor>::New())
, m_leftDownCornerWidget(vtkSmartPointer<vtkOrientationMarkerWidget>::New())
//, m_viewResultDataID(viewResultDataID)
, m_interactor(vtkSmartPointer<vtkRenderWindowInteractor>::New())
//, m_caseID(caseID)
//, m_iD(typeInnerID)
, m_dataSet{ nullptr /*vtkSmartPointer< vtkDataSet>::New() */ }
, m_dataMapper{ vtkSmartPointer<vtkDataSetMapper>::New() }
, m_dataActor{ vtkSmartPointer<vtkActor>::New() }
, m_lookupTable{ vtkSmartPointer<vtkLookupTable>::New() }
, m_scalarBarActor{ vtkSmartPointer<vtkScalarBarActor>::New() }
, m_scalarBarWidget{ vtkSmartPointer<vtkScalarBarWidget>::New() }
, m_delimitedTextReader{ vtkSmartPointer<vtkDelimitedTextReader>::New() }
, m_farFieldDataGenerator{ new FarFieldDataGenerator() }
, m_nearFieldDataGenerator{ new NearFieldDataGenerator() }
//, m_fileName{ fileName }
, m_filePathToRead{ }
, m_isReadDataSuc{ false }
, m_scalarBarTitle{ }
, m_isCutterAdded{ false }
, m_cutterInputData{ nullptr }
, m_emptyData(vtkSmartPointer<vtkPolyData>::New())
, m_shouldLogTheData(false)
, m_shouldNormalizeTheData(false)
, m_logDefautFactory{ 1. }
, m_logDataRRange{ 0,1 }
, m_originalRRange{ 0,1 }
{
ui->setupUi(this);
this->ui->qvtkWidget->setRenderWindow(m_renderWindow3D);
m_renderWindow3D->AddRenderer(m_render3D);
m_render3D->GetActiveCamera()->SetParallelProjection(true);
m_render3D->AutomaticLightCreationOff();
m_render3D->SetUseDepthPeeling(1);
vtkNew<vtkLightKit> lightKit;
lightKit->AddLightsToRenderer(m_render3D);
lightKit->SetKeyLightWarmth(0.5);
lightKit->SetFillLightWarmth(0.5);
lightKit->SetBackLightWarmth(0.5);
lightKit->SetHeadLightWarmth(0.5);
//m_dataMapper->SetInputData(m_emptyData);
m_dataActor->SetMapper(m_dataMapper);
initUI();
InitDefaultLookupTable();
initScalarBarPipeLine();
//checkDataType(fileName);
//importPreProcessWindowData();
/* if (!isNew)
{
auto m_curCaseModel = ProjectManager::CaseModelManager::getinstance()->getCurrentCase();
if (m_curCaseModel == nullptr)
{
BaseModule::MessageBoxButton bt;
emit IBaseSignalInstance->signal_showMessageDialog(QObject::tr("ERROR"),
QObject::tr("Get case model failed!"), BaseModule::MessageBoxType::Error, bt);
}
m_gain3DData = m_curCaseModel->getMOMDataManager()->getMOMSimulationData()->getThreeDimensionDataByID(m_iD).get();
if (m_gain3DData == nullptr)
{
BaseModule::MessageBoxButton bt;
emit IBaseSignalInstance->signal_showMessageDialog(QObject::tr("ERROR"),
QObject::tr("Get data manager Failed!"), BaseModule::MessageBoxType::Error, bt);
}
else
{
readDataFromDataManager();
restoreLogic();
}
}
auto iBaseSignal = IBaseSignalInstance;
connect(iBaseSignal, &BaseModule::IBaseSignal::signal_refreshResultWindowTitle, this, &ThreeDimensionDiagraph::slot_refreshWindowTitle);*/
vtkNew<vtkAxesActor> axes;
axes->SetOrigin(0, 0, 0);
axes->SetTotalLength(0.2, 0.2, 0.2);
m_render3D->AddActor(axes);
vtkNew<vtkSphereSource> sphereSource;
sphereSource->SetRadius(0.15);
sphereSource->Update();
vtkNew<vtkPolyDataMapper> sphereMapper;
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
vtkNew<vtkActor> sphereActor;
sphereActor->SetMapper(sphereMapper);
m_render3D->AddActor(sphereActor);
m_renderWindow3D->Render();
}
ThreeDimensionDiagraph::~ThreeDimensionDiagraph()
{
if (m_isReadDataSuc)
{
//writeMOMData();
}
delete ui;
delete m_farFieldDataGenerator; m_farFieldDataGenerator = nullptr;
delete m_nearFieldDataGenerator; m_nearFieldDataGenerator = nullptr;
//emit this->windowClosed(m_caseID, m_viewResultDataID);
}
bool ThreeDimensionDiagraph::ReadFieldData(QString filePath)
{
m_mutiReader->SetFileName(filePath);
if (!m_mutiReader->Update())
{
return false;
}
auto data = m_mutiReader->GetOutput();
auto cellArraysNum = data->GetCellData()->GetNumberOfArrays();
if (cellArraysNum > 0)
{
data->GetCellData()->SetActiveAttribute(0, vtkDataSetAttributes::AttributeTypes::SCALARS);
m_scalarBarAutoDataRange[0] = data->GetCellData()->GetArray(0)->GetRange()[0];
m_scalarBarAutoDataRange[1] = data->GetCellData()->GetArray(0)->GetRange()[1];
}
return true;
}
QString ThreeDimensionDiagraph::generateFilePath(const QString& fileName, int index)
{
//auto caseModel = ProjectManager::CaseModelManager::getinstance()->getModelByID(m_caseID);
//if (!caseModel)
//{
// return QString();
//}
//std::vector<std::string> tempRes;
//pst::CommonFunction::Stringsplit(fileName.toStdString(), ".", tempRes);
//if (tempRes.size() != 2)
//{
// std::cout << "Stringsplit first 1 column error!" << std::endl;
// return false;
//}
//m_scalarBarTitle = QString::fromStdString(tempRes[0]);
//auto newFileName = QString::fromStdString(tempRes[0] + "_" + std::to_string(index) + "." + tempRes[1]);
//auto filePath = (caseModel->getCaseDir() + "/" + newFileName);
//return filePath;
return QString();
}
QList<QString> ThreeDimensionDiagraph::getFreqFromSetting()
{
QList<QString> freqList;
//auto simulationData = ProjectManager::CaseModelManager::getinstance()->getCurrentCase()->getMOMDataManager()->getMOMSimulationData();
//auto m_solverSet = QSharedPointer<DataModel::SimulationMOMSolveSettingsData>(new DataModel::SimulationMOMSolveSettingsData(*simulationData->getSolveSettingsData()));
//m_solverSet->getFreqUnit();
//m_solverSet->getSweepFrequencyUnit();
//bool _isSweep = m_solverSet->getBSweepFreq();
//if (!_isSweep)//单频
//{
// freqList.append(QString::number(m_solverSet->getFreqValue()));
//}
//else//扫频
//{
// auto startFreq = m_solverSet->getStartFrequencyValue();
// auto endFreq = m_solverSet->getEndFrequencyValue();
// auto step = m_solverSet->getStepFrequencyValue();
// int num = (int)std::abs((endFreq - startFreq) / step) + 1;
// for (int i = 0; i < num; i++)
// {
// freqList.append(QString::number(startFreq + i * step));
// }
//}
return freqList;
}
void ThreeDimensionDiagraph::initUI()
{
//slot_refreshWindowTitle(m_caseID, (int)BaseModule::ResultType::ResultThreeDimensionGraph, m_viewResultDataID);
ui->splitter->setStretchFactor(0, 8);
ui->splitter->setStretchFactor(1, 1);
//设置频率下拉列表
auto freqList = getFreqFromSetting();
for (auto i : freqList)
{
ui->comboBoxFrequency->addItem(i);
}
for (int i = 1; i < 50; ++i)
{
ui->comboBoxSBFontSize->addItem(QString::number(i));
}
ui->comboBoxSBFontSize->setCurrentIndex(23);
ui->comboBoxSBTitleColor->setShowColorName(false);
ui->comboBoxSBTitleColor->appendPredefinedColors();
//切片方向
ui->comboBox_sliceDirection->addItem("X");
ui->comboBox_sliceDirection->addItem("Y");
ui->comboBox_sliceDirection->addItem("Z");
//切片位置
generateSlicePosition(0);
activeButtonAfterReadData();
}
void ThreeDimensionDiagraph::checkDataType(const QString& fileName)
{
//根据文件名判断类型
//远场
if (fileName == "RCSFile.txt" || fileName == "GainDirectionFile.txt" || fileName == "monostatic_RCSFile.txt")
{
m_dataType = 0;
}
//近场
else if (fileName == "MagneticField.txt" || fileName == "ElectricField.txt")
{
m_dataType = 1;
}
//表面电流
else if (fileName == "SurfaceCurrentDensity.vtk")
{
m_dataType = 2;
}
}
void ThreeDimensionDiagraph::decideLogFactory()
{
}
void ThreeDimensionDiagraph::setLogNormalButtonState(bool state)
{
if (m_dataType == 0 || m_dataType == 1)//远场或者近场
{
ui->checkBox_normalization->setEnabled(state);
ui->checkBox_logarithm->setEnabled(state);
}
}
void ThreeDimensionDiagraph::setSlicePositionButtonState()
{
if (m_dataType == 1)
{
ui->comboBox_slicePosition->setEnabled(true);
}
else
{
ui->comboBox_slicePosition->setEnabled(false);
}
}
bool ThreeDimensionDiagraph::readData(const QString& filePath)
{
//远场
//远场
//远场
if (m_dataType == 0)
{
m_isReadDataSuc = readerDelimitedTextFromLocal(filePath);
//if (!m_isReadDataSuc)
//{
// BaseModule::MessageBoxButton bt;
// emit IBaseSignalInstance->signal_showMessageDialog(QObject::tr("ERROR"),
// QObject::tr("Data Illegal!"), BaseModule::MessageBoxType::Error, bt);
// return false;
//}
//m_farFieldDataGenerator->setInputData(m_delimitedTextReader->GetOutput());
//auto suc = m_farFieldDataGenerator->update();
//if (!suc)
//{
// BaseModule::MessageBoxButton bt;
// emit IBaseSignalInstance->signal_showMessageDialog(QObject::tr("ERROR"),
// QObject::tr("Data Illegal!"), BaseModule::MessageBoxType::Error, bt);
// m_isReadDataSuc = false;
// return false;
//}
m_dataSet = m_farFieldDataGenerator->getOutputData(); //structuredGrid
m_scalarBarAutoDataRange[0] = m_dataSet->GetPointData()->GetArray(0)->GetRange()[0];
m_scalarBarAutoDataRange[1] = m_dataSet->GetPointData()->GetArray(0)->GetRange()[1];
}
//近场
//近场
//近场
else if (m_dataType == 1)
{
m_isReadDataSuc = readerDelimitedTextFromLocal(filePath);
if (!m_isReadDataSuc)
{
//BaseModule::MessageBoxButton bt;
//emit IBaseSignalInstance->signal_showMessageDialog(QObject::tr("ERROR"),
// QObject::tr("Data Illegal!"), BaseModule::MessageBoxType::Error, bt);
//return false;
}
m_nearFieldDataGenerator->setInputData(m_delimitedTextReader->GetOutput());
//auto _currentCaseModel = ProjectManager::CaseModelManager::getinstance()->getCurrentCase();
//auto _nearFieldCoordinate = _currentCaseModel->getMOMDataManager()->getMOMSimulationData()->getNearFieldCoordinateData();
//int numX = 0;
//int numY = 0;
//int numZ = 0;
//if (!qFuzzyCompare(0., _nearFieldCoordinate->getStepX()))
//{
// numX = (_nearFieldCoordinate->getEndX() - _nearFieldCoordinate->getStartX()) / _nearFieldCoordinate->getStepX();
//}
//if (!qFuzzyCompare(0., _nearFieldCoordinate->getStepY()))
//{
// numY = (_nearFieldCoordinate->getEndY() - _nearFieldCoordinate->getStartY()) / _nearFieldCoordinate->getStepY();
//}
//if (!qFuzzyCompare(0., _nearFieldCoordinate->getStepZ()))
//{
// numZ = (_nearFieldCoordinate->getEndZ() - _nearFieldCoordinate->getStartZ()) / _nearFieldCoordinate->getStepZ();
//}
//m_nearFieldDataGenerator->setTableExtends(numX, numY, numZ);
//m_nearFieldDataGenerator->update();
m_dataSet = m_nearFieldDataGenerator->getOutputData(); //structuredGrid
if (m_dataSet == nullptr || m_dataSet->GetPointData() == nullptr || m_dataSet->GetPointData()->GetArray(0) == nullptr)
{
//BaseModule::MessageBoxButton bt;
//emit IBaseSignalInstance->signal_showMessageDialog(QObject::tr("ERROR"),
// QObject::tr("Data Illegal!"), BaseModule::MessageBoxType::Error, bt);
//m_isReadDataSuc = false;
//return false;
}
m_scalarBarAutoDataRange[0] = m_dataSet->GetPointData()->GetArray(0)->GetRange()[0];
m_scalarBarAutoDataRange[1] = m_dataSet->GetPointData()->GetArray(0)->GetRange()[1];
}
//表面流场
//表面流场
//表面流场
else if (m_dataType == 2)
{
m_isReadDataSuc = ReadFieldData(filePath);
if (!m_isReadDataSuc)
{
//BaseModule::MessageBoxButton bt;
//emit IBaseSignalInstance->signal_showMessageDialog(QObject::tr("ERROR"),
// QObject::tr("Data Illegal!"), BaseModule::MessageBoxType::Error, bt);
//m_isReadDataSuc = false;
//return false;
}
m_dataSet = m_mutiReader->GetOutput();
}
m_originalRRange[0] = m_scalarBarAutoDataRange[0];
m_originalRRange[1] = m_scalarBarAutoDataRange[1];
setScalarBarRange();
ui->lineEditSBTitleString->setText(m_scalarBarTitle.toStdString().c_str());
m_scalarBarActor->SetTitle(m_scalarBarTitle.toStdString().c_str());
m_scalarBarActor->SetUnconstrainedFontSize(true);
generateResultActor();
m_render3D->AddActor(m_dataActor);
m_render3D->AddActor(m_scalarBarActor);
m_render3D->ResetCamera();
m_renderWindow3D->Render();
return true;
}
void ThreeDimensionDiagraph::generateResultActor()
{
m_dataMapper->SetInputData(m_dataSet);
m_dataMapper->SetLookupTable(m_lookupTable);
m_dataMapper->SetInterpolateScalarsBeforeMapping(true);
m_dataMapper->SetUseLookupTableScalarRange(1);
m_dataMapper->ScalarVisibilityOn();
}
void ThreeDimensionDiagraph::InitDefaultLookupTable()
{
m_lookupTable->SetNumberOfColors(150);
m_lookupTable->SetHueRange(0.67, 0.0);
m_lookupTable->Build();
}
void ThreeDimensionDiagraph::initScalarBarPipeLine()
{
//m_scalarBarActor->SetTitle("Gain");
m_scalarBarActor->SetBarRatio(0.25);
m_scalarBarActor->GetTitleTextProperty()->SetJustificationToLeft();
m_scalarBarActor->SetPosition(0.9, 0.1);
m_scalarBarActor->SetPosition2(0.05, 0.7);
m_scalarBarActor->SetNumberOfLabels(10);
m_scalarBarActor->SetLookupTable(m_lookupTable);
m_scalarBarWidget->SetScalarBarActor(m_scalarBarActor);
vtkScalarBarRepresentation* rep =
vtkScalarBarRepresentation::SafeDownCast(m_scalarBarWidget->GetRepresentation());
rep->SetPosition(0.9, 0.1);
rep->SetPosition2(0.05, 0.7);
m_scalarBarWidget->SetInteractor(m_renderWindow3D->GetInteractor());
m_scalarBarWidget->On();
}
void ThreeDimensionDiagraph::activeButtonAfterReadData()
{
setLogNormalButtonState(m_isReadDataSuc);
ui->pb_exportData->setEnabled(m_isReadDataSuc);
ui->tabWidget->setTabEnabled(1, m_isReadDataSuc);
ui->tabWidget->setTabEnabled(2, m_isReadDataSuc);
}
void ThreeDimensionDiagraph::generateSlicePosition(int index)
{
ui->comboBox_slicePosition->clear();
if (m_dataType != 1) //只有近场有切片位置选项
{
return;
}
//auto _currentCaseModel = ProjectManager::CaseModelManager::getinstance()->getCurrentCase();
//auto _nearFieldCoordinate = _currentCaseModel->getMOMDataManager()->getMOMSimulationData()->getNearFieldCoordinateData();
////根据带求解项计算
//if (index == 0) //x
//{
// int num = (_nearFieldCoordinate->getEndX() - _nearFieldCoordinate->getStartX()) / _nearFieldCoordinate->getStepX() + 1;
// for (int i = 0; i < num; ++i)
// {
// ui->comboBox_slicePosition->addItem(
// QString::number(_nearFieldCoordinate->getStartX() + i * _nearFieldCoordinate->getStepX()));
// }
//}
//else if (index == 1)
//{
// int num = (_nearFieldCoordinate->getEndY() - _nearFieldCoordinate->getStartY()) / _nearFieldCoordinate->getStepY() + 1;
// for (int i = 0; i < num; ++i)
// {
// ui->comboBox_slicePosition->addItem(
// QString::number(_nearFieldCoordinate->getStartY() + i * _nearFieldCoordinate->getStepY()));
// }
//}
//else if (index == 2)
//{
// int num = (_nearFieldCoordinate->getEndZ() - _nearFieldCoordinate->getStartZ()) / _nearFieldCoordinate->getStepZ() + 1;
// for (int i = 0; i < num; ++i)
// {
// ui->comboBox_slicePosition->addItem(
// QString::number(_nearFieldCoordinate->getStartZ() + i * _nearFieldCoordinate->getStepZ()));
// }
//}
}
//void ThreeDimensionDiagraph::writeMOMData()
//{
// auto camera = m_render3D->GetActiveCamera();
// auto cameraViewUp = camera->GetViewUp();
// auto cameraPosition = camera->GetPosition();
// auto cameraFocalPoint = camera->GetFocalPoint();
// QList<double> cameraViewUpList{ cameraViewUp[0],cameraViewUp[1],cameraViewUp[2] };
// QList<double> cameraPositionList{ cameraPosition[0],cameraPosition[1],cameraPosition[2] };
// QList<double> cameraFocalPointList{ cameraFocalPoint[0],cameraFocalPoint[1],cameraFocalPoint[2] };
// QString cameraViewUpListStr = BaseModule::GlobalHelper::convertDoubleListToQString(cameraViewUpList);
// QString cameraPositionListStr = BaseModule::GlobalHelper::convertDoubleListToQString(cameraPositionList);
// QString cameraFocalPointListStr = BaseModule::GlobalHelper::convertDoubleListToQString(cameraFocalPointList);
// auto _titleColor = ui->comboBoxSBTitleColor->currentColor();
// QList<double> titleColor{ _titleColor.redF(), _titleColor.greenF(), _titleColor.blueF() };
// QString titleColorStr = BaseModule::GlobalHelper::convertDoubleListToQString(titleColor);
// QStringList _listPYCode;
// _listPYCode.append(QString("postthreedimensiongraphdata = PostWidgets.PostThreeDimensionGraphData()"));
// _listPYCode.append(QString("postthreedimensiongraphdata.setID(%1)").arg(m_iD));
// _listPYCode.append(QString("postthreedimensiongraphdata.setIsLogTheData(%1)").arg(m_shouldLogTheData));
// _listPYCode.append(QString("postthreedimensiongraphdata.setIsNormalizeTheData(%1)").arg(m_shouldNormalizeTheData));
// _listPYCode.append(QString("postthreedimensiongraphdata.setScalarBarProperty(\"%1\",\"%2\",%3,%4,%5,%6)")
// .arg(ui->lineEditSBTitleString->text())
// .arg(titleColorStr)
// .arg(ui->checkBoxScalarBarRangeAutomatic->isChecked())
// .arg(ui->doubleSpinBox_SBMinRange->value())
// .arg(ui->doubleSpinBox_SBMaxRange->value())
// .arg(ui->comboBoxSBFontSize->currentText().toInt()));
// _listPYCode.append(QString("postthreedimensiongraphdata.setGraphOpacity(%1)").arg(ui->slider_ResultTransparency->value()));
// _listPYCode.append(QString("postthreedimensiongraphdata.setMeshOpacity(%1)").arg(ui->slider_meshTransparency->value()));
// _listPYCode.append(QString("postthreedimensiongraphdata.setScaleFactor(%1)").arg(ui->doubleSpinBox_resultScale->value()));
// _listPYCode.append(QString("postthreedimensiongraphdata.setCameraParameters(\"%1\",\"%2\",\"%3\")")
// .arg(cameraViewUpListStr)
// .arg(cameraPositionListStr)
// .arg(cameraFocalPointListStr));
// _listPYCode.append(QString("postthreedimensiongraphdata.setCurrentFreqIndex(%1)").arg(ui->comboBoxFrequency->currentIndex()));
// _listPYCode.append(QString("postthreedimensiongraphdata.setIsEnableSlice(%1)").arg(ui->checkBox_enableSlice->isChecked()));
// _listPYCode.append(QString("postthreedimensiongraphdata.setSliceDirectionIndex(%1)").arg(ui->comboBox_sliceDirection->currentIndex()));
// _listPYCode.append(QString("postthreedimensiongraphdata.setSlicePositionIndex(%1)").arg(ui->comboBox_slicePosition->currentIndex()));
// _listPYCode.append(QString("postthreedimensiongraphdata.setCurrentTagIndex(%1)").arg(ui->tabWidget->currentIndex()));
// _listPYCode.append(QString("postthreedimensiongraphdata.savePostThreeDimensionGraphData()"));
// emit IBaseSignalInstance->signal_execPYCode(_listPYCode);
//}
//void ThreeDimensionDiagraph::readDataFromDataManager()
//{
// auto m_curCaseModel = ProjectManager::CaseModelManager::getinstance()->getCurrentCase();
// m_gain3DData = m_curCaseModel->getMOMDataManager()->getMOMSimulationData()->getThreeDimensionDataByID(m_iD).get();
// auto _currentFreqIndex = m_gain3DData->getFreqIndex();
// ui->comboBoxFrequency->setCurrentIndex(_currentFreqIndex);
// //先设频率再读数据
// on_pushBtnApply_clicked();
// if (!m_isReadDataSuc)
// {
// return;
// }
// m_shouldLogTheData = m_gain3DData->getIsLogTheData();
// auto meshOpacity = m_gain3DData->getMeshOpacity();
// auto graphOpacity = m_gain3DData->getGraphOpacity();
// m_shouldNormalizeTheData = m_gain3DData->getIsNormalized();
// auto _isEnableSlice = m_gain3DData->getEnableSlice();
// auto _sliceDirectionIndex = m_gain3DData->getSliceDirectionIndex();
// auto _slicePositionIndex = m_gain3DData->getSlicePosition();
// auto _currentTagIndex = m_gain3DData->getCurrentTagIndex();
// //scalarBar属性
// QString scaleBarTitle("");
// bool scaleBarAutoRange{ false };
// double scaleBarMaunalMin{ 0. };
// double scaleBarMaunalMax{ 0. };
// QList<double> _scaleBarTitleColor;
// int titleFontSize{ 8 };
// m_gain3DData->getScalarBarProperty(scaleBarTitle, scaleBarAutoRange,
// scaleBarMaunalMin, scaleBarMaunalMax, _scaleBarTitleColor, titleFontSize);
// //=======设置到界面==========
// ui->checkBox_normalization->setChecked(m_shouldNormalizeTheData);
// ui->checkBox_logarithm->setChecked(m_shouldLogTheData);
// ui->checkBoxScalarBarRangeAutomatic->setChecked(scaleBarAutoRange);
// ui->doubleSpinBox_SBMinRange->setValue(scaleBarMaunalMin);
// ui->doubleSpinBox_SBMaxRange->setValue(scaleBarMaunalMax);
// ui->comboBoxSBFontSize->setCurrentText(QString::number(titleFontSize));
// ui->slider_meshTransparency->setValue(meshOpacity);
// ui->slider_ResultTransparency->setValue(graphOpacity);
// ui->checkBox_enableSlice->setChecked(_isEnableSlice);
// ui->comboBox_sliceDirection->setCurrentIndex(_sliceDirectionIndex);
// ui->comboBox_slicePosition->setCurrentIndex(_slicePositionIndex);
// ui->tabWidget->setCurrentIndex(_currentTagIndex);
// ui->lineEditSBTitleString->setText(scaleBarTitle);
//}
//void ThreeDimensionDiagraph::restoreLogic()
//{
// if (!m_isReadDataSuc)
// {
// return;
// }
// on_comboBoxSBFontSize_currentIndexChanged(ui->comboBoxSBFontSize->currentIndex());
// if (m_dataType == 0 || m_dataType == 1) //表面电流没有归一化和取对数
// {
// on_checkBox_normalization_stateChanged(ui->checkBox_normalization->isChecked());
// on_checkBox_logarithm_stateChanged(ui->checkBox_logarithm->isChecked());
// }
// on_checkBoxScalarBarRangeAutomatic_stateChanged(ui->checkBoxScalarBarRangeAutomatic->isChecked());
// on_slider_meshTransparency_valueChanged(ui->slider_meshTransparency->value());
// on_slider_ResultTransparency_valueChanged(ui->slider_ResultTransparency->value());
// //on_comboBoxFrequency_currentIndexChanged(ui->comboBoxFrequency->currentIndex());
// on_checkBox_enableSlice_stateChanged(ui->checkBox_enableSlice->isChecked());
// on_comboBox_sliceDirection_currentIndexChanged(m_gain3DData->getSliceDirectionIndex());
// ui->comboBox_slicePosition->setCurrentIndex(m_gain3DData->getSlicePosition());
// auto scaleFactor = m_gain3DData->getScaleFactor();
// ui->doubleSpinBox_resultScale->setValue(scaleFactor);
// //on_doubleSpinBox_resultScale_valueChanged(scaleFactor);
// //相机参数
// QList<double> viewUp{};
// QList<double> position{};
// QList<double> focalPoint{};
// m_gain3DData->getCameraParameters(viewUp, position, focalPoint);
// auto camera = m_render3D->GetActiveCamera();
// camera->SetViewUp(viewUp[0], viewUp[1], viewUp[2]);
// camera->SetPosition(position[0], position[1], position[2]);
// camera->SetFocalPoint(focalPoint[0], focalPoint[1], focalPoint[2]);
// camera->Modified();
// m_render3D->ResetCameraClippingRange();
//}
//void ThreeDimensionDiagraph::importPreProcessWindowData()
//{
// auto render = IWidgetSignalInstance->signal_getRenderer();
// if (render == nullptr)
// {
// return;
// }
// m_render3D->SetBackground(render->GetBackground());
// m_render3D->SetBackground2(render->GetBackground2());
// m_render3D->SetGradientBackground(render->GetGradientBackground());
// m_preWDmeshActorsList.clear();
// QList<QList<QList<vtkProp*>>> _preWDmeshActors;
// IWidgetSignalInstance->signal_getAllMeshActors(_preWDmeshActors);
// for (auto meshKernalActor : _preWDmeshActors)//每一个mesh
// {
// if (meshKernalActor.size() != 4) //4个actor 面、线、点、法线
// {
// return;
// }
// for (int i = 0; i < 2; ++i)//只取面。线
// {
// auto actorList = meshKernalActor[i];//面或者线
// for (auto _actor : actorList)
// {
// vtkActor* sourceActor = vtkActor::SafeDownCast(_actor);
// if (sourceActor == nullptr)
// {
// return;
// }
// vtkNew<vtkActor> copiedActor;
// copyActor(sourceActor, copiedActor);
// copiedActor->GetProperty()->SetOpacity(1);
// copiedActor->SetVisibility(true);
// m_preWDmeshActorsList.append(copiedActor);
// m_render3D->AddActor(copiedActor);
// }
// }
// }
// m_render3D->ResetCamera();
// m_renderWindow3D->Render();
//}
void ThreeDimensionDiagraph::on_comboBoxFrequency_currentIndexChanged(int index)
{
}
void ThreeDimensionDiagraph::on_pushBtnApply_clicked()
{
//if (m_dataType != 0 && m_dataType != 1 && m_dataType != 2)
//{
// return;
//}
//m_filePathToRead = generateFilePath(m_fileName, ui->comboBoxFrequency->currentIndex());
////判别读哪个文件
//auto suc = readData(m_filePathToRead);
//if (!suc)
//{
// BaseModule::MessageBoxButton bt;
// emit IBaseSignalInstance->signal_showMessageDialog(QObject::tr("ERROR"),
// QObject::tr("Data read error!"), BaseModule::MessageBoxType::Error, bt);
// return;
//}
activeButtonAfterReadData();
}
void ThreeDimensionDiagraph::on_checkBox_normalization_stateChanged(int state)
{
m_shouldNormalizeTheData = state;
if (m_dataType == 0)
{
m_farFieldDataGenerator->setNormalizeTheData(state);
m_farFieldDataGenerator->update();
}
else if (m_dataType == 1)
{
m_nearFieldDataGenerator->setNormalizeTheData(state);
m_nearFieldDataGenerator->update();
}
m_scalarBarAutoDataRange[0] = m_dataSet->GetPointData()->GetArray(0)->GetRange()[0];
m_scalarBarAutoDataRange[1] = m_dataSet->GetPointData()->GetArray(0)->GetRange()[1];
setScalarBarRange();
m_dataActor->Modified();
m_render3D->ResetCamera();
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_checkBox_logarithm_stateChanged(int state)
{
m_shouldLogTheData = state;
if (m_dataType == 0)
{
m_farFieldDataGenerator->setLogTheData(state);
m_farFieldDataGenerator->update();
}
else if (m_dataType == 1)
{
m_nearFieldDataGenerator->setLogTheData(state);
m_nearFieldDataGenerator->update();
}
m_scalarBarAutoDataRange[0] = m_dataSet->GetPointData()->GetArray(0)->GetRange()[0];
m_scalarBarAutoDataRange[1] = m_dataSet->GetPointData()->GetArray(0)->GetRange()[1];
m_logDataRRange[0] = m_scalarBarAutoDataRange[0];
m_logDataRRange[1] = m_scalarBarAutoDataRange[1];
//防止处0和其他异常
if ((m_logDataRRange[1] != m_logDataRRange[0]) && (m_originalRRange[1] != m_originalRRange[0]))
{
m_logDefautFactory = (m_originalRRange[1] - m_originalRRange[0]) / (m_logDataRRange[1] - m_logDataRRange[0]);
}
on_doubleSpinBox_resultScale_valueChanged(ui->doubleSpinBox_resultScale->value());
setScalarBarRange();
m_dataActor->Modified();
m_render3D->ResetCamera();
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_pushButton_fitView_clicked()
{
m_render3D->ResetCamera();
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_btnTopView_clicked()
{
resetCameraViewDirection(m_render3D->GetActiveCamera(), 0, 0, -1, 0, 1, 0);
}
void ThreeDimensionDiagraph::on_btnBottomView_clicked()
{
resetCameraViewDirection(m_render3D->GetActiveCamera(), 0, 0, 1, 0, 1, 0);
}
void ThreeDimensionDiagraph::on_btnFrontView_clicked()
{
resetCameraViewDirection(m_render3D->GetActiveCamera(), -1, 0, 0, 0, 0, 1);
}
void ThreeDimensionDiagraph::on_btnBackView_clicked()
{
resetCameraViewDirection(m_render3D->GetActiveCamera(), 1, 0, 0, 0, 0, 1);
}
void ThreeDimensionDiagraph::on_btnLeftView_clicked()
{
resetCameraViewDirection(m_render3D->GetActiveCamera(), 0, 1, 0, 0, 0, 1);
}
void ThreeDimensionDiagraph::on_btnRightView_clicked()
{
resetCameraViewDirection(m_render3D->GetActiveCamera(), 0, -1, 0, 0, 0, 1);
}
void ThreeDimensionDiagraph::on_lineEditSBTitleString_editingFinished()
{
m_scalarBarActor->SetTitle(ui->lineEditSBTitleString->text().toStdString().c_str());
m_scalarBarActor->Modified();
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_comboBoxSBTitleColor_activated(int index)
{
auto color = ui->comboBoxSBTitleColor->currentColor();
m_scalarBarActor->GetTitleTextProperty()->SetColor(color.redF(), color.greenF(), color.blueF());
m_scalarBarActor->Modified();
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_comboBoxSBFontSize_currentIndexChanged(int index)
{
auto size = ui->comboBoxSBFontSize->currentText().toInt();
m_scalarBarActor->GetTitleTextProperty()->SetFontSize(size);
m_scalarBarActor->Modified();
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_checkBoxScalarBarRangeAutomatic_stateChanged(int state)
{
ui->doubleSpinBox_SBMinRange->setEnabled(!state);
ui->doubleSpinBox_SBMaxRange->setEnabled(!state);
setScalarBarRange();
m_scalarBarActor->Modified();
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_doubleSpinBox_SBMinRange_valueChanged(double value)
{
m_lookupTable->SetRange(ui->doubleSpinBox_SBMinRange->value(), ui->doubleSpinBox_SBMaxRange->value());
m_widgetCutter->SetScalarBarRange(ui->doubleSpinBox_SBMinRange->value(), ui->doubleSpinBox_SBMaxRange->value());
m_scalarBarActor->Modified();
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_doubleSpinBox_SBMaxRange_valueChanged(double value)
{
m_lookupTable->SetRange(ui->doubleSpinBox_SBMinRange->value(), ui->doubleSpinBox_SBMaxRange->value());
m_widgetCutter->SetScalarBarRange(ui->doubleSpinBox_SBMinRange->value(), ui->doubleSpinBox_SBMaxRange->value());
m_scalarBarActor->Modified();
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_slider_meshTransparency_valueChanged(int value)
{
for (auto i : m_preWDmeshActorsList)
{
auto opa = 1 - value / 100.0;
i->GetProperty()->SetOpacity(opa);
auto backFaceProp = i->GetBackfaceProperty();
if (backFaceProp)
{
backFaceProp->SetOpacity(opa);
}
value == 100 ? i->SetVisibility(false) : i->SetVisibility(true);
}
QString str = QString::number(value) + "%";
ui->label_meshTransValue->setText(str);
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_slider_ResultTransparency_valueChanged(int value)
{
auto opa = 1 - value / 100.0;
m_dataActor->GetProperty()->SetOpacity(opa);
m_scalarBarActor->Modified();
QString str = QString::number(value) + "%";
ui->label_resultTransValue->setText(str);
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_checkBox_enableSlice_stateChanged(int state)
{
//调整界面上的控件
ui->comboBox_sliceDirection->setEnabled(state);
if (m_dataType == 1) //近场
{
ui->comboBox_slicePosition->setEnabled(state);
on_comboBox_slicePosition_currentIndexChanged(ui->comboBox_slicePosition->currentIndex());
}
AddCutter();
if (!m_isCutterAdded)
{
return;
}
m_widgetCutter->GetCutterActor()->SetVisibility(state);
state ? m_widgetCutter->TurnWidgetOn() : m_widgetCutter->TurnAllWidgetOff();
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::AddCutter()
{
if (m_isCutterAdded)
{
return;
}
m_widgetCutter->SetInteractor(m_renderWindow3D->GetInteractor());
m_widgetCutter->SetInputData(m_dataSet);
m_widgetCutter->SetCenter(m_dataSet->GetCenter());
m_widgetCutter->GetPlaneWidget()->GetHandleProperty()->SetOpacity(0.4);
m_widgetCutter->SetPlaneNormalDirection(pst::WidgetCutter::PlaneNormalDirection::X);
setScalarBarRange();
m_widgetCutter->GetDataOutlineActor()->VisibilityOff();
m_widgetCutter->TurnAllWidgetOff();
m_widgetCutter->Update();
//m_widgetCutter->TurnAllWidgetOff();
m_widgetCutter->TurnWidgetOn();
m_render3D->AddActor(m_widgetCutter->GetCutterActor());
m_widgetCutter->GetScalarBar()->SetVisibility(false);
generateSlicePosition(ui->comboBox_sliceDirection->currentIndex());
m_isCutterAdded = true;
}
void ThreeDimensionDiagraph::on_comboBox_sliceDirection_currentIndexChanged(int index)
{
if (!ui->checkBox_enableSlice->isChecked())
{
return;
}
if (index == 0)
{
m_widgetCutter->SetPlaneNormalDirection(pst::WidgetCutter::PlaneNormalDirection::X);
}
else if (index == 1)
{
m_widgetCutter->SetPlaneNormalDirection(pst::WidgetCutter::PlaneNormalDirection::Y);
}
else if (index == 2)
{
m_widgetCutter->SetPlaneNormalDirection(pst::WidgetCutter::PlaneNormalDirection::Z);
}
generateSlicePosition(index);
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_comboBox_slicePosition_currentIndexChanged(int index)
{
if (!ui->checkBox_enableSlice->isChecked())
{
return;
}
auto bounds = m_dataSet->GetBounds();//边界范围
auto dataCenter = m_dataSet->GetCenter();
double center[3]{ dataCenter[0],dataCenter[1],dataCenter[2] };
if (ui->comboBox_sliceDirection->currentIndex() == 0)//x
{
center[0] = ui->comboBox_slicePosition->currentText().toDouble();
// 可能由于精度损失,切不到数据,
// 将两端的切片位置中心移动一定范围
int num = ui->comboBox_slicePosition->count();//不同方向数量可能不同
if (index == 0)//最小
{
center[0] += std::min((bounds[1] - bounds[0]) / 1000000., 0.0000001);
}
else if (index = num - 1) //最大
{
center[0] -= std::min((bounds[1] - bounds[0]) / 1000000., 0.0000001);
}
}
else if (ui->comboBox_sliceDirection->currentIndex() == 1)//y
{
center[1] = ui->comboBox_slicePosition->currentText().toDouble();
int num = ui->comboBox_slicePosition->count();//不同方向数量可能不同
if (index == 0)//最小
{
center[1] += std::min((bounds[3] - bounds[2]) / 1000000., 0.0000001);
}
else if (index = num - 1) //最大
{
center[1] -= std::min((bounds[3] - bounds[2]) / 1000000., 0.0000001);
}
}
else if (ui->comboBox_sliceDirection->currentIndex() == 2)//z
{
center[2] = ui->comboBox_slicePosition->currentText().toDouble();
int num = ui->comboBox_slicePosition->count();//不同方向数量可能不同
if (index == 0)//最小
{
center[2] += std::min((bounds[5] - bounds[4]) / 1000000., 0.0000001);
}
else if (index = num - 1) //最大
{
center[2] -= std::min((bounds[5] - bounds[4]) / 1000000., 0.0000001);
}
}
m_widgetCutter->SetCenter(center);
m_widgetCutter->refreshWidget();
//m_widgetCutter->TurnAllWidgetOff();
//m_widgetCutter->Update();
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::on_pb_exportData_clicked()
{
QString desFilePath("");
if (m_dataType == 0 || m_dataType == 1)
{
desFilePath = QFileDialog::getSaveFileName(this, tr("Export Data"), "", tr("TXT(*.txt)"));
}
else if (m_dataType == 2)
{
desFilePath = QFileDialog::getSaveFileName(this, tr("Export Data"), "", tr("VTK(*.vtk)"));
}
if (!m_filePathToRead.isEmpty() && !desFilePath.isEmpty())
{
QFile file(desFilePath);
if (file.exists())
{
file.remove();
}
QFile::copy(m_filePathToRead, desFilePath);
}
}
void ThreeDimensionDiagraph::on_doubleSpinBox_resultScale_valueChanged(double value)
{
auto scale = ui->checkBox_logarithm->isChecked() ?
m_logDefautFactory * value / 100. : value / 100.;
m_dataActor->SetScale(scale);
if (m_widgetCutter->GetCutterActor())
{
m_widgetCutter->GetCutterActor()->SetScale(scale);
}
m_renderWindow3D->Render();
}
void ThreeDimensionDiagraph::slot_refreshWindowTitle(int caseID, int resultType, int viewResultDataID)
{
//if (m_caseID <= 0 || m_caseID != caseID || m_viewResultDataID != viewResultDataID
// || resultType != (int)BaseModule::ResultType::ResultThreeDimensionGraph)
//{
// return;
//}
//auto caseModel = ProjectManager::CaseModelManager::getinstance()->getModelByID(caseID);
//if (caseModel)
//{
// if (caseModel->getTreeType() == BaseModule::SolverType::MOM)
// {
// auto viewResultData = caseModel->getMOMDataManager()->getMOMSimulationData()->getViewResultByID(viewResultDataID);
// QString title = viewResultData->getName();
// setWindowTitle(title);
// setBaseWindowTitle(title);
// }
// else if (caseModel->getTreeType() == BaseModule::SolverType::FEM)
// {
// auto viewResultData = caseModel->getFEMDataManager()->getFEMSimulationData()->getViewResultByID(viewResultDataID);
// QString title = viewResultData->getName();
// setWindowTitle(title);
// setBaseWindowTitle(title);
// }
//}
}
bool ThreeDimensionDiagraph::readerDelimitedTextFromLocal(const QString& fileName)
{
if (!vtksys::SystemTools::FileExists(fileName.toStdString(), true))
{
return false;
}
m_delimitedTextReader->SetFileName(fileName.toStdString().c_str());
m_delimitedTextReader->SetHaveHeaders(true);
m_delimitedTextReader->SetDetectNumericColumns(true);
m_delimitedTextReader->SetFieldDelimiterCharacters(",");
m_delimitedTextReader->SetUseStringDelimiter(true);
m_delimitedTextReader->Update();
if (m_delimitedTextReader->GetOutput() == nullptr)
{
return false;
}
return true;
}
void ThreeDimensionDiagraph::resetCameraViewDirection(
vtkCamera* camera, double look_x, double look_y,
double look_z, double up_x, double up_y, double up_z)
{
double pos[3] = { 0, 0, 0 };
double focal_point[3] = { look_x, look_y, look_z };
double view_up[3] = { up_x, up_y, up_z };
camera->SetPosition(pos);
camera->SetFocalPoint(focal_point);
camera->SetViewUp(view_up);
m_render3D->ResetCamera();
this->ui->qvtkWidget->renderWindow()->Render();
}
void ThreeDimensionDiagraph::copyActor(vtkActor* sourceActor, vtkSmartPointer<vtkActor> desActor)
{
//sourceActor->GetProperty()->SetRepresentationToWireframe();
auto sourceData = sourceActor->GetMapper()->GetInput();
auto sourceMapper = sourceActor->GetMapper();
auto sourceProperty = sourceActor->GetProperty();
auto sourceBackFaceProperty = sourceActor->GetBackfaceProperty();
vtkNew<vtkDataSetMapper> mapper;
mapper->ShallowCopy(sourceMapper);
mapper->SetInputData(sourceData);
desActor->SetMapper(mapper);
vtkNew<vtkProperty> property;
property->DeepCopy(sourceProperty);
desActor->SetProperty(property);
if (sourceBackFaceProperty)
{
vtkNew<vtkProperty> backFaceProperty;
backFaceProperty->DeepCopy(sourceBackFaceProperty);
desActor->SetBackfaceProperty(backFaceProperty);
}
}
void ThreeDimensionDiagraph::setScalarBarRange()
{
if (ui->checkBoxScalarBarRangeAutomatic->isChecked())
{
m_lookupTable->SetRange(m_scalarBarAutoDataRange);
m_widgetCutter->SetScalarBarRange(m_scalarBarAutoDataRange[0], m_scalarBarAutoDataRange[1]);
}
else
{
m_lookupTable->SetRange(ui->doubleSpinBox_SBMinRange->value(), ui->doubleSpinBox_SBMaxRange->value());
m_widgetCutter->SetScalarBarRange(ui->doubleSpinBox_SBMinRange->value(), ui->doubleSpinBox_SBMaxRange->value());
}
}
}