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.
AppFlow/GUIDialog/GUICalculateDialog/SolutionWidget.cpp

196 lines
7.7 KiB
C++

#include "SolutionWidget.h"
#include "ui_SolutionWidget.h"
#include "CompSelectComBoxWidget.h"
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKComponents.h"
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
#include "FITK_Kernel/FITKEasyParam/FITKWidgetComLine.h"
#include "FITK_Kernel/FITKEasyParam/FITKWidgetVBox.h"
#include "FITK_Kernel/FITKEasyParam/FITKEasyParamWidgetFactory.h"
#include "FITK_Interface/FITKInterfaceFlowOF/FITKOFPhysicsData.h"
#include "FITK_Interface/FITKInterfaceFlowOF/FITKAbstractOFSolver.h"
#include "FITK_Interface/FITKInterfaceFlowOF/FITKOFSolution.h"
#include "FITK_Kernel/FITKEasyParam/FITKParameter.h"
#include "FITK_Interface/FITKInterfaceFlowOF/FITKOFPhysicsManager.h"
#include "FITK_Interface/FITKInterfaceFlowOF/FITKOFSolutionSolverManager.h"
#include "FITK_Interface/FITKInterfaceFlowOF/FITKFlowPhysicsHandlerFactory.h"
#include "FITK_Interface/FITKInterfaceFlowOF/FITKOFSolutionSolver.h"
#include "FITK_Component/FITKWidget/FITKTabWidget.h"
#include <QToolBox>
namespace GUI
{
Core::FITKParameter* solutionGetSubData(const QString & type, CompSelectComBoxWidget* widget)
{
if (widget == nullptr)return nullptr;
auto phyFactory = FITKAPP->getComponents()->getComponentTByName<Interface::FITKFlowPhysicsHandlerFactory>("FITKFlowPhysicsHandlerFactory");
if (phyFactory == nullptr)return nullptr;
auto phyData = FITKAPP->getGlobalData()->getPhysicsData<Interface::FITKOFPhysicsData>();
if (phyData == nullptr)return nullptr;
int index = widget->getData("index").toInt();
phyFactory->setSolutionSolver(index, type);
Interface::FITKOFAlgebraicEquationsPara* solution = phyData->getSolution()->getSolverVariablePara(index);
if (solution == nullptr)return nullptr;
Interface::FITKOFAbsSolutionSolver* solver = solution->getSolutionSolver();
if (solver == nullptr)return nullptr;
return solver->getSolverSolutionPara();
}
SolutionWidget::SolutionWidget(EventOper::ParaWidgetInterfaceOperator * oper, QWidget * parent) :
GUICalculateWidgetBase(oper, parent)
{
_ui = new Ui::SolutionWidget();
_ui->setupUi(this);
init();
}
SolutionWidget::~SolutionWidget()
{
if (_ui) delete _ui;
}
void SolutionWidget::init()
{
if (_physicsData == nullptr)return;
_solValue = _physicsData->getSolution();
updateSlovers();
updateSlover();
updateResiduals();
updateRelaxation();
updateLimits();
}
void SolutionWidget::showEvent(QShowEvent * event)
{
Q_UNUSED(event);
int width = _ui->tabWidget->width();
int tabCount = _ui->tabWidget->count();
int tabWidth = width / tabCount;
_ui->tabWidget->tabBar()->setStyleSheet(QString("QTabBar::tab{width:%1px;height:30px;}").arg(tabWidth));
}
void SolutionWidget::resizeEvent(QResizeEvent * event)
{
Q_UNUSED(event);
int width = _ui->tabWidget->width();
int tabCount = _ui->tabWidget->count();
int tabWidth = width / tabCount;
_ui->tabWidget->tabBar()->setStyleSheet(QString("QTabBar::tab{width:%1px;height:30px;}").arg(tabWidth));
}
void SolutionWidget::updateSlovers()
{
if (_physicsManager == nullptr)return;
auto solutionManager = _physicsManager->getSolutionSolverManager();
if (solutionManager == nullptr)return;
if (_factoryData == nullptr)return;
if (_solValue == nullptr)return;
int solversNum = _solValue->getSolversCount();
QTabWidget* tabWidget = new Comp::FITKTabWidget(Comp::FITKTabWidgetType::FITKTab_Auto, this);
for (int i = 0; i < solversNum; i++) {
Interface::FITKOFAlgebraicEquationsPara* solversData = _solValue->getSolverVariablePara(i);
if(solversData == nullptr)continue;
QString type = solversData->getVariableName();
QList<QWidget*> widgetList = {};
//其余数据添加
Core::FITKParameter* solverOther = solversData->getSolverAdditionalPara();
if(solverOther){
for (auto d : solverOther->getParameter()) {
if (d == nullptr)continue;
QWidget* w = new Core::FITKWidgetComLine(d, this);
widgetList.append(w);
}
}
//Solver数据添加
Interface::FITKOFAbsSolutionSolver* solver = solversData->getSolutionSolver();
if (solver) {
QStringList options = solutionManager->filterSolutionSolvers(type, _physicsData->getSolver()->getSolverType());
CompSelectComBoxWidget* comp = new CompSelectComBoxWidget("Solver", tabWidget);
comp->setData("index", i);
comp->setFunction(&solutionGetSubData);
comp->setOptions(options);
comp->setCurrentText(solver->getDataObjectName());
comp->setSubWidgetData(solver->getSolverSolutionPara());
widgetList.append(comp);
}
Core::FITKWidgetVBox* widget = new Core::FITKWidgetVBox(widgetList, this);
tabWidget->addTab(widget, type);
}
_ui->verticalLayout_Solvers->addWidget(tabWidget);
}
void SolutionWidget::updateSlover()
{
if (_physicsData == nullptr)return;
auto solver = _physicsData->getSolver();
if (solver == nullptr)return;
_ui->tabWidget->setTabText(1, solver->getDataObjectName());
if (_solValue == nullptr)return;
auto solverValue = _solValue->getSolverSpeciallyDataPara();
if (solverValue == nullptr)return;
for (auto value : solverValue->getParameter()) {
if (value == nullptr)continue;
QWidget* widget = new Core::FITKWidgetComLine(value, this);
_ui->verticalLayout_Solver->addWidget(widget);
}
}
void SolutionWidget::updateResiduals()
{
if (_solValue == nullptr)return;
Comp::FITKTabWidget* tabWidget = new Comp::FITKTabWidget(Comp::FITKTabWidgetType::FITKTab_Auto, this);
int resNum = _solValue->getResidualsCount();
for (int i = 0; i < resNum; i++) {
QString name = _solValue->getResidualVariableName(i);
auto value = _solValue->getResidualVariablePara(i);
QList<QWidget*> widgets = {};
for (auto v : value->getParameter()) {
if (v == nullptr)return;
QWidget* widget = new Core::FITKWidgetComLine(v, this);
widgets.append(widget);
}
Core::FITKWidgetVBox* VBoxWidget = new Core::FITKWidgetVBox(widgets, this);
tabWidget->addTab(VBoxWidget, name);
}
_ui->verticalLayout_Residuals->addWidget(tabWidget);
}
void SolutionWidget::updateRelaxation()
{
if (_solValue == nullptr)return;
auto relValue = _solValue->getRelaxation();
if (relValue == nullptr)return;
for (auto v : relValue->getParameter()) {
if (v == nullptr)continue;
QWidget* widget = new Core::FITKWidgetComLine(v, this);
_ui->verticalLayout_Relaxation->addWidget(widget);
}
}
void SolutionWidget::updateLimits()
{
if (_solValue == nullptr)return;
auto limValue = _solValue->getLimits();
if (limValue == nullptr)return;
for (auto v : limValue->getParameter()) {
if (v == nullptr)continue;
QWidget* widget = Core::FITKEasyParamWidgetFactory::createWidget(v, this);
_ui->verticalLayout_Limits->addWidget(widget);
}
}
}