#include "FITKCFDPostStreamLine.h" #include "FITKCFDPost3DManager.h" #include "FITKCFDPostData.h" #include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h" #include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h" #include #include #include namespace Interface { FITKCFDPostStreamLine::FITKCFDPostStreamLine(int parentID) { _CFDPostParentID = parentID; Interface::FITKCFDPost3DManager* dataManger = FITKAPP->getGlobalData()->getPostData()->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(); } }