From f0f41f9a174c7efaca5da0d865ef9cc72584ed8b Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Thu, 8 Jan 2026 10:23:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HPPA/HPPA.cpp | 194 +++++++++++++++++++++++++------------- HPPA/HPPA.h | 24 ++++- HPPA/HPPA.ui | 14 +-- HPPA/HPPA.vcxproj | 2 + HPPA/HPPA.vcxproj.filters | 6 ++ HPPA/OneMotorControl.cpp | 2 + HPPA/OneMotorControl.h | 2 + HPPA/TabManager.cpp | 61 ++++++++++++ HPPA/TabManager.h | 32 +++++++ HPPA/View3D.cpp | 50 ++++++++-- HPPA/View3D.h | 43 ++++++++- HPPA/twoMotorControl.ui | 22 ++--- 12 files changed, 354 insertions(+), 98 deletions(-) create mode 100644 HPPA/TabManager.cpp create mode 100644 HPPA/TabManager.h diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index bf5ca7c..76f8546 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -105,6 +105,7 @@ HPPA::HPPA(QWidget* parent) setDockNestingEnabled(true); connect(this->ui.action_about, SIGNAL(triggered()), this, SLOT(onAbout())); connect(this->ui.mActionOneMotorScenario, SIGNAL(triggered()), this, SLOT(createOneMotorScenario())); + connect(this->ui.mActionPlantPhenotypeScenario, SIGNAL(triggered()), this, SLOT(createPlantPhenotypeScenario())); delete ui.centralWidget; @@ -125,10 +126,6 @@ HPPA::HPPA(QWidget* parent) ui.mDockWidgetSimulator->setTile(QString::fromLocal8Bit("3D模型")); ui.mDockWidgetSpectrometer->setTile(QString::fromLocal8Bit("控制")); - m_view3D_tmp = new View3D("D:\\cpp_project_vs2022\\HPPA\\x64\\Debug\\3DModel\\HPPA_frame.obj", "D:\\cpp_project_vs2022\\HPPA\\x64\\Debug\\3DModel\\HPPA_camera.obj"); - - ui.mDockWidgetSimulator->setWidget(m_view3D_tmp); - //TOC CustomDockWidgetBase* dock_layers = new CustomDockWidgetBase(QString::fromLocal8Bit("layers"), this); dock_layers->setObjectName("mDockLayers"); @@ -314,8 +311,8 @@ HPPA::HPPA(QWidget* parent) m_carousel->addWidget(sa); m_carousel->addWidget(new QLabel("1")); - m_carousel->addWidget(new QLabel("2")); - m_carousel->addWidget(new QLabel("3")); + //m_carousel->addWidget(new QLabel("2")); + //m_carousel->addWidget(new QLabel("3")); //m_carousel->addWidget(new QLabel("4")); //m_carousel->addWidget(new QLabel("5")); //m_carousel->addWidget(new QLabel("6")); @@ -334,6 +331,7 @@ HPPA::HPPA(QWidget* parent) m_dock_carousel->setWidget(m_carousel); initControlTabwidget(); + m_tabManager = new TabManager(ui.controlTabWidget, this); splitDockWidget(dock_layers, dock_hyperimgViewer, Qt::Horizontal); @@ -393,6 +391,9 @@ HPPA::HPPA(QWidget* parent) createMoveplatformActionGroup(); connect(moveplatformActionGroup, &QActionGroup::triggered, this, &HPPA::selectingMoveplatform); + createScenarioActionGroup(); + connect(m_ScenarioActionGroup, &QActionGroup::triggered, this, &HPPA::selectScenario); + ui.mDockWidgetSimulator->setFeatures(QDockWidget::DockWidgetClosable); QString strPath = QCoreApplication::applicationDirPath() + "/UILayout.ini"; @@ -522,8 +523,8 @@ void HPPA::initControlTabwidget() { ui.controlTabWidget->removeTab(1); - QWidget* videoWidget = new QWidget(); - QVBoxLayout* vBoxLayout_videoWidget = new QVBoxLayout(videoWidget); + m_videoWidget = new QWidget(); + QVBoxLayout* vBoxLayout_videoWidget = new QVBoxLayout(m_videoWidget); vBoxLayout_videoWidget->setSpacing(6); vBoxLayout_videoWidget->setObjectName(QString::fromUtf8("vBoxLayout_videoWidget")); @@ -550,37 +551,36 @@ void HPPA::initControlTabwidget() connect(m_close_rgb_camera_btn, SIGNAL(clicked()), this, SLOT(onCloseRgbCamera()));//关闭相机 connect(m_RgbCamera, SIGNAL(CamClosed()), this, SLOT(onClearLabel())); - ui.controlTabWidget->addTab(videoWidget, QString::fromLocal8Bit("rgb相机")); + ui.controlTabWidget->addTab(m_videoWidget, QString::fromLocal8Bit("rgb相机")); //升降桌dock - adjustTable* adt = new adjustTable(); - adt->setWindowFlags(Qt::Widget); - ui.controlTabWidget->addTab(adt, QString::fromLocal8Bit("升降桌")); + m_adt = new adjustTable(); + m_adt->setWindowFlags(Qt::Widget); + ui.controlTabWidget->addTab(m_adt, QString::fromLocal8Bit("升降桌")); //电源控制 - PowerControl* pc = new PowerControl(); - pc->setWindowFlags(Qt::Widget); - ui.controlTabWidget->addTab(pc, QString::fromLocal8Bit("电源控制")); + m_pc = new PowerControl(); + m_pc->setWindowFlags(Qt::Widget); + ui.controlTabWidget->addTab(m_pc, QString::fromLocal8Bit("电源控制")); //机械臂控制 - rac = new RobotArmControl(); - connect(rac->robotController, SIGNAL(hsiRecordSignal(int)), this, SLOT(recordFromRobotArm(int))); - rac->setWindowFlags(Qt::Widget); - ui.controlTabWidget->addTab(rac, QString::fromLocal8Bit("机械臂控制")); + m_rac = new RobotArmControl(); + connect(m_rac->robotController, SIGNAL(hsiRecordSignal(int)), this, SLOT(recordFromRobotArm(int))); + m_rac->setWindowFlags(Qt::Widget); + ui.controlTabWidget->addTab(m_rac, QString::fromLocal8Bit("机械臂控制")); //1轴马达控制 - omc = new OneMotorControl(); - omc->setWindowFlags(Qt::Widget); - ui.controlTabWidget->addTab(omc, QString::fromLocal8Bit("1轴马达控制")); + m_omc = new OneMotorControl(); + m_omc->setWindowFlags(Qt::Widget); + ui.controlTabWidget->addTab(m_omc, QString::fromLocal8Bit("1轴马达控制")); //2轴马达控制 - tmc = new TwoMotorControl(this); - connect(tmc, SIGNAL(startLineNumSignal(int)), this, SLOT(onCreateTab(int))); - connect(tmc, SIGNAL(sequenceComplete()), this, SLOT(onsequenceComplete())); - connect(tmc, SIGNAL(broadcastLocationSignal(std::vector)), m_view3D_tmp, SLOT(setLoc(std::vector))); - tmc->setWindowFlags(Qt::Widget); - ui.controlTabWidget->addTab(tmc, QString::fromLocal8Bit("2轴控制")); + m_tmc = new TwoMotorControl(this); + connect(m_tmc, SIGNAL(startLineNumSignal(int)), this, SLOT(onCreateTab(int))); + connect(m_tmc, SIGNAL(sequenceComplete()), this, SLOT(onsequenceComplete())); + m_tmc->setWindowFlags(Qt::Widget); + ui.controlTabWidget->addTab(m_tmc, QString::fromLocal8Bit("2轴控制")); } void HPPA::recordFromRobotArm(int fileCounter) @@ -726,35 +726,103 @@ void HPPA::initPanelToolbar() mToolbarMenu->addAction(ui.mainToolBar->toggleViewAction()); } +void HPPA::createScenarioActionGroup() +{ + m_ScenarioActionGroup = new QActionGroup(this); + m_ScenarioActionGroup->addAction(ui.mActionOneMotorScenario); + m_ScenarioActionGroup->addAction(ui.mActionPlantPhenotypeScenario); + + // 读取上次选择的结果 + QSettings settings; + QString lastSelectedAction = settings.value("LastSelectedScenario").toString(); + + // 恢复上次选择的结果 + if (lastSelectedAction == "mActionOneMotorScenario") + { + ui.mActionOneMotorScenario->setChecked(true); + ui.mActionOneMotorScenario->trigger(); + } + else if (lastSelectedAction == "mActionPlantPhenotypeScenario") + { + ui.mActionPlantPhenotypeScenario->setChecked(true); + ui.mActionPlantPhenotypeScenario->trigger(); + } +} + +void HPPA::selectScenario(QAction* selectedAction) +{ + QSettings settings; + settings.setValue("LastSelectedScenario", selectedAction->objectName()); + settings.sync(); +} + void HPPA::createOneMotorScenario() { + //if (ui.mActionOneMotorScenario->isChecked()) + // return; + //清除所有DockWidget - //this->removeDockWidget(ui.mDockWidgetSpectrometer); - QList dockWidgets = this->findChildren(); - for (QDockWidget* dock : dockWidgets) - { - dock->hide(); - } + //QList dockWidgets = this->findChildren(); + //for (QDockWidget* dock : dockWidgets) + //{ + // dock->hide(); + //} - ui.mDockWidgetSpectrometer->show(); + //在菜单中选择移动平台 + ui.mAction_1AxisMotor->setChecked(true); - //tabifyDockWidget(ui.mDockWidgetSpectrometer, dock_omc); + //右下角控制tab + m_tabManager->hideTab(m_videoWidget); + m_tabManager->hideTab(m_adt); + m_tabManager->hideTab(m_pc); + m_tabManager->hideTab(m_rac); + m_tabManager->hideTab(m_tmc); - //addDockWidget(Qt::RightDockWidgetArea, ui.mDockWidgetSpectrometer); + m_tabManager->showTab(m_omc); - //QDockWidget* dockTop = new QDockWidget(QString::fromLocal8Bit("1"), this); - //QDockWidget* dockBottom = new QDockWidget(QString::fromLocal8Bit("2"), this); - //QDockWidget* dockBottom3 = new QDockWidget(QString::fromLocal8Bit("3"), this); + //打开对应的3D模型 + QString basePath = QCoreApplication::applicationDirPath(); + QString model1 = basePath + "/3DModel/linear_stage_indoor1.obj"; + QString model2 = basePath + "/3DModel/linear_stage_indoor2.obj"; + m_view3DLinearStage = new View3DLinearStage(model1, model2); + m_view3DLinearStage->setViewCenter(500, 100, 500); + m_view3DLinearStage->setDistance(1000); + ui.mDockWidgetSimulator->setWidget(m_view3DLinearStage); + connect(m_omc, SIGNAL(broadcastLocationSignal(std::vector)), m_view3DLinearStage, SLOT(setLoc(std::vector))); - //// 添加右上角 dock - //addDockWidget(Qt::RightDockWidgetArea, dockTop); + //右上角轮播 - //// 添加右下角 dock,初始也在右侧 - //addDockWidget(Qt::RightDockWidgetArea, dockBottom); - //addDockWidget(Qt::RightDockWidgetArea, dockBottom3); +} + +void HPPA::createPlantPhenotypeScenario() +{ + //if (ui.mActionPlantPhenotypeScenario->isChecked()) + // return; + + //在菜单中选择移动平台 + ui.mAction_2AxisMotor_new->setChecked(true); + + //右下角控制tab + m_tabManager->hideTab(m_rac); + m_tabManager->hideTab(m_omc); + + m_tabManager->showTab(m_videoWidget); + m_tabManager->showTab(m_adt); + m_tabManager->showTab(m_pc); + m_tabManager->showTab(m_tmc); + + //打开对应的3D模型 + QString basePath = QCoreApplication::applicationDirPath(); + QString model1 = basePath + "/3DModel/HPPA_frame.obj"; + QString model2 = basePath + "/3DModel/HPPA_camera.obj"; + m_view3DPlantPhenotype = new View3DPlantPhenotype(model1, model2); + m_view3DPlantPhenotype->setViewCenter(1000, 1000, -1000); + m_view3DPlantPhenotype->setDistance(5000); + ui.mDockWidgetSimulator->setWidget(m_view3DPlantPhenotype); + connect(m_tmc, SIGNAL(broadcastLocationSignal(std::vector)), m_view3DPlantPhenotype, SLOT(setLoc(std::vector))); + + //右上角轮播 - // 将右下角 dock 分割到右上 dock 的下方 - //splitDockWidget(dockTop, dockBottom, Qt::Horizontal); } void HPPA::CalculateIntegratioinTimeRange() @@ -854,12 +922,12 @@ void HPPA::onStartRecordStep1() //应该先控制马达运动,当马达运动后,再开始光谱仪采集(发射开始采集信号) m_Imager->setFileName2Save(imgPath); m_Imager->setFrameNumber(this->frame_number->text().toInt()); - omc->setImager(m_Imager); - omc->run(); + m_omc->setImager(m_Imager); + m_omc->run(); } else { - omc->stop(); + m_omc->stop(); m_RecordState -= 1; ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); @@ -877,16 +945,16 @@ void HPPA::onStartRecordStep1() m_Imager->setFileName2Save(imgPath); m_Imager->setFrameNumber(this->frame_number->text().toInt()); - tmc->setImager(m_Imager); - tmc->setPosFileName(QString::fromStdString(x_location)); - tmc->run(); + m_tmc->setImager(m_Imager); + m_tmc->setPosFileName(QString::fromStdString(x_location)); + m_tmc->run(); ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}"); } else { - tmc->stop(); + m_tmc->stop(); m_RecordState--; @@ -901,7 +969,7 @@ void HPPA::onStartRecordStep1() //先判断是否选择了任务,执行函数RobotArmControl::executeTask,修复界面显示bug m_Imager->setFileName2Save(imgPath); m_Imager->setFrameNumber(this->frame_number->text().toInt()); - rac->executeTaskWithHyperImager(); + m_rac->executeTaskWithHyperImager(); return; } @@ -1439,13 +1507,13 @@ void HPPA::onDark() } else if (checkedName == "mAction_1AxisMotor") { - omc->setImager(m_Imager); - omc->record_dark(); + m_omc->setImager(m_Imager); + m_omc->record_dark(); } else if (checkedName == "mAction_2AxisMotor_new") { - tmc->setImager(m_Imager); - tmc->record_dark(); + m_tmc->setImager(m_Imager); + m_tmc->record_dark(); return; } } @@ -1469,13 +1537,13 @@ void HPPA::onReference() } else if (checkedName == "mAction_1AxisMotor") { - omc->setImager(m_Imager); - omc->record_white(); + m_omc->setImager(m_Imager); + m_omc->record_white(); } else if (checkedName == "mAction_2AxisMotor_new") { - tmc->setImager(m_Imager); - tmc->record_white(); + m_tmc->setImager(m_Imager); + m_tmc->record_white(); return; } } diff --git a/HPPA/HPPA.h b/HPPA/HPPA.h index 920df33..515adb4 100644 --- a/HPPA/HPPA.h +++ b/HPPA/HPPA.h @@ -47,6 +47,7 @@ #include "Carousel.h" #include "View3D.h" +#include "TabManager.h" #define PI 3.1415926 @@ -218,13 +219,16 @@ private: QActionGroup* mImagerGroup = nullptr; void createActionGroups(); void selectingImager(QAction* selectedAction); + QActionGroup* moveplatformActionGroup = nullptr; void createMoveplatformActionGroup(); void selectingMoveplatform(QAction* selectedAction); - RobotArmControl* rac; - OneMotorControl* omc; - TwoMotorControl* tmc; + QActionGroup* m_ScenarioActionGroup = nullptr; + void createScenarioActionGroup(); + void selectScenario(QAction* selectedAction); + + FILE* m_hTimesFile; @@ -235,7 +239,18 @@ private: QPushButton* m_open_rgb_camera_btn; QPushButton* m_close_rgb_camera_btn; - View3D* m_view3D_tmp; + View3DPlantPhenotype* m_view3DPlantPhenotype; + View3DLinearStage* m_view3DLinearStage; + + TabManager* m_tabManager; + + QWidget* m_videoWidget; + adjustTable* m_adt; + PowerControl* m_pc; + RobotArmControl* m_rac; + OneMotorControl* m_omc; + TwoMotorControl* m_tmc; + public Q_SLOTS: void onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber); @@ -288,6 +303,7 @@ public Q_SLOTS: void recordFromRobotArm(int fileCounter); void createOneMotorScenario(); + void createPlantPhenotypeScenario(); signals: void StartFocusSignal(); void StartRecordSignal(); diff --git a/HPPA/HPPA.ui b/HPPA/HPPA.ui index be91a47..77a74a3 100644 --- a/HPPA/HPPA.ui +++ b/HPPA/HPPA.ui @@ -151,11 +151,7 @@ color:white; 搴旂敤鍦烘櫙 - - - - - + @@ -722,6 +718,9 @@ QToolBar QToolButton:hover { + + true + 瀹ゅ唴1杞寸嚎鎬у钩鍙 @@ -771,7 +770,10 @@ QToolBar QToolButton:hover { 鎷兼帴 - + + + true + 妞嶇墿琛ㄥ瀷 diff --git a/HPPA/HPPA.vcxproj b/HPPA/HPPA.vcxproj index a2fddda..a50f559 100644 --- a/HPPA/HPPA.vcxproj +++ b/HPPA/HPPA.vcxproj @@ -127,6 +127,7 @@ Create Create + @@ -176,6 +177,7 @@ + diff --git a/HPPA/HPPA.vcxproj.filters b/HPPA/HPPA.vcxproj.filters index 00de49a..fdbcceb 100644 --- a/HPPA/HPPA.vcxproj.filters +++ b/HPPA/HPPA.vcxproj.filters @@ -142,6 +142,9 @@ Source Files + + Source Files + @@ -210,6 +213,9 @@ Header Files + + Header Files + diff --git a/HPPA/OneMotorControl.cpp b/HPPA/OneMotorControl.cpp index 0d249f1..f5d0677 100644 --- a/HPPA/OneMotorControl.cpp +++ b/HPPA/OneMotorControl.cpp @@ -64,6 +64,8 @@ void OneMotorControl::display_x_loc(std::vector loc) { double tmp = round(loc[0] * 100) / 100; this->ui.realTimeLoc_lineEdit->setText(QString::number(tmp)); + + emit broadcastLocationSignal(loc); } void OneMotorControl::display_motors_connectivity(std::vector connectivity) diff --git a/HPPA/OneMotorControl.h b/HPPA/OneMotorControl.h index 7f65d9b..d336eda 100644 --- a/HPPA/OneMotorControl.h +++ b/HPPA/OneMotorControl.h @@ -55,6 +55,8 @@ signals: void sequenceComplete(); + void broadcastLocationSignal(std::vector); + private: Ui::OneMotorControl_UI ui; diff --git a/HPPA/TabManager.cpp b/HPPA/TabManager.cpp new file mode 100644 index 0000000..74b9d6e --- /dev/null +++ b/HPPA/TabManager.cpp @@ -0,0 +1,61 @@ +#include "TabManager.h" + +TabManager::TabManager(QTabWidget* tabWidget, QObject* parent) + : QObject(parent), + m_tabWidget(tabWidget) +{ + Q_ASSERT(m_tabWidget); +} + +void TabManager::hideTab(QWidget* page) +{ + if (!page || !m_tabWidget) + return; + + int index = m_tabWidget->indexOf(page); + if (index == -1) + return; + + if (m_hiddenTabs.contains(page)) + return; + + TabInfo info; + info.index = index; + info.text = m_tabWidget->tabText(index); + info.icon = m_tabWidget->tabIcon(index); + info.toolTip = m_tabWidget->tabToolTip(index); + + m_hiddenTabs.insert(page, info); + + // 如果隐藏的是当前页,先切换,避免空白 + if (m_tabWidget->currentIndex() == index) + { + int next = (index > 0) ? index - 1 : 0; + m_tabWidget->setCurrentIndex(next); + } + + m_tabWidget->removeTab(index); + emit tabHidden(page); +} + +void TabManager::showTab(QWidget* page) +{ + if (!page || !m_tabWidget) + return; + + if (!m_hiddenTabs.contains(page)) + return; + + TabInfo info = m_hiddenTabs.take(page); + + int insertIndex = qMin(info.index, m_tabWidget->count()); + m_tabWidget->insertTab(insertIndex, page, info.icon, info.text); + m_tabWidget->setTabToolTip(insertIndex, info.toolTip); + + emit tabShown(page); +} + +bool TabManager::isHidden(QWidget* page) const +{ + return m_hiddenTabs.contains(page); +} diff --git a/HPPA/TabManager.h b/HPPA/TabManager.h new file mode 100644 index 0000000..22ad759 --- /dev/null +++ b/HPPA/TabManager.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include + +class TabManager : public QObject +{ + Q_OBJECT +public: + explicit TabManager(QTabWidget* tabWidget, QObject* parent = nullptr); + + void hideTab(QWidget* page); + void showTab(QWidget* page); + bool isHidden(QWidget* page) const; + +signals: + void tabHidden(QWidget* page); + void tabShown(QWidget* page); + +private: + struct TabInfo + { + int index; + QString text; + QIcon icon; + QString toolTip; + }; + + QTabWidget* m_tabWidget = nullptr; + QHash m_hiddenTabs; +}; diff --git a/HPPA/View3D.cpp b/HPPA/View3D.cpp index 3c920c1..c2a27f5 100644 --- a/HPPA/View3D.cpp +++ b/HPPA/View3D.cpp @@ -8,7 +8,7 @@ #include #include -View3D::View3D(const QString& baseModelPath, +View3DBase::View3DBase(const QString& baseModelPath, const QString& armModelPath, QWidget* parent) : QWidget(parent), @@ -47,7 +47,19 @@ View3D::View3D(const QString& baseModelPath, // }); } -void View3D::initScene() +void View3DBase::setViewCenter(float x, float y, float z) +{ + m_viewCenter.setX(x); + m_viewCenter.setY(y); + m_viewCenter.setZ(z); +} + +void View3DBase::setDistance(float distance) +{ + m_distance = distance; +} + +void View3DBase::initScene() { // ===== 鍒涘缓 base 鏍硅妭鐐 ===== auto* baseModel = new Qt3DCore::QEntity(m_rootEntity); @@ -55,7 +67,7 @@ void View3D::initScene() baseLoader->setSource(QUrl::fromLocalFile(m_baseModelPath)); //connect(baseLoader, &Qt3DRender::QSceneLoader::statusChanged, - // this, &View3D::onSceneLoaderStatusChanged); + // this, &View3DBase::onSceneLoaderStatusChanged); m_baseTransform = new Qt3DCore::QTransform(); @@ -88,7 +100,7 @@ void View3D::initScene() qDebug() << m_armTransform->matrix(); } -void View3D::createAxes() +void View3DBase::createAxes() { // 鍙傛暟 float axisLength = 500.0f; @@ -154,7 +166,7 @@ void View3D::createAxes() zAxis->addComponent(zMat); } -void View3D::initCamera() +void View3DBase::initCamera() { m_camera = m_view->camera(); // 16:10 鍋囪绐楀彛姣斾緥锛屽悗缁 resize 鏃剁浉鏈洪忚浼氫繚鎸 @@ -162,7 +174,7 @@ void View3D::initCamera() updateCameraPosition(); } -void View3D::updateCameraPosition() +void View3DBase::updateCameraPosition() { float yaw = qDegreesToRadians(m_yawDeg); float pitch = qDegreesToRadians(m_pitchDeg); @@ -176,7 +188,7 @@ void View3D::updateCameraPosition() m_camera->setViewCenter(m_viewCenter); } -void View3D::showEvent(QShowEvent* event) +void View3DBase::showEvent(QShowEvent* event) { QWidget::showEvent(event); @@ -194,7 +206,7 @@ void View3D::showEvent(QShowEvent* event) } } -bool View3D::eventFilter(QObject* obj, QEvent* event) +bool View3DBase::eventFilter(QObject* obj, QEvent* event) { if (obj == m_view) { @@ -282,11 +294,29 @@ bool View3D::eventFilter(QObject* obj, QEvent* event) return QWidget::eventFilter(obj, event); } -void View3D::setLoc(std::vector loc) +View3DPlantPhenotype::View3DPlantPhenotype(const QString& baseModelPath, const QString& armModelPath, QWidget* parent) +:View3DBase(baseModelPath, armModelPath, parent) +{ + +} + +void View3DPlantPhenotype::setLoc(std::vector loc) { double x = round(loc[0] * 100) / 100; double y = round(loc[1] * 100) / 100; - m_armTransform->setTranslation(QVector3D(x, y, 0)); } + +View3DLinearStage::View3DLinearStage(const QString& baseModelPath, const QString& armModelPath, QWidget* parent) + :View3DBase(baseModelPath, armModelPath, parent) +{ + +} + +void View3DLinearStage::setLoc(std::vector loc) +{ + double x = round(loc[0] * 100) / 100; + + m_armTransform->setTranslation(QVector3D(x, 0, 0)); +} \ No newline at end of file diff --git a/HPPA/View3D.h b/HPPA/View3D.h index 20e66ae..9904395 100644 --- a/HPPA/View3D.h +++ b/HPPA/View3D.h @@ -17,25 +17,25 @@ #include #include -class View3D : public QWidget +class View3DBase : public QWidget { Q_OBJECT public: - explicit View3D(const QString& baseModelPath, + explicit View3DBase(const QString& baseModelPath, const QString& armModelPath, QWidget* parent = nullptr); + void setViewCenter(float x, float y, float z); + void setDistance(float distance); protected: void showEvent(QShowEvent* event) override; bool eventFilter(QObject* obj, QEvent* event) override; -private: void initScene(); void initCamera(); void updateCameraPosition(); void createAxes(); -private: QString m_baseModelPath; QString m_armModelPath; @@ -67,8 +67,43 @@ private: Qt3DCore::QTransform* m_baseRootTransform = nullptr; Qt3DCore::QTransform* m_armRootTransform = nullptr; +public Q_SLOTS: + virtual void setLoc(std::vector loc) = 0; +}; + +class View3DPlantPhenotype : public View3DBase +{ + Q_OBJECT +public: + View3DPlantPhenotype(const QString& baseModelPath, + const QString& armModelPath, + QWidget* parent = nullptr); + +protected: + +private: + +private: + public Q_SLOTS: void setLoc(std::vector loc); }; +class View3DLinearStage : public View3DBase +{ + Q_OBJECT +public: + View3DLinearStage(const QString& baseModelPath, + const QString& armModelPath, + QWidget* parent = nullptr); + +protected: + +private: + +private: + +public Q_SLOTS: + void setLoc(std::vector loc); +}; #endif // VIEW3D_H diff --git a/HPPA/twoMotorControl.ui b/HPPA/twoMotorControl.ui index d08a105..c29a6f2 100644 --- a/HPPA/twoMotorControl.ui +++ b/HPPA/twoMotorControl.ui @@ -7,7 +7,7 @@ 0 0 684 - 799 + 741 @@ -43,14 +43,14 @@ 0 0 684 - 799 + 741 - + 0 0 @@ -58,7 +58,7 @@ 16777215 - 150 + 180 @@ -105,7 +105,7 @@ - + 0 0 @@ -131,7 +131,7 @@ - + 0 0 @@ -144,7 +144,7 @@ - + 0 0 @@ -170,7 +170,7 @@ - + 0 0 @@ -183,7 +183,7 @@ - + 0 0 @@ -209,7 +209,7 @@ - + 0 0 @@ -235,7 +235,7 @@ - + 0 0