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.

148 lines
5.0 KiB
C++

#include "FITKCFDPostStreamLine.h"
#include "FITKCFDPost3DManager.h"
#include "FITKCFDPostData.h"
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
#include <vtkLineSource.h>
#include <vtkStreamTracer.h>
#include <vtkDataSetMapper.h>
namespace Interface
{
FITKCFDPostStreamLine::FITKCFDPostStreamLine(int parentID)
{
_CFDPostParentID = parentID;
Interface::FITKCFDPost3DManager* dataManger = FITKAPP->getGlobalData()->getPostData<Interface::FITKCFDPostData>()->getPostDataManager();
if (dataManger == nullptr)return;
Interface::FITKAbstractCFDPostData* parentData = dataManger->getDataByID(_CFDPostParentID);
if (parentData == nullptr)return;
_lineSource = vtkLineSource::New();
//初始化过滤器
_streamFilter = vtkStreamTracer::New();
_streamFilter->SetInputConnection(parentData->getOutputPort());
_streamFilter->SetSourceConnection(_lineSource->GetOutputPort());
_streamFilter->SetIntegratorTypeToRungeKutta45();
_streamFilter->SetIntegrationStepUnit(2);//设置流线积分步长单位
_streamFilter->SetInitialIntegrationStep(0.2);//设置流线积分初始步长
_streamFilter->SetMinimumIntegrationStep(0.01);//设置流线积分最小步长
_streamFilter->SetMaximumIntegrationStep(0.5);//设置流线积分最大步长
_streamFilter->SetMaximumNumberOfSteps(1000);//设置流线积分最大步数
_streamFilter->SetTerminalSpeed(1e-12);//设置流线积分终止速度
_streamFilter->SetMaximumError(1e-6);
_streamFilter->SetComputeVorticity(true);
//初始化mapper
vtkDataSetMapper* mapper = vtkDataSetMapper::New();
mapper->SetInputConnection(_streamFilter->GetOutputPort());
_mappers.append(mapper);
}
FITKCFDPostStreamLine::~FITKCFDPostStreamLine()
{
if (_lineSource) {
_lineSource->Delete();
_lineSource = nullptr;
}
if (_streamFilter) {
_streamFilter->Delete();
_streamFilter = nullptr;
}
}
FITKPostDataType FITKCFDPostStreamLine::getPostDataType()
{
return FITKPostDataType::Post_StreamLine;
}
vtkDataSet* FITKCFDPostStreamLine::getOutput()
{
if (_streamFilter == nullptr)return nullptr;
return _streamFilter->GetOutput();
}
void FITKCFDPostStreamLine::setVector(FITKPostFieldType vectorType, QString vectorName)
{
if (_streamFilter == nullptr)return;
_vectorType = vectorType;
_vectorName = vectorName;
QByteArray vectorB = vectorName.toLocal8Bit();
char* v = vectorB.data();
switch (_vectorType){
case Interface::FITKPostFieldType::Post_Point:
_streamFilter->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, v);
break;
case Interface::FITKPostFieldType::Post_Cell:
_streamFilter->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_CELLS, v);
break;
}
}
void FITKCFDPostStreamLine::getVector(FITKPostFieldType& vectorType, QString& vectorName)
{
vectorType = _vectorType;
vectorName = _vectorName;
}
void FITKCFDPostStreamLine::setDirection(FITKPostStreamDirection dir)
{
if (_streamFilter == nullptr)return;
_directionType = dir;
switch (_directionType){
case Interface::FITKPostStreamDirection::Post_Forward:
_streamFilter->SetIntegrationDirectionToBackward();
break;
case Interface::FITKPostStreamDirection::Post_Backward:
_streamFilter->SetIntegrationDirectionToForward();
break;
case Interface::FITKPostStreamDirection::Post_Both:
_streamFilter->SetIntegrationDirectionToBoth();
break;
}
}
FITKPostStreamDirection FITKCFDPostStreamLine::getDirection()
{
return _directionType;
}
void FITKCFDPostStreamLine::setLength(double length)
{
if (_streamFilter) {
//设置流线长度
_streamFilter->SetMaximumPropagation(length);
}
}
double FITKCFDPostStreamLine::getLength()
{
if (_streamFilter) {
//设置流线长度
return _streamFilter->GetMaximumPropagation();
}
return 0.0;
}
void FITKCFDPostStreamLine::setLine(double* startPoint, double* endPoint, int resolution)
{
if (_lineSource == nullptr)return;
_lineSource->SetPoint1(startPoint);
_lineSource->SetPoint2(endPoint);
_lineSource->SetResolution(resolution);
}
void FITKCFDPostStreamLine::getLine(double* startPoint, double* endPoint, int& resolution)
{
if (_lineSource == nullptr)return;
_lineSource->GetPoint1(startPoint);
_lineSource->GetPoint2(endPoint);
resolution = _lineSource->GetResolution();
}
}