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.

269 lines
9.0 KiB
C++

#include "LightSubWidget.h"
#include "ui_LightSubWidget.h"
#include "GUIFrame/MainWindow.h"
#include "GUIFrame/RenderWidget.h"
#include "OperatorsInterface/GraphEventOperator.h"
#include "OperatorsInterface/ParaWidgetInterfaceOperator.h"
#include "PostGraphAdaptor/PostGraphWidgetLine.h"
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
#include "FITK_Kernel/FITKCore/FITKOperatorRepo.h"
#include "FITK_Kernel/FITKCore/FITKActionOperator.h"
#include "FITK_Interface/FITKInterfaceCFDPost/FITKCFDPostLightManager.h"
#include "FITK_Interface/FITKInterfaceCFDPost/FITKCFDPostEnum.h"
#include <QAction>
#include <QColor>
#include <QColorDialog>
Q_DECLARE_METATYPE(Interface::FITKPostLightType)
namespace GUI
{
LightSubWidget::LightSubWidget(int currentDataID, QWidget* parent) :
GUIWidgetBase(parent)
{
_ui = new Ui::LightSubWidget();
_ui->setupUi(this);
_currentDataID = currentDataID;
init();
}
LightSubWidget::~LightSubWidget()
{
//if (_lineWidget) {
// _lineWidget->setIsShow(false);
// delete _lineWidget;
// _lineWidget = nullptr;
//}
if (_ui) {
delete _ui;
_ui = nullptr;
}
}
void LightSubWidget::init()
{
QSignalBlocker blocker(_ui->comboBox_Type);
int index = _postLightManager->getDataIndex(_postLightManager->getDataByID(_currentDataID));
_ui->label_Title->setText(QString("Light %1").arg(index));
_ui->comboBox_Type->addItem(tr("Directional"), QVariant::fromValue(Interface::FITKPostLightType::Post_Direction));
_ui->comboBox_Type->addItem(tr("Positional"), QVariant::fromValue(Interface::FITKPostLightType::Post_Positional));
double range[2] = { 0,90 };
_ui->lineEdit_ConeAngle->setRange(range);
setDataToWidget(_postLightManager->getDataByID(_currentDataID));
connect(_ui->lineEdit_FocX, SIGNAL(dataChanged()), this, SLOT(slotValueChange()));
connect(_ui->lineEdit_FocY, SIGNAL(dataChanged()), this, SLOT(slotValueChange()));
connect(_ui->lineEdit_FocZ, SIGNAL(dataChanged()), this, SLOT(slotValueChange()));
connect(_ui->lineEdit_PosX, SIGNAL(dataChanged()), this, SLOT(slotValueChange()));
connect(_ui->lineEdit_PosY, SIGNAL(dataChanged()), this, SLOT(slotValueChange()));
connect(_ui->lineEdit_PosZ, SIGNAL(dataChanged()), this, SLOT(slotValueChange()));
connect(_ui->lineEdit_ConeAngle, SIGNAL(dataChanged()), this, SLOT(slotValueChange()));
MainWindow* mainWin = FITKAPP->getGlobalData()->getMainWindowT<MainWindow>();
if (mainWin == nullptr)return;
QWidget* currentWidget = mainWin->getRenderWidget()->getCurrentWidget();
//_lineWidget = new Interface::PostGraphWidgetLine(currentWidget);
//connect(_lineWidget, SIGNAL(sigValueChange(double*, double*)), this, SLOT(slotVTKLineWidgetValueChange(double*, double*)));
slotValueChange();
}
void LightSubWidget::setWidgetTitle(QString title)
{
_ui->label_Title->setText(title);
}
void LightSubWidget::showEvent(QShowEvent * event)
{
//if (_lineWidget) {
// _lineWidget->setIsShow(true);
reRender();
//}
GUIWidgetBase::showEvent(event);
}
void LightSubWidget::closeEvent(QCloseEvent * event)
{
//if (_lineWidget) {
// _lineWidget->setIsShow(false);
// delete _lineWidget;
// _lineWidget = nullptr;
reRender();
//}
GUIWidgetBase::closeEvent(event);
}
void LightSubWidget::on_pushButton_Remove_clicked()
{
QAction lightDeleteAction;
lightDeleteAction.setObjectName("actionLightDelete");
auto acOper = Core::FITKOperatorRepo::getInstance()->getOperatorT<Core::FITKActionOperator>("actionLightDelete");
if (acOper == nullptr)return;
acOper->setEmitter(&lightDeleteAction);
acOper->setArgs(objID_String, _currentDataID);
acOper->actionTriggered();
reRender();
this->close();
}
void LightSubWidget::on_comboBox_Type_currentIndexChanged(int index)
{
Q_UNUSED(index);
Interface::FITKPostLightType type = _ui->comboBox_Type->currentData().value<Interface::FITKPostLightType>();
switch (type){
case Interface::FITKPostLightType::Post_Positional: {
_ui->label_ConeAngle->show();
_ui->lineEdit_ConeAngle->show();
break;
}
case Interface::FITKPostLightType::Post_Direction: {
_ui->label_ConeAngle->hide();
_ui->lineEdit_ConeAngle->hide();
break;
}
}
slotValueChange();
}
void LightSubWidget::on_pushButton_SelectColor_clicked()
{
Interface::FITKCFDPostLight* lightData = _postLightManager->getDataByID(_currentDataID);
if (lightData == nullptr)return;
double color[3] = { 0,0,0 };
lightData->getColor(color);
QColor c;
c.setRedF(color[0]);
c.setGreenF(color[1]);
c.setBlueF(color[2]);
QColorDialog dialog(this);
dialog.setCurrentColor(c);
dialog.exec();
c = dialog.currentColor();
color[0] = c.redF();
color[1] = c.greenF();
color[2] = c.blueF();
lightData->setColor(color);
QPalette gradientPalette;
gradientPalette.setColor(QPalette::Button, c);
_ui->pushButton_SelectColor->setPalette(gradientPalette);
slotValueChange();
}
void LightSubWidget::slotValueChange()
{
Interface::FITKCFDPostLight* lightData = _postLightManager->getDataByID(_currentDataID);
if (lightData == nullptr)return;
//if (_lineWidget == nullptr)return;
double foc[3] = { 0,0,0 }, pos[3] = { 0,0,0 }, coneAngle = 0.0;
foc[0] = _ui->lineEdit_FocX->value();
foc[1] = _ui->lineEdit_FocY->value();
foc[2] = _ui->lineEdit_FocZ->value();
pos[0] = _ui->lineEdit_PosX->value();
pos[1] = _ui->lineEdit_PosY->value();
pos[2] = _ui->lineEdit_PosZ->value();
coneAngle = _ui->lineEdit_ConeAngle->value();
Interface::FITKPostLightType type = _ui->comboBox_Type->currentData().value<Interface::FITKPostLightType>();
//_lineWidget->setLine(pos, foc);
lightData->setFocalPoint(foc);
lightData->setPosition(pos);
lightData->setConeAngle(coneAngle);
lightData->setLightType(type);
//更新渲染窗口
EventOper::GraphEventOperator* graphOper = FITKOPERREPO->getOperatorT<EventOper::GraphEventOperator>("OperGraphPreprocess");
if (graphOper) {
graphOper->updateLight(_currentDataID);
}
}
void LightSubWidget::slotVTKLineWidgetValueChange(double * startPoint, double * endPoint)
{
//if (_lineWidget == nullptr)return;
//_ui->lineEdit_PosX->setValue(startPoint[0]);
//_ui->lineEdit_PosY->setValue(startPoint[1]);
//_ui->lineEdit_PosZ->setValue(startPoint[2]);
//_ui->lineEdit_FocX->setValue(endPoint[0]);
//_ui->lineEdit_FocY->setValue(endPoint[1]);
//_ui->lineEdit_FocZ->setValue(endPoint[2]);
//slotValueChange();
}
void LightSubWidget::setDataToWidget(Interface::FITKCFDPostLight * data)
{
QSignalBlocker blocker(_ui->comboBox_Type);
if (data == nullptr)return;
//设置类型
Interface::FITKPostLightType type = data->getLightType();
int typeIndex = _ui->comboBox_Type->findData(QVariant::fromValue(type));
_ui->comboBox_Type->setCurrentIndex(typeIndex);
switch (type) {
case Interface::FITKPostLightType::Post_Positional: {
_ui->label_ConeAngle->show();
_ui->lineEdit_ConeAngle->show();
break;
}
case Interface::FITKPostLightType::Post_Direction: {
_ui->label_ConeAngle->hide();
_ui->lineEdit_ConeAngle->hide();
break;
}
}
//灯光位置
double position[3] = { 0,0,0 };
data->getPosition(position);
_ui->lineEdit_PosX->setValue(position[0]);
_ui->lineEdit_PosY->setValue(position[1]);
_ui->lineEdit_PosZ->setValue(position[2]);
//灯光焦点
double focalPoint[3] = { 0,0,0 };
data->getFocalPoint(focalPoint);
_ui->lineEdit_FocX->setValue(focalPoint[0]);
_ui->lineEdit_FocY->setValue(focalPoint[1]);
_ui->lineEdit_FocZ->setValue(focalPoint[2]);
//灯光角度
double coneAngle = 0;
coneAngle = data->getConeAngle();
_ui->lineEdit_ConeAngle->setValue(coneAngle);
//颜色
double color[3] = { 0,0,0 };
data->getColor(color);
QColor c;
c.setRedF(color[0]);
c.setGreenF(color[1]);
c.setBlueF(color[2]);
QPalette gradientPalette;
gradientPalette.setColor(QPalette::Button, c);
_ui->pushButton_SelectColor->setPalette(gradientPalette);
}
}