#include "ClipSliceWidgetCylinder.h" #include "ui_ClipSliceWidgetCylinder.h" #include "GUIFrame/MainWindow.h" #include "GUIFrame/RenderWidget.h" #include "PostGraphAdaptor/PostGraphWidgetCylinder.h" #include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h" #include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h" #include "FITK_Interface/FITKInterfaceCFDPost/FITKCFDPostClipCylinder.h" #include "FITK_Interface/FITKInterfaceCFDPost/FITKCFDPostSliceCylinder.h" #include namespace GUI { ClipSliceWidgetCylinder::ClipSliceWidgetCylinder(ClipSlice widgetType, int currentDataID, int parentDataID, QWidget * parent) : ClipSliceWidgetBase(widgetType, parent), _parentDataID(parentDataID) { _currentDataID = currentDataID; _ui = new Ui::ClipSliceWidgetCylinder(); _ui->setupUi(this); MainWindow* mainWin = FITKAPP->getGlobalData()->getMainWindowT(); if (mainWin == nullptr)return; QWidget* currentWidget = mainWin->getRenderWidget()->getCurrentWidget(); _cylinderWidget = new Interface::PostGraphWidgetCylinder(currentWidget); connect(_cylinderWidget, SIGNAL(sigValueChange(double*,double*,double)), this, SLOT(slotVTKWidgetValueChange(double*, double*, double))); connect(_ui->lineEdit_CenterX, SIGNAL(dataChanged()), this, SLOT(slotDataChange())); connect(_ui->lineEdit_CenterY, SIGNAL(dataChanged()), this, SLOT(slotDataChange())); connect(_ui->lineEdit_CenterZ, SIGNAL(dataChanged()), this, SLOT(slotDataChange())); connect(_ui->lineEdit_AxisX, SIGNAL(dataChanged()), this, SLOT(slotDataChange())); connect(_ui->lineEdit_AxisY, SIGNAL(dataChanged()), this, SLOT(slotDataChange())); connect(_ui->lineEdit_AxisZ, SIGNAL(dataChanged()), this, SLOT(slotDataChange())); connect(_ui->lineEdit_Radius, SIGNAL(dataChanged()), this, SLOT(slotDataChange())); } ClipSliceWidgetCylinder::~ClipSliceWidgetCylinder() { if (_ui) { delete _ui; _ui = nullptr; } if (_cylinderWidget) { delete _cylinderWidget; _cylinderWidget = nullptr; } } void ClipSliceWidgetCylinder::getDataFromWidget(Interface::FITKAbstractCFDPostData * postData) { double center[3] = { 0,0,0 }, axis[3] = { 0,1,0 }, radius = 0; center[0] = _ui->lineEdit_CenterX->value(); center[1] = _ui->lineEdit_CenterY->value(); center[2] = _ui->lineEdit_CenterZ->value(); axis[0] = _ui->lineEdit_AxisX->value(); axis[1] = _ui->lineEdit_AxisY->value(); axis[2] = _ui->lineEdit_AxisZ->value(); radius = _ui->lineEdit_Radius->value(); switch (_widgetType) { case GUI::ClipSlice::None:break; case GUI::ClipSlice::Clip: { Interface::FITKCFDPostClipCylinder* currentData = dynamic_cast(postData); if (currentData) { currentData->setValue(center, axis, radius); } break; } case GUI::ClipSlice::Slice: { Interface::FITKCFDPostSliceCylinder* currentData = dynamic_cast(postData); if (currentData) { currentData->setValue(center, axis, radius); } break; } } } void ClipSliceWidgetCylinder::setDataToWidget(Interface::FITKAbstractCFDPostData * postParentData, Interface::FITKAbstractCFDPostData * postData) { //获取边界、中心点、轴向 double bounds[6] = { 0,0,0,0,0,0 }; double center[3] = { 0,0,0 }, axis[3] = { 0,1,0 }, radius = 0; if (postParentData) { postParentData->getOrigin(center); postParentData->getBounds(bounds); double X = std::abs(bounds[1] - bounds[0]) / 2.0; double Z = std::abs(bounds[5] - bounds[4]) / 2.0; radius = (X < Z) ? X : Z; } switch (_widgetType) { case GUI::ClipSlice::None:return; case GUI::ClipSlice::Clip: { Interface::FITKCFDPostClipCylinder* currentData = dynamic_cast(postData); if (currentData) { currentData->getValue(center, axis, radius); } break; } case GUI::ClipSlice::Slice: Interface::FITKCFDPostSliceCylinder* currentData = dynamic_cast(postData); if (currentData) { currentData->getValue(center, axis, radius); } break; } _ui->lineEdit_CenterX->setValue(center[0]); _ui->lineEdit_CenterY->setValue(center[1]); _ui->lineEdit_CenterZ->setValue(center[2]); _ui->lineEdit_AxisX->setValue(axis[0]); _ui->lineEdit_AxisY->setValue(axis[1]); _ui->lineEdit_AxisZ->setValue(axis[2]); _ui->lineEdit_Radius->setValue(radius); _cylinderWidget->setBounds(bounds); _cylinderWidget->setValue(center, axis, radius); } void ClipSliceWidgetCylinder::showEvent(QShowEvent * event) { if (_cylinderWidget) { _cylinderWidget->setIsShow(true); reRender(); } ClipSliceWidgetBase::showEvent(event); } void ClipSliceWidgetCylinder::closeEvent(QCloseEvent * event) { if (_cylinderWidget) { _cylinderWidget->setIsShow(false); delete _cylinderWidget; _cylinderWidget = nullptr; reRender(); } ClipSliceWidgetBase::closeEvent(event); } void ClipSliceWidgetCylinder::hideEvent(QHideEvent * event) { if (_cylinderWidget) { _cylinderWidget->setIsShow(false); delete _cylinderWidget; _cylinderWidget = nullptr; reRender(); } ClipSliceWidgetBase::hideEvent(event); } void ClipSliceWidgetCylinder::slotVTKWidgetValueChange(double* center, double* axis, double radius) { if (_ui == nullptr)return; _ui->lineEdit_CenterX->setValue(center[0]); _ui->lineEdit_CenterY->setValue(center[1]); _ui->lineEdit_CenterZ->setValue(center[2]); _ui->lineEdit_AxisX->setValue(axis[0]); _ui->lineEdit_AxisY->setValue(axis[1]); _ui->lineEdit_AxisZ->setValue(axis[2]); _ui->lineEdit_Radius->setValue(radius); } void ClipSliceWidgetCylinder::slotDataChange() { if (_cylinderWidget == nullptr)return; double center[3] = { 0,0,0 }, axis[3] = { 0,0,0 }, radius = 0; center[0] = _ui->lineEdit_CenterX->value(); center[1] = _ui->lineEdit_CenterY->value(); center[2] = _ui->lineEdit_CenterZ->value(); axis[0] = _ui->lineEdit_AxisX->value(); axis[1] = _ui->lineEdit_AxisY->value(); axis[2] = _ui->lineEdit_AxisZ->value(); radius = _ui->lineEdit_Radius->value(); _cylinderWidget->setValue(center, axis, radius); reRender(); } }