You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

348 lines
12 KiB
C++

#include "FITKAbstractCFDPostData.h"
#include "FITKCFDPostData.h"
#include "FITKCFDPost3DManager.h"
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
#include <vtkDataSetMapper.h>
#include <vtkDataSet.h>
#include <vtkPointData.h>
#include <vtkCellData.h>
#include <vtkDataArray.h>
#include <vtkTextProperty.h>
#include <vtkScalarBarWidget.h>
#include <vtkLookupTable.h>
#include <vtkBorderRepresentation.h>
#include <vtkScalarBarActor.h>
#include <vtkAssembly.h>
#include <vtkActor.h>
#include <QDebug>
namespace Interface {
FITKAbstractCFDPostData::FITKAbstractCFDPostData()
{
_textProperty = vtkTextProperty::New();
_textProperty->SetBold(0);
_textProperty->SetItalic(0);
_textProperty->SetShadow(0);
_textProperty->SetJustification(VTK_TEXT_LEFT);
_textProperty->SetColor(0, 0, 0);
_textProperty->SetFontSize(14);
_scalarBarWidget = vtkScalarBarWidget::New();
_scalarBarWidget->GetScalarBarActor()->SetNumberOfLabels(_defaultScalarBarNum);
_scalarBarWidget->GetScalarBarActor()->SetVerticalTitleSeparation(1);
_scalarBarWidget->GetScalarBarActor()->SetBarRatio(0.2);
_scalarBarWidget->GetBorderRepresentation()->SetPosition(0.90, 0.05);
_scalarBarWidget->GetBorderRepresentation()->SetPosition2(0.08, 0.45);
_scalarBarWidget->GetBorderRepresentation()->SetShowBorderToOff();
_scalarBarWidget->GetScalarBarActor()->SetTitleTextProperty(_textProperty);
_scalarBarWidget->GetScalarBarActor()->SetLabelTextProperty(_textProperty);
_scalarBarWidget->GetScalarBarActor()->SetUnconstrainedFontSize(true);
_lookUpTable = vtkLookupTable::New();
_lookUpTable->SetHueRange(_defaultHue.first, _defaultHue.second);
_lookUpTable->SetNumberOfColors(255);
_lookUpTable->Build();
_scalarBarWidget->GetScalarBarActor()->SetLookupTable(_lookUpTable);
}
FITKAbstractCFDPostData::~FITKAbstractCFDPostData()
{
int mapperSize = _mappers.size();
for (int i = mapperSize - 1; i >= 0; i--) {
_mappers[i]->Delete();
}
_mappers.clear();
if (_textProperty) {
_textProperty->Delete();
_textProperty = nullptr;
}
if (_scalarBarWidget) {
_scalarBarWidget->Delete();
_scalarBarWidget = nullptr;
}
if (_lookUpTable) {
_lookUpTable->Delete();
_lookUpTable = nullptr;
}
}
void FITKAbstractCFDPostData::update()
{
//更新当前数据对象
for (vtkMapper* mapper : _mappers) {
if(mapper == nullptr)continue;
mapper->Update();
}
//更新子数据
Interface::FITKCFDPost3DManager* postDataManager = FITKAPP->getGlobalData()->getPostData<Interface::FITKCFDPostData>()->getPostDataManager();
if (postDataManager == nullptr)return;
for (int i = 0; i < postDataManager->getDataCount(); i++) {
Interface::FITKAbstractCFDPostData* subData = postDataManager->getDataByIndex(i);
if (subData == nullptr)continue;
if (subData->getCFDPostParentID() != this->getDataObjectID())continue;
subData->update();
}
}
QList<vtkMapper*> FITKAbstractCFDPostData::getMappers()
{
return _mappers;
}
vtkDataSet * FITKAbstractCFDPostData::getOutput()
{
//虚函数,子类重写
return nullptr;
}
vtkAlgorithmOutput * FITKAbstractCFDPostData::getOutputPort()
{
//虚函数,子类重写
return nullptr;
}
int FITKAbstractCFDPostData::getCFDPostParentID()
{
return _CFDPostParentID;
}
void FITKAbstractCFDPostData::setInteractor(vtkRenderWindowInteractor * interactor)
{
Q_UNUSED(interactor);
}
void FITKAbstractCFDPostData::setScalarBarWidgetInteractor(vtkRenderWindowInteractor * interactor)
{
_scalarBarWidget->SetInteractor(interactor);
}
QStringList FITKAbstractCFDPostData::getPointDataArray()
{
auto dataSet = this->getOutput();
if (dataSet == nullptr) return QStringList();
auto pointData = dataSet->GetPointData();
if (pointData == nullptr) return QStringList();
const int nArray = pointData->GetNumberOfArrays();
QStringList nameList;
for (int i = 0; i < nArray; ++i)
{
const char* cName = pointData->GetArrayName(i);
QString name = QString(cName);
nameList.append(name);
}
return nameList;
}
QStringList FITKAbstractCFDPostData::getCellDataArray()
{
auto dataSet = this->getOutput();
if (dataSet == nullptr) return QStringList();
auto cellData = dataSet->GetCellData();
if (cellData == nullptr) return QStringList();
const int nArray = cellData->GetNumberOfArrays();
QStringList nameList;
for (int i = 0; i < nArray; ++i)
{
const char* cName = cellData->GetArrayName(i);
QString name = QString(cName);
nameList.append(name);
}
return nameList;
}
FITKPostVariableType FITKAbstractCFDPostData::getVariableType(FITKPostFieldType fieldType, QString fieldName)
{
FITKPostVariableType type = FITKPostVariableType::Post_Error;
vtkDataSet* dataSet = getOutput();
if (dataSet == nullptr)return type;
auto bName = fieldName.toLocal8Bit();
char* cName = bName.data();
vtkDataArray* dataArray = nullptr;
switch (fieldType){
case Interface::FITKPostFieldType::Post_Point:dataArray = dataSet->GetPointData()->GetArray(cName);break;
case Interface::FITKPostFieldType::Post_Cell:dataArray = dataSet->GetCellData()->GetArray(cName); break;
}
if (dataArray == nullptr)return type;
const int cNum = dataArray->GetNumberOfComponents();
if (cNum == 1)type = FITKPostVariableType::Post_Scalar;
else if (cNum == 3)type = FITKPostVariableType::Post_Vector;
else if (cNum >= 4)type = FITKPostVariableType::Post_Tensor;
return type;
}
int FITKAbstractCFDPostData::getVariableComponentCount(FITKPostFieldType fieldType, QString fieldName)
{
vtkDataSet* dataSet = getOutput();
if (dataSet == nullptr)return 0;
auto bName = fieldName.toLocal8Bit();
char* cName = bName.data();
vtkDataArray* dataArray = nullptr;
switch (fieldType) {
case Interface::FITKPostFieldType::Post_Point:dataArray = dataSet->GetPointData()->GetArray(cName); break;
case Interface::FITKPostFieldType::Post_Cell:dataArray = dataSet->GetCellData()->GetArray(cName); break;
}
if (dataArray == nullptr)return 0;
return dataArray->GetNumberOfComponents();
}
vtkScalarBarWidget * FITKAbstractCFDPostData::getScalarBarWidget()
{
return _scalarBarWidget;
}
int FITKAbstractCFDPostData::getScalaraBarColorNum()
{
if (_scalarBarWidget == nullptr)return 0;
vtkScalarBarActor* scalarActor = _scalarBarWidget->GetScalarBarActor();
if (scalarActor == nullptr)return 0;
return scalarActor->GetNumberOfLabels();
}
void FITKAbstractCFDPostData::setScalarBarColorNum(int count)
{
if (_scalarBarWidget == nullptr)return;
vtkScalarBarActor* scalarActor = _scalarBarWidget->GetScalarBarActor();
if (scalarActor == nullptr)return;
if (count == scalarActor->GetNumberOfLabels())return;
scalarActor->SetNumberOfLabels(count);
}
void FITKAbstractCFDPostData::getRange(double* range, FITKPostFieldType type, QString fieldName, int componentIndex)
{
vtkDataSet* data = getOutput();
if (data == nullptr) return;
QByteArray name = fieldName.toLocal8Bit();
char* cName = name.data();
vtkDataArray* dataArray = nullptr;
switch (type) {
case Interface::FITKPostFieldType::Post_None: break;
case Interface::FITKPostFieldType::Post_Point:dataArray = data->GetPointData()->GetArray(cName); break;
case Interface::FITKPostFieldType::Post_Cell:dataArray = data->GetCellData()->GetArray(cName); break;
}
if (dataArray == nullptr) return;
dataArray->GetRange(range, componentIndex);
}
void FITKAbstractCFDPostData::getExtremum(double * range, double * point, FITKPostFieldType type, QString fieldName, int componentIndex)
{
//获取数据极值
this->getRange(range, type, fieldName);
//获取对应数据的数据组
vtkDataSet* data = getOutput();
if (data == nullptr) return;
QByteArray name = fieldName.toLocal8Bit();
char* cName = name.data();
vtkDataArray* dataArray = nullptr;
switch (type) {
case Interface::FITKPostFieldType::Post_Point: {
dataArray = data->GetPointData()->GetArray(cName);
break;
}
case Interface::FITKPostFieldType::Post_Cell: {
dataArray = data->GetCellData()->GetArray(cName);
break;
}
}
if (dataArray == nullptr) return;
//获取数据极值点
for (int i = 0; i < dataArray->GetNumberOfTuples(); i++) {
double filedValue = dataArray->GetComponent(i, -1);
if (filedValue == range[0]) {
double* minPoint = dataArray->GetTuple(i);
point[0] = minPoint[0];
point[1] = minPoint[1];
point[2] = minPoint[2];
}
if (filedValue == range[1]) {
double* maxPoint = dataArray->GetTuple(i);
point[3] = maxPoint[0];
point[4] = maxPoint[1];
point[5] = maxPoint[2];
}
}
}
void FITKAbstractCFDPostData::setScalarRange(double minRange, double maxRange)
{
for (vtkMapper* mapper : _mappers) {
if (mapper == nullptr)continue;
double* range = mapper->GetScalarRange();
if (range[0] == minRange && range[1] == maxRange)return;
mapper->SetScalarRange(minRange, maxRange);
}
}
void FITKAbstractCFDPostData::setHueRange(double maxColor, double minColor)
{
if (_lookUpTable == nullptr)return;
double* hueRange = _lookUpTable->GetHueRange();
if ((hueRange[0] == maxColor) && (hueRange[1] == minColor))return;
_lookUpTable->SetHueRange(maxColor, minColor);
}
void FITKAbstractCFDPostData::getHueRange(double* range)
{
if (_lookUpTable == nullptr)return;
double* hueRange = _lookUpTable->GetHueRange();
range = hueRange;
}
int FITKAbstractCFDPostData::getPointNumber()
{
vtkDataSet* dataSet = getOutput();
if (dataSet == nullptr)return 0;
int num = dataSet->GetNumberOfPoints();
return num;
}
int FITKAbstractCFDPostData::getCellNumber()
{
vtkDataSet* dataSet = getOutput();
if (dataSet == nullptr)return 0;
int num = dataSet->GetNumberOfCells();
return num;
}
FITKPostGridType FITKAbstractCFDPostData::getGridType()
{
vtkDataSet* dataSet = getOutput();
if (dataSet == nullptr)return FITKPostGridType::Post_None;
int vtkType = dataSet->GetDataObjectType();
if (vtkType == 2)return FITKPostGridType::Post_Structured;
else if (vtkType == 4)return FITKPostGridType::Post_UnStructured;
return FITKPostGridType::Post_None;
}
void FITKAbstractCFDPostData::getBounds(double* bounds)
{
vtkDataSet* dataSet = getOutput();
if (dataSet == nullptr)return;
dataSet->GetBounds(bounds);
}
void FITKAbstractCFDPostData::getOrigin(double* origin)
{
vtkDataSet* dataSet = getOutput();
if (dataSet == nullptr)return;
dataSet->GetCenter(origin);
}
}